SerialPort只读取字符串的第一个字符

时间:2013-11-28 08:50:07

标签: c# serial-port

我创建了一个小测试应用来测试app和测量温度的设备之间的连接。当我向设备写一些命令时没关系,但是当设备返回响应时,一个字符串,为此我使用ReadExisting()方法。但app只读取字符串的第一个字符。如果我再次发送命令,则情况相同。我尝试测试与名为Terminal.exe的程序的连接,它发生了相同的情况。但是当我将BaudRate更改为某个值并在9600上返回BaudRate(这是正常的速率)时,它的工作正常。此外,我尝试在我的应用程序中更改BaudRate,但它给了我相同的,只是字符串的第一个字符。我也有一个用LabView编写的应用程序,工作正常。

此外,我使用另一台装有Terminal.exe的电脑测试了我的应用程序,并且工作正常。

private void SetUpPort()
    {
        port = new SerialPort();
        port.PortName = port_name;
        port.BaudRate = 9600;
        port.Parity = Parity.None;
        port.DataBits = 8;
        port.StopBits = StopBits.One;
        port.Handshake = Handshake.None;
        port.ReadTimeout = 1000;
        p.DataReceived += new SerialDataReceivedEventHandler(PortDataReceived);
    }
private void PortDataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        recived_data += port.ReadExisting();
    }

我会非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

这不是如何使用SerialPort组件。您需要附加DataReceived事件处理程序,每次数据进入串行端口时都会调用该处理程序。我链接的页面上有一个例子。


在您知道自己完成之前,您需要附加数据!您不能只是致电ReadExisting并假设您获得所有信息。做这样的事情:

private string inBuffer = String.Empty;

private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
    SerialPort sp = (SerialPort)sender;
    string indata = sp.ReadExisting();

    inBuffer += indata;
    if (<inBuffer fulfills some criteria that tells you it's a complete message>)
    {
        ProcessInBuffer(inBuffer);
        inBuffer = String.Empty;
    }
}

任务确定要履行的条件。这可能是接收到的数据为一定长度(如果记录长度固定),或者可能以换行符或其他内容结束。

答案 1 :(得分:0)

您将使用datareceived事件将所有数据存储在数组或字符串中,然后您可以使用该字符串的每个数据indata + = sp.ReadExisting();