Modbus 串口通讯程序 源代码 (modbus_comm_load)

串口通讯程序

本文提供了一个使用 C/C++编写的 Modbus 串口通信程序的完整源代码。该程序支持 Modbus/RTU 和 Modbus/ASCII 协议,并提供了用于读取和写入寄存器的函数。

源代码

include <stdio.h>
include <stdlib.h>
include <string.h>include <termios.h>
include <fcntl.h>
include <unistd.h>include <modbus.h>// 定义 Modbus 请求类型
define MODBUS_READ_COILS           0x01
define MODBUS_READ_DISCRETE_INPUTS 0x02
define MODBUS_READ_HOLDING_REGISTERS 0x03
define MODBUS_READ_INPUT_REGISTERS  0x04
define MODBUS_WRITE_SINGLE_COIL     0x05
define MODBUS_WRITE_SINGLE_REGISTER  0x06
define MODBUS_WRITE_MULTIPLE_COILS  0x0F
define MODBUS_WRITE_MULTIPLE_REGISTERS 0x10// 定义 Modbus 响应类型
define MODBUS_EXCEPTION_RESPONSE    0x80// 定义 Modbus 错误码
define MODBUS_ILLEGAL_FUNCTION    0x01
define MODBUS_ILLEGAL_DATA_ADDRESS 0x02
define MODBUS_ILLEGAL_DATA_VALUE   0x03
define MODBUS_SLAVE_DEVICE_FAILURE 0x04
define MODBUS_ACKNOWLEDGE           0x05
define MODBUS_SLAVE_DEVICE_BUSY    0x06// 定义 Modbus 串口通信参数
define MODBUS_BAUD_RATE    9600
define: %s\n", modbus_strerror(errno));free(response);return -1;}// 返回成功状态return 0;
}// 处理 Modbus 响应
int process_modbus_response(uint8_t response, size_t response_len) {// 检查 Modbus 响应类型if ((response[0] & MODBUS_EXCEPTION_RESPONSE) != 0) {// 是异常响应fprintf(stderr, "收到 Modbus 异常响应: %02X\n", response[1]);return -1;}// 解析 Modbus 响应数据switch (response[0] & 0x7F) {case MODBUS_READ_COILS:case MODBUS_READ_DISCRETE_INPUTS:// 读线圈/离散输入响应for (int i = 0; i < response_len - 2; i++) {for (int j = 0; j < 8; j++) {printf("%d ", (response[2 + i] >> j) & 0x01);}}printf("\n");break;case MODBUS_READ_HOLDING_REGISTERS:case MODBUS_READ_INPUT_REGISTERS:// 读保持寄存器/输入寄存器响应for (int i = 0; i < (response_len - 2) / 2; i++) {printf("%d ", (response[2 + i  2] << 8) | response[2 + i  2 + 1]);}printf("\n");break;default:// 未知 Modbus 响应类型fprintf(stderr, "未知 Modbus 响应类型: %02X\n", response[0] & 0x7F);return -1;}// 返回成功状态return 0;
}// 主程序
int main() {// 打开 Modbus 串口if (open_modbus_port() != 0) {return -1;}// 发送 Modbus 读保持寄存器请求uint8_t request[] = {0x01, // 从机地址MODBUS_READ_HOLDING_REGISTERS, // 请求类型0x00, 0x00, // 起始地址0x00, 0x01 // 寄存器数量};uint8_t response;size_t response_len;if (send_modbus_request(request, sizeof(request), &response, &response_len) != 0) {close_modbus_port();return -1;}// 处理 Modbus 响应if (process_modbus_response(response, response_len) != 0) {close_modbus_port();return -1;}// 关闭 Modbus 串口close_modbus_port();return 0;
}

如何使用

要使用这个源代码,请按照以下步骤操作:

  1. 将源代码保存到一个文件中,例如 modbus_comm_load.c
  2. 使用 C/C++ 编译器编译源代码,例如: gcc modbus_comm_load.c -o modbus_comm_load
  3. 运行编译后的程序,例如: ./modbus_comm_load

该程序将连接到指定的 Modbus 串口并发送读取保持寄存器请求。它将打印接收到的保持寄存器值。

免责声明

本源代码仅供参考之用。对于因使用本源代码而造成的任何直接或间接损失或损害,作者不承担任何责任。

本文原创来源:电气TV网,欢迎收藏本网址,收藏不迷路哦!

相关阅读

添加新评论