2013-08-05 191 views
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); 

我认为原因我已经编码有一些浪费时间,这说明了打破我描述点的效果。

我的解决方法是延迟两次连续读取或写入。我对么 ?如果是的话我怎么能实现呢?有没有更好的办法?

+0

请包括你在哪里做“阅读”的代码。 –

+0

它是在按钮单击和上述代码的第二部分进行读取。我应该发送“read”和一个块号作为字节到我的设备来操作读取命令 – user2628363

+0

不,我的意思是你调用'SerialPort.Read'方法的那部分代码。你在'DataReceived'事件处理程序中执行它吗? –

回答

1

问题是,当您拨打comport.Read时,会读取任何可读取的数据。整个消息很可能尚未到达串口。

如果你希望有一定的字节数,那么你可以使用这样一个循环:

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

也可以读取使用SerialPort.ReadLine单行线,或读取高达使用SerialPort.ReadTo某些字符串。

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