2

有点异国情调的问题:D

我正在 ubuntu 10 中编写 c++,我需要编写一个 mdb(多点总线)协议,该协议在串行通信中使用 9 个数据位(是 9 个数据位:D)

某些驱动程序在某些 uart 芯片上确实支持 9 个数据位,但大多数情况下它们不支持。

简单解释一下:mdb 使用 8 个数据位作为数据,第 9 个数据位作为模式集。因此,当主机发送第一个 BYTE 时,它将 mode=9thbit 设置为 1,这意味着总线上的所有设备都被中断并正在寻找保存设备地址的第一个字节。如果监听设备(其中一个)在第一个字节中找到它的地址,它就知道接下来的字节将是它的数据字节。数据字节的位 9 = 模式位设置为 0

以位为单位的示例:000001011 000000010 000000100 000000110(第一个字节地址和 3 个数据字节)

从机 -> 主机模式位的返回情况用于传输结束。所以主机从串行读取这么长时间,直到它找到一个第 9 位 = 1 的 9 位数据包,通常最后的 9 位序列是一个 chk 字节 + 模式 = 1

所以最后我的问题:

我知道如何在 termios 中使用 CMPAR 标志来使用奇偶校验位作为模式位,例如。将其设置为 MARK(1) 或 SPACE(0)

适用于所有不知道如何操作的示例:

首先检查是否在 termios 中可能不支持这是否已定义:

    # define CMSPAR   010000000000      /* mark or space (stick) parity */

以及使用标记或空间奇偶校验发送的代码,例如。模拟第 9 个数据位

   struct termios tio;
    bzero(&tio, sizeof(tio));
    tcgetattr(portFileDescriptor, &tio);

    if(useMarkParity)
    {
            // Send with mark parity
            tio.c_cflag |= PARENB | CMSPAR | PARODD;
            tcsetattr(portFileDescriptor, TCSADRAIN, &tio);

    }
    else
    {
            // Send  with space parity
            tio.c_cflag |= PARENB | CMSPAR;
            tio.c_cflag &= ~PARODD;
            tcsetattr(portFileDescriptor, TCSADRAIN, &tio);
    }
    write(portFileDescriptor,DATA, DATALEN);

现在我不知道如何在接收时设置奇偶校验检查,我已经尝试了几乎所有的组合,但我无法得到那个错误奇偶校验字节序列。

谁能帮助我如何在接收时设置奇偶校验检查,它不会忽略奇偶校验并且不会删除字节,但它会在“坏”接收字节之前添加 DEL:

正如它在 POSIX 串行帮助中所说

INPCK 和 PARMRK 如果启用 IGNPAR,NUL 字符(八进制 000)会在每个带有奇偶校验错误的字符之前发送到您的程序。否则,一个 DEL(八进制 177)和 NUL 字符与坏字符一起发送。

那么如何正确设置 PARMRK 和 INPCK 它将检测模式位 = 1 作为奇偶校验位错误并在返回流中插入 DEL 177 八进制。

谢谢 :D

4

2 回答 2

1

在我看来,您想在接收器上设置空间奇偶校验并且不启用 IGNPAR。这样,当接收到带有标记奇偶校验的字节时,它应该使用 DEL 生成奇偶校验错误。

于 2011-10-26T17:20:50.537 回答
0

我在 Linux 来宾操作系统中运行时遇到了同样的问题。在另一台使用 Linux 作为主机操作系统的机器上运行相同的程序。我怀疑虚拟串口没有传递奇偶校验错误。请参阅PARMRK termios 行为在 Linux 上不起作用。VM 仍然可能不是问题,因为它是一台完全不同的计算机。但是,我能够在 Windows 中使用 Realterm(Linux 是来宾计算机上的主机操作系统)得到奇偶校验错误。

另外,请注意 n_tty.c 中的代码显示它插入了 '\377' '\0' 而不是 '\177' '\0'。这也在工作配置上得到了验证。

于 2013-11-25T16:20:19.727 回答