#include<iostream>#include<thread>#include<csignal>#include<unistd.h>#include<modbus/modbus.h>using namespace std;static int running_maincondition = 1;static int running_modbuscondition = 1;voidsignal_handler(int signum){ if (signum == SIGINT) { std::cout << "\n收到 Ctrl+C,准备退出..." << std::endl; running_maincondition = 0; running_modbuscondition = 0; }}staticvoidth_func_sreialmodbus(){ // 1. 创建 Modbus RTU 上下文 // 参数:串口设备路径,波特率,校验位,数据位,停止位 // 校验位:'N'=无校验,'E'=偶校验,'O'=奇校验 modbus_t* ctx = modbus_new_rtu("/dev/ttyAS3", 9600, 'N', 8, 1); if (ctx == nullptr) { std::cerr << "无法创建 Modbus RTU 上下文" << std::endl; return ; } // 2. 设置从站地址(Slave Address = 01) int slave_id = 1; if (modbus_set_slave(ctx, slave_id) == -1) { std::cerr << "设置从站地址失败" << std::endl; modbus_free(ctx); return; } // 3. 连接 Modbus 设备 if (modbus_connect(ctx) == -1) { std::cerr << "连接 Modbus 设备失败: " << modbus_strerror(errno) << std::endl; modbus_free(ctx); return; } // 可选:开启调试输出,便于排查问题 // modbus_set_debug(ctx, TRUE); std::cout << "成功连接到 Modbus 从站设备,地址: " << slave_id << std::endl; // 4. 读取输入寄存器(Input Register) // 起始地址: 0x0000,读取1个寄存器,使用功能码 0x04 uint16_t regT_value[1] = {0}; // 存储1个寄存器的值(16位) // int rt = modbus_read_input_registers(ctx, 0x0000, 1, regT_value);//0x04 int rt = modbus_read_registers(ctx, 0x0000, 1, regT_value);//0x03 if (rt == -1) { std::cerr << "读取输入寄存器失败: " << modbus_strerror(errno) << std::endl; modbus_close(ctx); modbus_free(ctx); return; } // 5. 输出读取结果 std::cout << "读取成功!共读取 " << rt << " 个寄存器" << std::endl; std::cout << "寄存器地址 0x0000 的值: "<<regT_value[0]<<"(0x"<<std::hex<<regT_value[0]<< std::dec<<")"<< std::endl; uint16_t regH_value[1] = {0}; // 存储1个寄存器的值(16位 // int rh = modbus_read_input_registers(ctx, 0x0001, 1, regH_value);//0x04 int rh = modbus_read_registers(ctx, 0x0001, 1, regH_value);//0x03 if (rh == -1) { std::cerr << "读取输入寄存器失败: " << modbus_strerror(errno) << std::endl; modbus_close(ctx); modbus_free(ctx); return; } // 5. 输出读取结果 std::cout << "读取成功!共读取 " << rh << " 个寄存器" << std::endl; std::cout << "寄存器地址 0x0001 的值: "<<regH_value[0]<<"(0x"<<std::hex<<regH_value[0]<< std::dec<<")"<< std::endl; usleep(500000); while (running_modbuscondition) { // rt = modbus_read_input_registers(ctx, 0x0000, 1, regT_value);//0x04 rt = modbus_read_registers(ctx, 0x0000, 1, regT_value);//0x03 if (rt == -1) { std::cerr << "读取输入寄存器失败: " << modbus_strerror(errno) << std::endl; modbus_close(ctx); modbus_free(ctx); return; } // 5. 输出读取结果 std::cout << "读取温度成功!共读取 " << rt << " 个寄存器" << std::endl; std::cout << "寄存器地址 0x0000 的值: "<<regT_value[0]<<"(0x"<<std::hex<<regT_value[0]<< std::dec<<")"<< std::endl; // rh = modbus_read_input_registers(ctx, 0x0001, 1, regH_value);//0x04 rh = modbus_read_registers(ctx, 0x0001, 1, regH_value);//0x03 if (rh == -1) { std::cerr << "读取输入寄存器失败: " << modbus_strerror(errno) << std::endl; modbus_close(ctx); modbus_free(ctx); return; } // 5. 输出读取结果 std::cout << "读取湿度成功!共读取 " << rh << " 个寄存器" << std::endl; std::cout << "寄存器地址 0x0001 的值: "<<regH_value[0]<<"(0x"<<std::hex<<regH_value[0]<< std::dec<<")"<< std::endl; std::cout << " "<<endl; usleep(500000); }}intmain(){ cout << "Hello Serial Modbus !" << endl; struct sigaction sa; sa.sa_handler = signal_handler; sigemptyset(&sa.sa_mask); sa.sa_flags = 0; // 注册 SIGINT 处理函数 if (sigaction(SIGINT, &sa, nullptr) == -1) { perror("sigaction"); return 1; } thread *ptr_thread_serialmodbus = nullptr; ptr_thread_serialmodbus = new thread(th_func_sreialmodbus); if(ptr_thread_serialmodbus != nullptr) { cout << "thread running ..."<<endl; } else { cout << "thread error.stoped !"<<endl; ptr_thread_serialmodbus->join(); delete ptr_thread_serialmodbus; ptr_thread_serialmodbus = nullptr; } while (running_maincondition) { sleep(1); } cout << "main stoped , waiting ptr_thread_serialmodbus stop ... "<<endl; ptr_thread_serialmodbus->join(); cout << "All stoped , good bye ! "<<endl; return 0;}