2

我有一块硬件,我通过 RS232 使用 .NET SerialPort 类连接到该硬件。根据其文档,它不支持任何类型的流量控制。

我可以向设备写入查询和命令,对于查询,它将立即响应读取,如果设备的 echo 处于打开状态,并且我必须在写入命令后进行读取,那么命令写入也可以正常工作。命令和响应最多为 7 个字符。

但是,如果 echo 关闭并且我快速连续编写 2 个命令,则不会执行第二个命令,除非我在写入之间放入 Thread.Sleep(15),大概是复制 echo 时执行 ReadLine 所需的时间在。

我不一定能保证 echo 会打开,并且明确地打开它也不是一个真正的选择,所以我基本上需要处理我发现的行为。

SerialPort 设置如下:

SerialPort _serialPort = new SerialPort
{
    PortName = "COM1",
    BaudRate = 9600,
    Parity = Parity.None,
    DataBits = 8,
    ReadTimeout = 5000,
    WriteTimeout = 5000,
    NewLine = "\x0D"
};

我正在使用 WriteLine 和 ReadLine 与之通信。

睡觉线程感觉就像一个黑客,我还没有找到我所有的谷歌搜索的替代方案。
那么,我错过了什么吗,有什么方法可以检查下一个写入串行端口的命令何时可以执行,或者 Thread.Sleep 几乎是我的任务?

4

3 回答 3

0

http://msmvps.com/blogs/coad/archive/2005/03/23/SerialPort-_2800_RS_2D00_232-Serial-COM-Port_2900_-in-C_2300_-.NET.aspx

将握手属性设置为 RTSCTS 并在 CTS 变为 true 时处理 PinChanged 事件?

表中标记为“输出”的行可以由串行端口设置为高或低状态(True 或 > > False),“输入”行可以读取为高或低。当输入引脚之一发生变化时,您可以使用 PinChanged 事件来获得 > > 通知。Handshake 属性可以设置为使用 RTS/CTS > > >(使用硬件控制线)或 XON/XOFF(使用软件)或两者。

控制线名称 DB9 引脚 SerialPort 属性 I/O DTR 数据终端就绪 4 DtrEnable 输出 RTS 请求发送 7 RtsEnable 输出 CTS 清除发送 8 CtsHolding 输入 DSR 数据设置就绪 6 DsrHolding 输入 CD(或 DCD)数据载波检测 1 CDHolding 输入

于 2012-06-05T16:46:04.567 回答
0

不幸的是,由于我的系统缺乏对流控制的支持,Thread.Sleep 似乎是解决方案。
我已经设置了我的代码,以便它检查 echo 是否打开,然后如果它只使用 ReadLine,如果它关闭则它使用 Thread.Sleep(15)。
感觉很糟糕,但它工作可靠,所以我只需要这样做。

于 2012-06-20T09:22:31.060 回答
0

我只是有一个类似的问题。使用低波特率我试图将命令写入端口太快(显然“写入”命令在写入完成之前返回)。

我通过修改“串行端口就绪?”解决了这个问题。我在每个命令之前调用的函数。当“BytesToWrite”属性大于零时,我添加了一个 while 循环来休眠 5ms。之后工作正常。

于 2016-03-01T20:02:03.497 回答