串口:来自设备的字节都有最高有效位= 0

时间:2016-06-15 13:18:07

标签: c++ linux unix serial-port

请问我有什么问题 - 我通过串口向设备发送命令(字节序列,包括最高有效位(MSB)= 1的字节),设备成功识别命令(所以看起来所有字节都是发送正确)并回答几乎正确的答案。 “几乎”在这里意味着答案是正确的,除了所有字节都有零MSB(而其中一些必须有MSB = 1)。 我在VirtualBox上使用Ubuntu 16,在主机操作系统上使用Windows 7,在FTDI芯片上使用串行端口作为USB设备 这是我的串口设置:

void com::open()
{
    fd = ::open( "/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY );
    if ( fd < 0 )
    {
        throw exceptionSystem( ERROR_UNK, "Error open COM port" );
    }

    int err;
    err = fcntl(fd, F_SETFL, FNDELAY);
    if ( err == -1 )
    {
        close();
        throw exceptionSystem( ERROR_UNK, "Error fcntl" );
    }

    try{
        set();
    }catch(...){
        close();
        throw;
    }
}

void com::set()
{
    if ( fd == -1 )
        return;

    struct termios tty;
    memset( &tty, 0, sizeof( tty ) );
    if ( tcgetattr(fd, &tty) != 0 )
    {
        throw exceptionSystem( ERROR_UNK, "Error tcgetattr" );
    }

    int err;
    err = cfsetospeed( &tty, B115200 );
    if ( err != 0 )
    {
        throw exceptionSystem( ERROR_UNK, "Error fsetospeed" );
    }
    err = cfsetispeed( &tty, B115200 );
    if ( err != 0 )
    {
        throw exceptionSystem( ERROR_UNK, "Error cfsetispeed" );
    }

    tty.c_cflag &= ~CSIZE;
    tty.c_cflag |= CS8;
    tty.c_cflag |= PARENB;
    tty.c_cflag &= ~PARODD;
    tty.c_cflag &= ~CSTOPB;
    tty.c_cflag |= CLOCAL;
    tty.c_cflag |= CREAD;
    tty.c_cflag &= ~CRTSCTS;

    tty.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);

    tty.c_iflag |= (INPCK | ISTRIP);
    tty.c_iflag &= ~IGNPAR;
    tty.c_iflag &= ~PARMRK;
    tty.c_iflag &= ~(IXON | IXOFF | IXANY);

    tty.c_oflag &= ~OPOST;

    tty.c_cc[VMIN]  = 0;
    tty.c_cc[VTIME] = 0;

    if ( tcsetattr( fd, TCSANOW, &tty ) != 0 )
    {
        throw exceptionSystem( ERROR_UNK, "Error tcsetattr" );
    }
}

1 个答案:

答案 0 :(得分:5)

编辑我刚看到问题所在。你有这条线

tty.c_iflag |= (INPCK | ISTRIP);

ISTRIP表示&#34;剥离第8位&#34;。你需要

tty.c_iflag |= INPCK;

简单地启用输入奇偶校验。

您已启用EVEN奇偶校验

tty.c_cflag |= PARENB;
tty.c_cflag &= ~PARODD;

以及8位字节

tty.c_cflag &= ~CSIZE;
tty.c_cflag |= CS8;

这样一个起始位,8个数据位,1个奇偶校验位和1个停止位。我不确定FTDI芯片可以处理所有这些!

如果您不想要奇偶校验,请使用

tty.c_cflag &= ~PARENB;

如果我对FTDI芯片进行了诽谤,我道歉 - 在这种情况下你确定另一端配置方式相同吗?与8E17E1

相比,8N1并不常见