![串口通讯程序](https://uploads-ssl.webflow.com/63dea6cb95e58cb38bb98cbd/6415d9f6b5ad31126eeb0b24_6261119adb73406cc2d95e91_XaSgrEy6x7WhXdnDgneO71Qot2YJQkfveqCE3sAztcxhcfRGxAUpbrugWUGllbhfiIG5SildPAjH2gAk47RQ8goL9x_fqPp0iiRGNus2KHDvINq5cQLc1WC8pMstTXLsYd00Yq2x.jpeg)
本文提供了一个使用 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; }
如何使用
要使用这个源代码,请按照以下步骤操作:
-
将源代码保存到一个文件中,例如
modbus_comm_load.c
。 -
使用 C/C++ 编译器编译源代码,例如:
gcc modbus_comm_load.c -o modbus_comm_load
。 -
运行编译后的程序,例如:
./modbus_comm_load
。
该程序将连接到指定的 Modbus 串口并发送读取保持寄存器请求。它将打印接收到的保持寄存器值。
免责声明
本源代码仅供参考之用。对于因使用本源代码而造成的任何直接或间接损失或损害,作者不承担任何责任。
本文原创来源:电气TV网,欢迎收藏本网址,收藏不迷路哦!
添加新评论