我创建了一个小测试应用来测试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();
}
我会非常感谢任何帮助。
答案 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();