检测SerialPort何时为下一个命令做好准备

时间:2012-06-05 16:18:38

标签: c# serial-port

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

我可以向设备写入查询和命令,对于查询,它会立即响应读取,如果设备的回显打开,我必须在写入命令后执行读取,然后命令写入工作正常太。命令和响应最多7个字符。

然而,如果echo已关闭并且我快速连续写入2个命令,则不会执行第二个命令,除非我在写入之间放入Thread.Sleep(15),可能会复制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几乎是我的命运?

3 个答案:

答案 0 :(得分: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变为真时处理PinChanged事件?

  

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

     

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我遇到了类似的问题。使用低波特率我试图将命令写入端口太快(显然"写"命令在写完成之前返回)。

我通过修改" Serial Port Ready?来解决这个问题?"我在每个命令之前调用的函数。我添加了一个while循环来睡眠5ms而#34; BytesToWrite"财产大于零。之后工作得很好。