如何在PC上访问我的9位数据串口?

时间:2013-01-08 10:13:54

标签: c serial-port cygwin

我开发了一个嵌入式解决方案,通过Multi Drop Bus进行通信,现在我想开发一个基于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个数据位。

我有一个StarTech PCI2S950 PC串口卡,它支持9位数据,但我不知道如何编写我的监控应用程序&谷歌搜索了很多,没有用。

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

通过该PC串口卡读取/写入9个数据位。

有人可以帮忙吗?

4 个答案:

答案 0 :(得分:5)

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

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

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

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

在常规Windows或Linux机器上,这是一个很多更难做,用户模式程序和UART之间有一个驱动程序。驱动程序生成“发送缓冲区空”状态位,如Windows上EV_TXEMPTY的WaitCommmEvent(),但这不包括fifo空状态,它只表示缓冲区为空。解决方法是等待缓冲区空状态,然后睡眠()足够长以确保清空fifo。 fifo通常为16字节深,因此睡眠时间为16倍。您需要在您选择的卡上获取UART的数据表,以确定这些细节。

答案 1 :(得分:3)

在Win32下,串口只是文件,所以你用CreateFile为它创建一个句柄,然后使用DCB结构来设置配置选项(成员记录here并包括数据位数{ {1}})。

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

答案 2 :(得分:3)

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位。

有几个其他芯片可以提到here的9位RS-485,但再次找到Windows驱动程序支持将是棘手的。当然,许多主板使用16C950但仅限于8位和/或RS-232模式,并且没有适当的驱动程序。

在回答您的相关question on Superuser时,sawdust建议Sealevel 7205e,这看起来是一个不错的选择,具有Windows驱动程序支持。它价格昂贵,但他们特别提到了9位,RS-485支持和Windows驱动程序。这可能是你最好的选择。

答案 3 :(得分:0)

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

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

第9位是否用于除数据以外的某些用途?