首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++串行通信linux 9数据位

c++串行通信linux 9数据位
EN

Stack Overflow用户
提问于 2011-10-26 16:59:33
回答 2查看 4.8K关注 0票数 2

有点奇怪的问题: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中可能不提供支持的话:

代码语言:javascript
复制
    # define CMSPAR   010000000000      /* mark or space (stick) parity */

以及发送带有标记或空间奇偶校验的代码。模拟9位数据位

代码语言:javascript
复制
   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

EN

回答 2

Stack Overflow用户

发布于 2011-10-26 17:20:50

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

票数 1
EN

Stack Overflow用户

发布于 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’。在工作配置上也验证了这一点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7906151

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档