我有一块硬件,我通过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几乎是我的命运?
答案 0 :(得分:0)
将握手属性设置为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"财产大于零。之后工作得很好。