0

嗨,我正在编写一个应用程序来使用串行端口与设备一起工作。我已经编写了代码,当我放置断点时它工作正常,但是当我在没有断点的情况下调试它时,预期的数据是部分的。例如,当我放置断点并从端口读取时,正确的数据是 "ali" 但是当我删除断点时,数据将是 "a" ,"li" 。这是我用于从端口写入和读取的代码段:

 fname1 = Encoding.Default.GetBytes("write1"  + dataRow[0].ToString());
 comport.Write(fname1,0,fname1.Length);
 lname1 = Encoding.Default.GetBytes("write4" + dataRow[1].ToString());
 comport.Write(lname1, 0, lname1.Length); 

c3 = Encoding.Default.GetBytes("read" +0x1);
comport.Write(c3,0,c3.Length);
comport.Read(fname1, 0, fname1.Length);
string s = Encoding.Default.GetString(fname1);
MessageBox.Show(s);

我假设因为我有编码,所以浪费了一些时间,这解释了我描述的断点的影响。

我的解决方案是将延迟放在两个连续的 read 或 write 中。我对么 ?如果是,我该如何实施?有没有更好的办法?

4

1 回答 1

1

问题是,当您调用 时comport.Read,它会读取任何可供读取的数据。很有可能整个消息还没有到达串口。

如果您期望一定数量的字节,那么您可以使用如下循环:

var bytesReceived= 0;
while(bytesReceived < fname1.Length)
{
    bytesReceived += 
        comport.Read(fname1, bytesReceived, fname1.Length - bytesReceived);
}

也可以使用 读取单行SerialPort.ReadLine,或使用 读取特定字符串SerialPort.ReadTo

有关这些方法的更多信息,请参阅MSDN

于 2013-08-05T10:27:45.800 回答