【问题标题】:Reading raw bytes from a serial port从串行端口读取原始字节
【发布时间】:2011-12-22 15:49:16
【问题描述】:

我正在尝试从 IEC 870-5-101 win32 协议模拟器发送的串行端口读取原始字节,该模拟器使用在 Linux 32 位上运行的 C 语言编写的程序。

对于像 0x00 - 0x7F 这样的字节值,它工作正常。但是对于从 0x80 到 0xAF 开始的值,高位是错误的,例如:

0x7F -> 0x7F //correct
0x18 -> 0x18 //correct
0x79 -> 0x79 //correct
0x80 -> 0x00 //wrong
0xAF -> 0x2F //wrong
0xFF -> 0x7F //wrong

现在挖了两天,不知道是什么原因造成的。

这是我的串口配置:

    cfsetispeed(&config, B9600);
    cfsetospeed(&config, B9600);

    config.c_cflag |= (CLOCAL | CREAD);

    config.c_cflag &= ~CSIZE;                               /* Mask the character size bits */
    config.c_cflag |= (PARENB | CS8);                       /* Parity bit Select 8 data bits */

    config.c_cflag &= ~(PARODD | CSTOPB);                   /* even parity, 1 stop bit */


    config.c_cflag |= CRTSCTS;                              /*enable RTS/CTS flow control - linux only supports rts/cts*/


    config.c_iflag &= ~(IXON | IXOFF | IXANY);              /*disable software flow control*/ 

    config.c_oflag &= ~OPOST;                               /* enable raw output */
    config.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);      /* enable raw input */

    config.c_iflag &= ~(INPCK | PARMRK);                    /* DANGEROUS no parity check*/
    config.c_iflag |= ISTRIP;                               /* strip parity bits */
    config.c_iflag |= IGNPAR;                               /* DANGEROUS ignore parity errors*/

    config.c_cc[VTIME] = 1;                                 /*timeout to read a character in tenth of a second*/

我正在从串口读取数据:

*bytesread = read((int) fd, in_buf, BytesToRead);

在这个操作之后“in_buf”包含错误的字节,所以我猜我的配置有问题,这是一个来自 win32 DCB 结构的端口。

感谢您的任何想法!

【问题讨论】:

  • 我注意到您说“第二个 4 位是错误的……”但您的数据似乎只显示高位正在被清除。 (&0x7f)
  • 我对命名约定有点困惑。当然,高位是错误的。谢谢你的澄清。

标签: c linux serial-port posix


【解决方案1】:

根据您的示例,只有第 8 位(高位)是错误的,并且始终为 0 是错误的。您在 Linux 端的线路规则中设置了 ISTRIP,这会导致这种情况。正如 C 代码中的注释所声称的那样,ISTRIP 不会剥离奇偶校验位。它会剥离第 8 个数据位。

如果设置了 ISTRIP,则应首先将有效输入字节剥离为 7 位;否则,应处理所有 8 位。 IEEE Std 1003.1, 2004 Edition, chapter 11, General Terminal Interface

【讨论】:

  • 感谢您提供有关 8E1 的信息。从来不知道。
  • 爱上那些误导性的 cmets。
  • 这个也咬了我一口。不是因为 cmets(我从未见过)是错误的,而是因为它显然是默认值,而且我在我看到的文档中根本没有看到任何提到这个标志的内容。谢谢!
  • 我的坏。它可能是也可能不是默认值,但已在代码中设置,这是根据不正确的文档。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-21
  • 1970-01-01
相关资源
最近更新 更多