Connection failed:Too many open files modbus_connect failed

在与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);  
}

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
(failed)net::ERR_TOO_MANY_REDIRECTS是一个错误提示,表示网页发生了太多的重定向。重定向是指服务器将用户的请求转发到另一个页面或URL。而当重定向次数过多时,就会触发这个错误。 这种错误通常是由于网页或服务器配置不正确引起的。可能的原因包括: 1. 服务器上的重定向规则设置错误。 2. 网页中的重定向代码有问题。 3. 浏览器缓存中的重定向信息导致循环重定向。 解决这个问题的方法有: 1. 清除浏览器缓存。可以尝试清除浏览器的缓存和Cookie,然后重新加载网页。 2. 检查网页代码或服务器配置。查看网页中是否有错误的重定向代码,或者联系网站管理员检查服务器配置是否正确。 3. 使用其他浏览器或设备访问网页。有时候这个问题可能与特定的浏览器或设备有关,尝试使用其他浏览器或设备来访问网页看看是否仍然出现错误。 希望以上信息对您有所帮助。<span class="em">1</span><span class="em">2</span> #### 引用[.reference_title] - *1* [解决vue net :ERR_CONNECTION_REFUSED报错问题](https://download.csdn.net/download/weixin_38697274/12924077)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [关于网站ERR_TOO_MANY_REDIRECTS错误的修改办法](https://blog.csdn.net/u011344153/article/details/125341702)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值