我正在尝试与科勒活动仪表进行通信。它是半双工的。我已阅读所有协议。科勒拥有自己的软件来查看配置文件。在阅读配置文件时,我试图查看它是如何发生的。发送和接收数据。然后我尝试用C#编写程序。要在第一步中进行通信,选择波特率为300,然后应为4800.
这是我的问题:
如果我尝试使用F5调试我的程序,它就不会进行通信。但如果我使用步入F11模式,它是否正常工作?我想它应该等待一段时间。任何想法?
当我尝试将波特率从300更改为4800时,进入模式F11不起作用。我检查了软件是否有变化,但没关系。知道这是什么意思吗?
答案 0 :(得分:1)
使用串行端口时,这是常见的事故。它们是非常慢的设备,尤其是300波特。这是每33毫秒只有一个角色,是现代机器上的永恒。通过使用调试器,您人为地减慢了程序的速度。很多。为串行端口驱动程序提供时间来接收完整的设备响应。当您在没有单步或断点的情况下运行时,SerialPort.Read()调用一次只返回一个或几个字符。您通过使用具有正确设置的NewLine属性的ReadLine()或将接收到的字节存储在缓冲区中直到您获得完整响应来解决此问题。
您不能只更改波特率,它必须始终与设备的速率匹配。
答案 1 :(得分:0)
在发送请求之前等待一段时间。使用F5进行调试时,请不要等待。但是在F11你不可避免地等待。这也表明你的程序在等待时效果更好:)使用像“Free Serial Port Monitor”这样的监控程序,通过首先运行Kohler自己的程序来找出这些等待时间。
您可以使用流读取器和流写器与仪表进行通信。
像
writer = new StreamWriter(((System.IO.Ports.SerialPort)serialPort).BaseStream);
reader = new StreamReader(((System.IO.Ports.SerialPort)serialPort).BaseStream);
在用户编写命令后,不要忘记使用writer.Flush()命令。
要在将命令发送到仪表之前有时等待,请使用System.Threading.Thread.Sleep(250);
代码。 250是msecs。
我不建议您在发送请求后等待。在发送新请求,ACK消息等之前等待
如果kohler自己的程序在命令设置serialports超时值之间等待太多......
(serialport).ReadTimeout = xxx;
(serialport).WriteTimeout = xxx;
答案 2 :(得分:0)
'Free Serial Port Monitor'这个程序真的让我开心。非常感谢@ferda。我解决了这个问题。这是关于等待时间。首先,我看到了请求的时间和使用该程序的答案。然后我也使用了Flush命令。我再次使用FreeSerial Port Monitor程序观看我的程序输出。最后,我可以以4800波特率发送数据并接收数据。只需改变C#中的波特率就可以为科勒工作。它不需要任何其他东西。