【问题标题】:Add to QByteArray with 1 byte the 9-th bit将第 9 位添加到 1 字节的 QByteArray
【发布时间】:2013-11-16 09:40:56
【问题描述】:

当我从 COM 端口读取 QByteArray 类型的对象中的字节流后,我现在遇到一种情况,并且只有 1 个字节的数据。但是一个非常不友好的协议需要从 COM 端口读取数据后有 9 位数据。

但根据win32API函数:ReadFile(....)我只能从COM流中读取字节= 1,2,3.....

所以 - 这就是为什么我在这个函数的帮助下只读取 8 位 = 1 个字节,并且在一些奇偶校验位操作的帮助下,我正在计算广义数据的第 9 位的值...

所以一方面我有 1 个字节(8 位)的正确(真实)数据 - 另一方面我有第 9 位的值(0 或 1); 2 对象总之必须创造广义数据的价值。 如何将这些对象组合成一个最终的QByteArray 对象?因为全局函数ReadComData 可以而且必须只返回QByteArray 对象。

【问题讨论】:

  • 我不确定我是否理解正确。如果您的 COM 端口中只有 9 位数据,您似乎根本无法读取它们。但如果端口中有许多 9 位项,则可以将它们读入 QByteArray。它将包含所有数据,但很难访问每个 9 位项目,因为项目在两个字节之间共享并且未对齐。这是你的问题吗?
  • he-he)) 我可以通过函数 ReadFile() 读取 9 位数据 - 像往常一样 8 位。我可以从奇偶校验位中获得第 9 位。所以 - 不要在黑盒子里找到黑猫,尤其是在根本没有猫的时候))。问题是关于将包含 8 位 = 1 字节的 QByteArray 对象与独立的数据位 - 0 或 1 相结合的能力。那么 - 如何做到这一点?如何编写操作 QByteArray = QByteArray+BitOfData.

标签: qt qbytearray


【解决方案1】:

UART 不能“写入”9 位数据。在网络上,您的(通常为 8 位)数据通常在起始位和停止位之间进行帧化,因此您发送的每个字节都有 10 位传输。如果您有奇偶校验位,它会在最后一个数据位之后但在停止位之前传输。但这是由发送 UART 生成的,而不是协议的一部分。典型 UART 16550 的数据总线只有 8 位宽(您实际上可以发送 5 位、6 位、7 位或 8 位数据)。

在接收端,必须根据线路上的内容配置 UART。如果您的发送方使用奇偶校验位,那么您相应地对 UART 进行编程(通过“COM”端口设置)。奇偶校验位只是为了帮助检查线路上的错误。它基于数据位——您不能将另一个数据位放入奇偶校验位。接收 UART 可用于检查奇偶校验错误(通过线路状态寄存器 (LSR) 读取),这可以通过系统调用传递给您。

您的协议可能会将数据拆分为多个字节。如果是这种情况,则将两个字节转换为一个 16 位字并屏蔽您不想使用的 6 位。

【讨论】:

  • 否 - mdb 协议(自动售货机)使用真正的 9 位,我可以使用奇偶校验位来虚拟化发送数据帧的“非真实”9 位。谷歌可以向你展示这些技术......所以问题只是将 8 位真实数据与第 9 位模式位的值组合成一个单独的 QByteArray 对象......
  • @graphElem:我不明白你为什么要使用 QByteArray(一个 8 位数据的容器)来处理 9 位数据。使用 16 位单词和一点点抨击来获得你想要的。
  • 因为全局函数 'ReadComData' 确实返回了读取 COM 端口流的结果,这是在我当前任务之前创建的。因此,在我们的大量代码中,该函数的所有入口点都期望获得 qbytearray 对象作为从 COM 端口读取数据的结果。直到现在我们才发现,在 COM 流中不仅可以找到 8 位。这就是为什么现在我们正在寻找如何将 8 位数据与第 9 位模式相结合的想法......并将其放入 qbytearray......
猜你喜欢
  • 2012-12-01
  • 2017-12-18
  • 2015-08-19
  • 2011-06-27
  • 2014-04-25
  • 2010-09-29
  • 2019-04-19
  • 2010-09-05
  • 1970-01-01
相关资源
最近更新 更多