繁体   English   中英

在C#中从串行端口读取数据

[英]Reading Data from serial port in c#

我正在尝试从串行端口读取数据。 数据超出规模。 我首先发送命令开始读取秤。

_serialPort.Write("P");

然后等待一段时间后,我尝试使用

temp2 = _serialPort.ReadLine();

应用程序挂在这行代码上。 我也尝试过读取功能,但得到相同的结果。 ReadExisting()函数返回一个空字符串。

由于ReadLine()不会超时或引发任何异常,因此我无法调试此问题,因为我没有更多信息。 由于WriteLine()ReadExisting()正在工作,因此端口不能有缺陷。

任何帮助,将不胜感激。

谢谢

在“接收”按钮后面尝试以下操作:

string msg = serialObj.ReadExisting();
MessageBox.Show(msg);

对于通讯,请从终端程序开始。 该程序可以让您键入从串行端口发送到设备的命令,并显示从设备返回的所有文本。 这将使您可以尝试描述的协议,并查看设备发送回的内容。 得到正确的答复后,您将知道:

  • 设备正在运行
  • 串行电缆已正确接线并且可以正常工作
  • 您使用的端口设置正确(波特率,停止位,奇偶校验等)
  • 您了解协议是什么(您发送的是“ P”还是“ P”后跟换行符?)

然后,您可以在知道是否运行不正常的情况下运行代码,这是代码中的某些错误,而不是其他任何因素使您感到困惑。

发送初始命令后,您可以立即读取串行端口以获取响应-您正在使用的呼叫将只等到收到一些数据即可。 如果没有收到数据,它将永远等待(因此程序挂起)。 以上任何错误均会导致未接收到任何数据的相同症状。 并且更改读取数据的方式(例如,异步读取等)不会更改没有数据被接收的事实。

要注意的另一件事是端口设置。 通常,从大多数设备的默认设置开始(因为大多数设备以相当标准的方式使用RS232)-一个典型的初学者错误是显式设置诸如握手方法之类的选项,但是如果弄错了,它将破坏通讯科。 通常,您需要指定一个波特率和8N1(8位,无奇偶校验,1个停止位),然后不理会其他设置,直到发现需要对其进行设置才能使其正常工作,或者您知道 (如其手动状态) (黑色和白色)表示您的设备需要使用其他内容。

将您的Write函数更改为WriteLine。 这可能有所帮助。 此外,请查看MSDN上此链接的样本。 这很有帮助。

您可以使用该部分将数据从c#发送到串行端口:

int MyInt3 = Convert.ToInt32(textBox3.Text);
byte[] p = BitConverter.GetBytes(MyInt3);
serialPort1.Write(p, 0, 1);

之后,您可以使用Read()方法。

检查是否正确设置了SerialPort.NewLine属性。 如果仅收到一个CR字符,并且ReadLine应为例如。 CRLF,您的应用程序将挂起。

秤是否响应发送给它的每个“ P”,还是“ P”是一个告诉其开始发送连续数据流的命令? 要使用终端程序,请将其波特率和协议设置为与标尺(和您的程序)相同的值,并使用它向标尺发送“ P”,以代替对您的程序执行此操作。 秤的任何响应应显示在终端窗口中。 我更喜欢白蚁或白蚁(均可下载)超级终端,这是非常糟糕的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM