延迟读取和写入串口

时间:2013-08-05 09:58:25

标签: c# serial-port

您好我正在使用串口编写应用程序以使用设备。我已经编写了代码,当我设置断点时它工作正常,但是当我用断点调试它时,预期的数据是逐个部分的。例如,当我放置断点并从端口读取时,正确的数据是“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);

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

我的解决方案是将延迟连续两次读或写。我对么 ?如果是,我该如何实现呢?还有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

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

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

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

也可以使用SerialPort.ReadLine读取一行,或使用SerialPort.ReadTo读取某个字符串。

有关这些方法的详细信息,请参阅MSDN