Serial port Modbus rtu设置串行模式错误

Serial port Modbus rtu设置串行模式错误,serial-port,modbus,Serial Port,Modbus,当我使用modbus\u rtu\u set\u serial\u mode时出现错误。该错误是由ioctl说bad file descriptor引发的。在谷歌搜索之后,我发现有十几个人对此有问题,但遗憾的是没有解决办法。如果你对发生的事情有一点线索,请至少给我指出正确的方向。我在Ubuntu 14.04.1 LTS中工作 #define MODBUS_RTU_RS232 0 #define MODBUS_RESPONSE_TIMEOUT_SEC 10 #define MODBUS_RESPO

当我使用
modbus\u rtu\u set\u serial\u mode
时出现错误。该错误是由
ioctl
bad file descriptor
引发的。在谷歌搜索之后,我发现有十几个人对此有问题,但遗憾的是没有解决办法。如果你对发生的事情有一点线索,请至少给我指出正确的方向。我在Ubuntu 14.04.1 LTS中工作

#define MODBUS_RTU_RS232 0
#define MODBUS_RESPONSE_TIMEOUT_SEC 10
#define MODBUS_RESPONSE_TIMEOUT_USEC 0

    //...
    std::string mode = "RTU";
    std::string port = "/dev/ttyO3";
    std::string commInterface = "RS232";
    int baudrate = 19200;    
    char parity = 'N';
    int dataBit = 8;
    int stopBit = 1; 
    int slaveAddress = 10;

    modbus_t *mb;

    //...
}

    //function calling the modbus_rtu_set_serial_mode
    //...
    if(mode = "RTU"){
       mb = modbus_new_rtu(port, baudrate, parity, dataBit, stopBit);
       if(mb == NULL)
       {
           return false;
       }
    }
    if(commInterface == "RS232"){
       if(modbus_rtu_set_serial_mode(mb, MODBUS_RTU_RS232) < 0){
           std::cout << "modbus_rtu_set_serial_mode failed, errMsg: " 
                     << modbus_strerror(errno); //Here it prints "Bad File Descriptor"
           modbus_close(mb);
           modbus_free(mb);
           return false;
       }
    }

    struct timeval old_response_timeout;
    modbus_get_response_timeout(mb, &old_response_timeout);

    struct timeval response_timeout;
    response_timeout.tv_sec = MODBUS_RESPONSE_TIMEOUT_SEC;
    response_timeout.tv_usec = MODBUS_RESPONSE_TIMEOUT_USEC;
    modbus_set_response_timeout(mb, &response_timeout);

    modbus_set_slave(mb, slaveAddress);

    int connectSlave = modbus_connect(mb);
    if (connectSlave < 0)
    {
        std::cout << "Slave error";
        modbus_close(mb);
        modbus_free(mb);
        return false;
    }    

//...
int modbus_rtu_set_serial_mode(modbus_t *ctx, int mode)
{
    if (ctx->backend->backend_type == _MODBUS_BACKEND_TYPE_RTU) {
#if HAVE_DECL_TIOCSRS485
        modbus_rtu_t *ctx_rtu = ctx->backend_data;
        struct serial_rs485 rs485conf;
        memset(&rs485conf, 0x0, sizeof(struct serial_rs485));

        if (mode == MODBUS_RTU_RS485) {
            rs485conf.flags = SER_RS485_ENABLED;
            if (ioctl(ctx->s, TIOCSRS485, &rs485conf) < 0) {
                return -1;
            }

            ctx_rtu->serial_mode |= MODBUS_RTU_RS485;
            return 0;
        } else if (mode == MODBUS_RTU_RS232) {

            if (ioctl(ctx->s, TIOCSRS485, &rs485conf) < 0) {
                return -1;
            }

            /*int status;
            status |= TIOCM_RTS;
            if (ioctl(ctx->s, TIOCMSET, &status) < 0) {
                return -1;
            }*/

            ctx_rtu->serial_mode = MODBUS_RTU_RS232;
            return 0;
        }
#else
        if (ctx->debug) {
            fprintf(stderr, "This function isn't supported on your platform\n");
        }
        errno = ENOTSUP;
        return -1;
#endif
    }

    /* Wrong backend and invalid mode specified */
    errno = EINVAL;
    return -1;
}
#定义MODBUS_RTU_RS232 0
#定义MODBUS\u响应\u超时\u第10秒
#定义MODBUS\u响应\u超时\u USEC 0
//...
std::string mode=“RTU”;
std::string port=“/dev/ttyO3”;
std::string commInterface=“RS232”;
整数波特率=19200;
字符奇偶性='N';
int-dataBit=8;
int停止位=1;
int slaveAddress=10;
modbus_t*mb;
//...
}
//调用modbus_rtu_设置_串行_模式的功能
//...
如果(模式=“RTU”){
mb=modbus_new_rtu(端口、波特率、奇偶校验、数据位、停止位);
如果(mb==NULL)
{
返回false;
}
}
如果(commInterface==“RS232”){
如果(modbus_rtu_设置_串行_模式(mb,modbus_rtu_RS232)<0){
std::cout后端_数据;
结构串行接口rs485 rs485conf;
memset(&rs485conf,0x0,sizeof(struct serial_rs485));
如果(模式==MODBUS_RTU_RS485){
rs485conf.flags=SER_RS485_已启用;
如果(ioctl(ctx->s、TIOCSRS485和rs485conf)<0){
返回-1;
}
ctx_rtu->串行模式|=MODBUS_rtu_RS485;
返回0;
}否则如果(模式==MODBUS_RTU_RS232){
如果(ioctl(ctx->s、TIOCSRS485和rs485conf)<0){
返回-1;
}
/*智力状态;
状态|=TIOCM|U RTS;
如果(ioctl(ctx->s、TIOCMSET和状态)<0){
返回-1;
}*/
ctx_rtu->串行模式=MODBUS_rtu_RS232;
返回0;
}
#否则
如果(ctx->调试){
fprintf(stderr,“您的平台不支持此功能\n”);
}
errno=ENOTSUP;
返回-1;
#恩迪夫
}
/*指定了错误的后端和无效的模式*/
errno=EINVAL;
返回-1;
}

嘿!只是想知道你是否解决了这个问题,我也有同样的问题。@Kam还没有,我们的团队已经决定忽略手头的问题。我在树莓皮下也有同样的问题。。。有什么解决办法吗@有TreetCred的人你是如何设法忽略这一点,仍然获得RS-485半双工通信的?