在c#中与科勒仪表通信

本文关键字:仪表 通信 | 更新日期: 2023-09-27 18:06:04

我正在尝试与科勒有源仪表通信。它是半双工的。我已经读了所有的协议。科勒有自己的软件来查看档案。当它在阅读个人资料时,我试图查看它是如何发生的。发送和接收数据。然后我试着用c#写一个程序。为了在第一步通信,波特率选择300,然后应该是4800。

我的问题如下:

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

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

在c#中与科勒仪表通信

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

  2. 你不能仅仅改变波特率,它必须始终与设备的速率相匹配。

在发送请求之前等待一段时间。当你用F5调试时,你不需要等待。但是对于F11,你不可避免地要等待。这也表明当你等待时,你的程序工作得更好:)使用一个监控程序,如"免费串口监视器",通过首先运行科勒自己的程序来找出这些等待时间。
您可以使用流阅读器和流写入器与仪表通信。像

 writer = new StreamWriter(((System.IO.Ports.SerialPort)serialPort).BaseStream);
 reader = new StreamReader(((System.IO.Ports.SerialPort)serialPort).BaseStream);

不要忘记在使用write命令后使用write . flush()命令。有时在您将命令发送到仪表之前等待使用System.Threading.Thread.Sleep(250);代码。250美元在我的囊中。我不建议你在发送请求后等待。在发送新请求、ACK消息等之前等待。如果kohler自己的程序在命令之间等待太久,设置串行端口超时值…

(serialport).ReadTimeout = xxx;
(serialport).WriteTimeout = xxx;

'免费串口监视器'这个程序真的打开了我的眼界。非常感谢@ferda。我解决了这个问题。这是关于等待时间。首先,我看到了请求的时间和使用该程序的答案。然后我也使用了Flush命令。我再次使用FreeSerial端口监视器程序观看了我的程序输出。最后可以以4800波特率发送和接收数据。只是在c#中改变波特率对Kohler来说有效。它不需要其他任何东西。