5

我开发了一个通过多点总线进行通信的嵌入式解决方案,现在我想开发一个基于 PC 的应用程序来监控总线上的流量。

MDB supports true 9 data bits (plus start/stop/parity - and *no fudging* by using the parity bit as a 9th data bit)而标准的 Windows 和 Linux 库最多提供 8 个数据位。

我有一个支持 9 位数据位的StarTech PCI2S950 PC 串行端口卡,但不知道如何编写我的监控应用程序,并且在 Google 上搜索了很多,但无济于事。

我更喜欢用 C(或 Delphi 或 C++)编写代码。我对 Cygwn 有一点偏好,但愿意使用简单的 Windows 或 Linux。

只需通过该 PC 串行端口卡读取/写入 9 个数据位即可。

任何人都可以帮忙吗?

4

4 回答 4

5

您选择的卡不适合此应用程序。它只有普通的 RS-232 端口,不适合多点总线。您需要在其他地方购买 EIA-485 式总线接口,您只能在工业电子供应商处找到。到目前为止,最好的方法是通过拥有 MDB 规范的行业组织 National Automatic Merchandising Association。

9 位数据格式只是一种技巧,在 MDB 协议中用于在地址字节和数据字节之间进行模式切换。总线上的所有端口都监听地址字节,只有寻址端口监听数据字节。

第 9 位只是任何 UART 可以生成的奇偶校验位。基本数据大小仍然是 8 位。UART 会根据其初始化方式自动生成奇偶校验位,您可以在标记、空格、奇偶校验和偶校验之间进行选择。

现在,在具有 UART 的微控制器中很容易做到这一点,UART 就是在这样的总线上使用的那种处理器。您只需即时重新编程 UART,告诉它在您发送地址字节时生成标记奇偶校验。并在发送数据字节时将其重新编程为空间奇偶校验。尽管这取决于实际的 UART 芯片,但通常需要等待 fifo 清空。

这在普通的 Windows 或 Linux 机器上困难得多,在用户模式程序和 UART 之间有一个驱动程序。驱动程序生成一个“传输缓冲区空”状态位,如 Windows 上的 EV_TXEMPTY 的 WaitCommmEvent() ,但这不包括 fifo 空状态,它仅表示缓冲区为空。一种解决方法是等待缓冲区空状态,然后 sleep() 足够长的时间以确保 fifo 被清空。fifo 通常为 16 字节深,因此睡眠时间为 16 倍。您需要您选择的卡上的 UART 数据表才能确定了解这些详细信息。

于 2013-01-13T20:42:00.790 回答
5

http://www.semiconductorstore.com/pdf/newsite/oxford/ox16c950b.pdf上的文档描述了各种 UART 之间的差异。虽然您的 StarTech 板包括支持 RS-485(和 9 位)的 16C950,但它在 RS-232 兼容 (550) 模式下使用它,类似于 IBM-PC 时代的 16550/8250,并且最多支持 8 位数据。

您需要一块具有相同芯片 (16C950) 的板,但它公开了 RS-485 兼容的 950 模式,该模式支持 9 位数据,符合规范。并且任何声称支持这种支持的主板都必须配备适用于 Windows 的自定义驱动程序,因为微软只有 8 位。

这里提到的还有其他几种可以执行 9 位 RS-485 的芯片,但再次找到 Windows 驱动程序支持将很棘手。当然,许多板卡使用 16C950,但仅在 8 位和/或 RS-232 模式下使用,并且没有适当的驱动程序。

在回答您关于 Superuser 的相关问题时锯末建议使用Sealevel 7205e,它看起来是一个不错的选择,支持 Windows 驱动程序。它很贵,但他们特别提到了 9 位、RS-485 支持和 Windows 驱动程序。这很可能是您的最佳选择。

于 2013-01-17T03:15:50.197 回答
3

在 Win32 下,串行端口只是文件,因此您可以使用 CreateFile 为其创建句柄,然后使用 DCB 结构来设置配置选项(成员在此处记录并包括数据位数ByteSize)。

这里有一个很好的浏览:http: //www.codeproject.com/Articles/3061/Creating-a-Serial-communication-on-Win32

于 2013-01-08T10:32:47.973 回答
0

提供的链接显示该卡支持 9 个数据位和 Windows 8,因此我认为所有卡功能都可以通过标准 Windows API 提供给应用程序。

除了在 DCB 中设置正确的数据格式并打开端口之外,我还以为标准的 ReadFile 会起作用。我想知道读入的数据是否实际上是代表 9 个数据位的 2*8 位字节,而不是流式传输的连续 9 位(您需要在以后解码)。

第 9 位是否用于数据以外的其他目的?

于 2013-01-11T08:56:27.130 回答