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

101*_*010 1 c++ unix linux 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" );
    }
}
Run Code Online (Sandbox Code Playgroud)

Joh*_*ger 5

编辑我刚看到这个问题.你有线

tty.c_iflag |= (INPCK | ISTRIP);
Run Code Online (Sandbox Code Playgroud)

ISTRIP意思是"剥掉第八位".你需要

tty.c_iflag |= INPCK;
Run Code Online (Sandbox Code Playgroud)

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


你启用了EVEN奇偶校验

tty.c_cflag |= PARENB;
tty.c_cflag &= ~PARODD;
Run Code Online (Sandbox Code Playgroud)

以及8位字节

tty.c_cflag &= ~CSIZE;
tty.c_cflag |= CS8;
Run Code Online (Sandbox Code Playgroud)

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

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

tty.c_cflag &= ~PARENB;
Run Code Online (Sandbox Code Playgroud)

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