问题标签 [9-bit-serial]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
6 回答
10768 浏览

linux - 是否可以在 Linux 中使用 9 位串行通信?

RS-232 通信有时使用 9 位字节。这可用于与总线上的多个微控制器通信,其中 8 位是数据,额外的位表示地址字节(而不是数据)。非活动控制器只为地址字节生成中断。

Linux 程序可以通过串行设备发送和接收 9 位字节吗?如何?

0 投票
2 回答
4688 浏览

linux - c++串口通信linux 9data bits

有点异国情调的问题: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 中可能不支持这是否已定义:

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

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

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

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

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

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

谢谢 :D

0 投票
1 回答
4212 浏览

c# - 串口通讯,读取第 9 位

我有一个使用串行通信与外部协议连接的应用程序。

我需要知道是否在它发送给我的每个数据包(9 位)上设置了唤醒位,并且通信速率必须低于 40 毫秒,并且必须在 20 毫秒内发送响应。该框架,封装了从端口读取的位,并且只将 8 位数据发回给我。此外,由于时间问题,我不能等待奇偶校验错误事件。

我需要知道如何阅读 9 位,或者是否有http://www.wcscnet.com/CdrvLBro.htm的免费替代品

0 投票
1 回答
1499 浏览

serial-port - ubuntu中使用MARK/SPACE模式的9bit串行通信

我知道使用奇偶校验位9-bit可以进行串行通信。Linux

并且一些 Linux 版本提供MARK/SPACE parity mode,所以我可以很容易地设置奇偶校验位。

但据我所知,这MARK/SPACE parity mode不是 Linux 标准,所以 Linux 可能不支持这种模式。

如何检查我使用的 Linux 是否支持该模式?

我必须编写一些代码并进行测试吗?

我想知道没有这些额外的工作。

通过检查配置信息或内核源代码有什么办法吗?

而且,如果Linux不支持MARK/SPACE parity mode,有什么办法让它支持吗?

实际上,在 中ubuntu12.04,它是受支持的,但是当我尝试使用 时ubuntu14.04,它似乎在我测试时不支持。(在ubuntu14.02使用lxdein的情况下embedded

==================编辑=====================

MARK/SPACE paritytermios这里的位意味着我是否可以使用带有标志的 9 位CMSPAR

以及如何检查此标志是否可用于 9 位通信。如果没有,任何激活此功能的方法。

否则我必须检查我发送的每个字节的奇偶校验,然后将奇偶校验模式更改为使用 9 位。

但是,如果我可以使用 CMSPAR 标志,我只需PARODD将奇偶校验位设置为CMSPAR,而不管我发送的数据如何。

并且公司说硬件支持9bit。

是关于 的描述MARK/SPACE parity

0 投票
1 回答
1225 浏览

c - AVR 9 位 Usart 不工作 (MPCM)

所以有主从Attiny2313。主机发送 9 位数据(第 9 位 TXB8 设置为 1),但从机没有检测到第 9 位(RXB8 仍为 0)。我认为如果在主设备中设置了 TXB8 位,则从设备上的 RXB8 位应该自动设置,或者不?(在代码中,我检查 UCSRB 中的 RXB8 是否设置为 1。事实并非如此,这就是问题所在)

0 投票
1 回答
66 浏览

type-conversion - C 如何将值写入整个数据结构,而不仅仅是一个元素?

我正在尝试编写一个用于从自动售货机读取数据的小 C 测试程序。我已经连接了电路,现在最难的部分是代码。该机器使用需要 9 个总数据位的 UART。这是我的代码。尝试直接写入完整的 9 位数据类型不起作用,但写入其中的一个元素可以。

错误是 rx.cpp: In function 'void loop()': rx.cpp:11:12: error: no match for 'operator=' (operand types are 'nineBit' and 'int') void setup() { ^

0 投票
0 回答
1113 浏览

c# - 来自serialPort c#的9位

我有一个与设备的 serialPort 通信,它向我发送一个 9 位数据包。我正在使用 c#。数据为 8 位,一位用于检查字节是数据还是命令,如果是命令,则第 9 位为 1,否则为 0。问题是 .Net 中实现的串行端口仅接受 8 位。在某些答案中,我看到可以使用奇偶校验位发送和接收 9 位数据,但每次更改奇偶校验值时都必须重新启动端口。现在重新启动是因为我会丢失与设备通信的 ID,并且对话周期是每 12 毫秒。有人可以给我一个线索如何解决这个问题。谢谢!

0 投票
0 回答
1049 浏览

c - 使用 CMSPAR 进行 MARK 奇偶校验检测非常不可靠(9 位 UART)

edit-2:事实证明,这实际上可能是许多基于 USB 的适配器的限制,因为它们总是一次将多个字节传输到主机,而没有放置有关单个字节的信息的地方。因此,如果任何字节产生某种错误,整个传输将被标记,无法确定是哪个字节引起的。

编辑:我刚刚用 MT7688 的内部 UART 尝试了这段代码,它工作得非常好。所以这似乎是ftdi_sio驱动程序中的错误,甚至可能是硬件本身的错误。我可能会尝试用libftdi1/来实现这一点libftd2xx以排除这种情况。


我正在尝试使用 Linux 与使用串行协议的嵌入式设备进行通信。

为此,我使用的是 FT232RL USB 串行适配器。

协议用第 9(奇偶校验)位设置标记帧的第一个字节。

我可以使用CMSPAR选项(标记/空间奇偶校验)重现这一点,实际上,以这种方式发送帧工作正常且非常可靠。

当我在 Linux 上收到此类数据包时,奇偶校验“错误”应通过转义字节read序列以及设置了第 9 位的字节的实际值来指示。 0xFF0x00

然而,这只是“某种”的作品。只有在某些情况下,才会检测到完整的序列0xFF, 。(0x18 恰好是我的数据包的第一个字节),更多时候不是我不会读取转义,而是,(我什至不知道这是怎么可能的,因为永远不会发送 0x00)有时我会收到奇偶校验错误在随机有效载荷字节上。0x000x180xFF0x000x18

我首先怀疑存在竞争条件,因为我可能会在读取时更改 TTY 设置,但即使我使用两个 UART 和单独的进程(一个仅用于 RX,另一个仅用于 TX),我也会得到这样的结果

要设置 TTY,我使用

uart_init_linux("/dev/ttyUSB0", B500000);

现在这是某种硬件问题吗?我阅读速度不够快吗?是否有一些我想念设置的标志?

我很难相信当工具喜欢hterm并且screen可以在没有这么多错误位的情况下正常接收时,RX 是如此不可靠。

0 投票
1 回答
52 浏览

c - 对于 9 位 UART,Atmega 切换变量太慢

我已经编写了一些代码来向 usart 输出 9 位消息。

代码如下:

SERIAL_UDR = UDR0

SERIAL_USART_A = UCSR0A

当我在代码运行时放置断点时,无论是函数的开始还是函数的结束,它都会按预期工作。第 9 位为每个数据包切换打开和关闭。(共5个数据包)

当我没有断点时,当第九位切换似乎是完全随机的。当我在 if 语句中只有一个断点时,它只会命中一次。所以,我猜“九”值设置得不够快,无法全速运行切换。

切换位是预先设置的功能。

但我不明白为什么会这样。

atemga324p在存储无符号字符(bool_t)时是否有时间延迟

任何想法将不胜感激。

额外细节。单片机:Atmega324p。操作系统:Windows 10。编译器:Atmel Studio 7.0。优化:无。

0 投票
1 回答
282 浏览

.net - 9 位串行与 .NET

我需要通过 Raspberry Pi 3 在 Windows IoT 上运行的 Multidrop 总线节点和主进程之间建立通信。
我知道如何用 8 位字节交换数据。它的工作代码示例:

在这里,我从远程节点 发送1010 1010和接收。xxxx xxxx

这个问题。

  1. 可以说,远程节点发送给我1010 1010 1
  2. 可以说我需要发送1010 1010 1

代码需要是什么样的?

更新

我考虑解决方法:

  1. 使用UART 的奇偶校验位。但我实际上不明白,如何。
  2. 使用 COM -> USB 转换器,但实际上第 9 位可能会出现同样的问题。
  3. 在中间使用 Adruino,它将通过 GPIO 实现 RxTx 9 位,并以我们的内部格式将数据输出到 Raspberry。