在与can_bus模块进行联调时发现以下现象:
在收到数据并解析一段时间后,hmodbus程序会被杀死,需要重新执行./hmodbus启动程序,定位到可能出现的线程函数如下:
//线程1的入口函数 负责解析json,写入寄存器
void* processDataWrapper(void* arg) {
// 将传递的参数转换为正确的类型
//ThreadData* data = (ThreadData*)arg;
//设置串口信息开始
modbus_t* ctx = modbus_new_rtu("/dev/ttyS0", 115200, 'N', 8, 1);
if (ctx == NULL) {
fprintf(stderr, "Unable to allocate libmodbus context\n");
return NULL;
}
// 设置从机地址
modbus_set_slave(ctx, SERVER_ID);
// 设置485模式
modbus_rtu_set_serial_mode(ctx, MODBUS_RTU_RS485);
printf( "2222222 485\n");
//设置串口信息结束
while (1) {
// 连接设备
if (modbus_connect(ctx) == -1) {
fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno));
modbus_free(ctx);
printf( "modbus_connect failed\n");
return NULL;
}
convertMachineInfoToArray(machineInfo,infoArray);
writeModbusRegisters(ctx,0, infoArray, 23);
usleep(500000);
}
modbus_close(ctx);
modbus_free(ctx);
}
原因:出现"Connection failed: Too many open files"错误通常是由于打开的文件描述符数量超过了系统的限制引起的。每个进程在运行时都有一个限制,表示它可以同时打开的文件描述符的数量。当打开的文件描述符数量超过限制时,系统会拒绝进一步的打开操作,导致连接失败。
解决措施:firstly,把连接部分代码放到循环外,secondly,把关闭modbus连接以及释放资源放到循环外,
修改以后的代码如下:
//线程1的入口函数 负责解析json,写入寄存器
void* processDataWrapper(void* arg) {
//设置串口信息开始
ctx = modbus_new_rtu("/dev/ttyS0", 115200, 'N', 8, 1);
if (ctx == NULL) {
fprintf(stderr, "Unable to allocate libmodbus context\n");
return NULL;
}
// 设置从机地址
modbus_set_slave(ctx, SERVER_ID);
// 设置485模式
modbus_rtu_set_serial_mode(ctx, MODBUS_RTU_RS485);
//设置串口信息结束
// 连接设备
if (modbus_connect(ctx) == -1) {
fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno));
modbus_free(ctx);
printf( "modbus_connect failed\n");
return NULL;
}
while (1) {
convertMachineInfoToArray(machineInfo,infoArray);
writeModbusRegisters(ctx,0, infoArray, 23);
//modbus_close(ctx);
//modbus_free(ctx);
usleep(500000);
}
modbus_close(ctx);
modbus_free(ctx);
}