0

我正在尝试与科勒有源仪表进行通信。它是半双工的。我已阅读所有协议。科勒有自己的软件来查看配置文件。在阅读配置文件时,我试图查看它是如何发生的。发送和接收数据。然后我尝试用 C# 编写一个程序。第一步通信波特率选择 300,然后它应该是 4800。

这是我的问题:

  1. 如果我尝试使用 F5 调试我的程序,它不会通信。但是,如果我使用步入模式 F11,它可以工作吗?我想它应该等待一段时间。任何想法?

  2. 当我尝试将波特率从 300 更改为 4800 时,进入 F11 模式不起作用。我检查了软件是否正在更改,但没关系。知道这是怎么回事吗?

4

3 回答 3

1
  1. 当您使用串行端口时,这是一个常见的错误。它们是非常慢的设备,尤其是在 300 波特时。每 33 毫秒只有一个字符,在现代机器上是永恒的。通过使用调试器,您人为地减慢了程序的速度。很多。让串行端口驱动程序有时间接收完整的设备响应。当您在没有单步或断点的情况下运行时,SerialPort.Read() 调用一次只返回一个或几个字符。您可以通过使用具有正确设置的 NewLine 属性的 ReadLine() 或将接收到的字节存储在缓冲区中直到获得完整响应来解决此问题。

  2. 您不能只更改波特率,它必须始终与设备的速率匹配。

于 2011-08-18T13:30:59.877 回答
0

“免费串口监视器”这个程序真的让我大开眼界。非常感谢@ferda。我解决了这个问题。这是关于等待时间。首先,我使用该程序看到了请求的时间和答案。然后我还使用了 Flush 命令。我再次使用 FreeSerial Port Monitor 程序观看了我的程序输出。最后,我可以以 4800 波特率发送数据和接收数据。只需更改 C# 中的波特率即可为科勒工作。它不需要任何其他东西。

于 2011-08-19T09:00:07.120 回答
0

在发送您的请求之前等待一段时间。当您使用 F5 进行调试时,您无需等待。但是使用 F11,您不可避免地要等待。这也表明您的程序在等待时运行得更好:) 使用诸如“免费串行端口监视器”之类的监视程序通过首先运行科勒自己的程序来找出这些等待时间。
您可以使用流式读取器和流式写入器与仪表进行通信。喜欢

 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 以毫秒为单位。我不建议您在发送请求后等待。在发送新请求、ACK 消息等之前等待。如果科勒自己的程序在命令之间等待太多,请设置串行端口超时值...

(serialport).ReadTimeout = xxx;
(serialport).WriteTimeout = xxx;
于 2011-08-18T13:21:32.287 回答