从c#中的串口读取数据

时间:2012-01-02 19:00:01

标签: c# serial-port

我正在尝试从串口读取数据。数据来自一个规模。我先发一个命令开始阅读比例。

_serialPort.Write("P");

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

阅读
temp2 = _serialPort.ReadLine();

应用程序挂起在这行代码中。我也试过了Read函数,但得到了相同的结果。 ReadExisting()函数返回一个空字符串。

由于ReadLine()没有超时或抛出任何异常,我无法调试此问题,因为我没有进一步的信息。由于WriteLine()ReadExisting()正在运作,因此端口不会有缺陷。

任何帮助都将不胜感激。

由于

6 个答案:

答案 0 :(得分:4)

在接收按钮后面试试这个:

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

答案 1 :(得分:2)

使用通讯,从终端程序开始。这是一个程序,允许您键入从串行端口发送到设备的命令,并显示从设备返回的任何文本。这将允许您尝试您描述的协议,并查看设备发回的内容。一旦得到正确答案,您就会知道:

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

然后你可以运行你的代码,知道如果它不起作用,你的代码中的某些内容是错误的,而不是任何其他因素混淆了水域。

发送初始命令后,您可以立即读取串口以获得响应 - 您正在使用的呼叫将等待直到收到一些数据。如果没有收到数据,它将永远等待(因此您的程序挂起)。任何上述不正确的事情都会导致无法接收任何数据的相同症状。更改读取数据的方式(例如异步读取等)不会改变没有接收数据的事实。

另一件需要注意的是端口设置。通常,从大多数事情的默认设置开始(因为大多数设备都以非常标准的方式使用RS232) - 典型的初学者错误是明确设置握手方法等选项,但是如果你弄错了它会打破通讯科。通常你指定一个波特率和8N1(8位,没有奇偶校验,1个停止位)并保持其他设置,直到你发现它们需要被设置为获得任何工作,或者你知道(如在他们的手册中以黑白分明)您的设备需要不同的东西。

答案 2 :(得分:1)

将Write函数更改为WriteLine。这可能有所帮助。另外,请查看MSDN上this link的示例。这很有帮助。

答案 3 :(得分:0)

检查SerialPort.NewLine属性是否设置正确。如果只收到CR字符,ReadLine期望例如。 CRLF,您的申请将被挂起。

答案 4 :(得分:0)

比例是否响应发送给它的每个“P”,或者“P”是一个命令,告诉它开始发送连续的数据流?要使用终端程序,请将其波特率和协议设置为与比例(和您的程序)相同,并使用它将“P”发送到比例,而不是使用您的程序。比例的任何响应都应出现在终端窗口中。我更喜欢termie或termite(都是可下载的)超级终端非常糟糕。

答案 5 :(得分:0)

您可以使用该部分从c#:

向串口发送数据
int MyInt3 = Convert.ToInt32(textBox3.Text);
byte[] p = BitConverter.GetBytes(MyInt3);
serialPort1.Write(p, 0, 1);

然后你可以使用Read()方法。