有点奇怪的问题:D
我正在用ubuntu10编程c++,我需要编写一个mdb(多点总线)协议,它在串行通信中使用9个数据位(是的,9个数据位:D)。
一些驱动程序确实支持一些uart芯片上的9位数据,但大多数情况下它们不支持。
简单地解释一下: mdb使用8个数据位作为数据,第9个数据位用于模式集。因此,当主服务器发送第一个字节时,它将mode=9thbit设置为1,这意味着总线上的所有设备都被中断,并正在寻找保存设备地址的第一个字节。如果侦听设备(多个设备之一)在第一个字节中找到它的地址,它就知道下面的字节将是它的数据字节。数据字节将位9=模式位设置为0
以位为单位的示例: 000001011 000000010 000000100 000000110 (1个字节地址和3个数据字节)
从->主模式位返回的情况用于传输结束。因此,主程序从串行读取很长时间,直到找到一个9位数据包,其9位=1,最后9位序列通常是chk字节+模式=1。
所以最后我的问题是:
我知道如何在termios中使用CMPAR标志来对模式位使用奇偶校验位。将其设置为标记(1)或空格(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,则在出现奇偶校验错误的每个字符之前,都会向程序发送NUL字符(000八进制)。否则,a DEL (177个八进制)和NUL字符将与坏字符一起发送。。
因此,如何正确设置PARMRK和INPCK,以检测模式位=1为奇偶校验位错误,并在返回流中插入DEL 177八进制。
谢谢:D
发布于 2011-10-26 17:20:50
在我看来,您想要在接收器上设置空间奇偶,而不启用IGNPAR。这样,当接收到具有标记奇偶校验的字节时,它应该使用DEL生成奇偶校验错误。
发布于 2013-11-25 16:20:19
我在Linux客户操作系统中也遇到了同样的问题。在另一台机器上运行相同的程序,主机操作系统运行Linux。我怀疑虚拟串口不会传递奇偶校验错误。见PARMRK termios behavior not working on Linux。VM仍然有可能不是问题,因为它是一台完全不同的计算机。然而,我能够在Windows ( Linux是客户的计算机上的主机操作系统)中使用Realterm获得奇偶校验错误。
另外,注意n_tty.c中的代码显示它插入'\377‘'\0’而不是'\177‘'\0’。在工作配置上也验证了这一点。
https://stackoverflow.com/questions/7906151
复制相似问题