c ++串口通讯linux 9data位

时间:2011-10-26 16:59:34

标签: linux serial-port 9-bit-serial

有点奇特的问题:D

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

有些驱动程序在某些uart芯片上支持9个数据位,但大部分都不支持。

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

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

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

最后我的问题是:

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

示例FOR ALL不知道如何:

首先检查这是否已定义,如果在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 Serial帮助中所述

  

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

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

谢谢:D

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

我遇到了在Linux客户操作系统中运行的同样问题。在Linux作为主机操作系统的另一台机器上运行相同的程序。我怀疑虚拟串口没有传递奇偶校验错误。见PARMRK termios behavior not working on Linux。 VM仍然可能不是问题,因为它是一台完全不同的计算机。然而,我能够使用Windows中的Realterm(Linux作为访客的计算机上的主机操作系统)获得奇偶校验错误。

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