Modbus rtu设置串行模式错误

时间:2015-02-16 11:41:57

标签: serial-port modbus

使用modbus_rtu_set_serial_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;
    }    

//...

modbus-rtu.c文件

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;
}

0 个答案:

没有答案