C# 从串行端口读取和写入的延迟

C# 从串行端口读取和写入的延迟,c#,serial-port,C#,Serial Port,您好,我正在编写一个应用程序,使用串行端口与设备一起工作。我已经编写了代码,当我设置断点时,它工作得很好,但是当我在没有断点的情况下调试它时,预期的数据是一部分一部分地进行的。例如,当我放置断点并从端口读取时,正确的数据为“ali”,但当我移除断点时,数据将为“a”、“li”。 以下是我从端口写入和读取的代码片段: fname1 = Encoding.Default.GetBytes("write1" + dataRow[0].ToString()); comport.Write(fnam

您好,我正在编写一个应用程序,使用串行端口与设备一起工作。我已经编写了代码,当我设置断点时,它工作得很好,但是当我在没有断点的情况下调试它时,预期的数据是一部分一部分地进行的。例如,当我放置断点并从端口读取时,正确的数据为“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);
我假设因为我有编码,所以有一些时间浪费,这解释了我描述的断点的影响


我的解决方案是在两个连续的读或写操作中设置延迟。我说得对吗?如果是,我如何实施?有更好的方法吗?

问题是,当您调用
comport.Read
时,它读取任何可读取的数据。很可能整个消息尚未到达串行端口

如果需要一定数量的字节,则可以使用如下循环:

var bytesReceived= 0;
while(bytesReceived < fname1.Length)
{
    bytesReceived += 
        comport.Read(fname1, bytesReceived, fname1.Length - bytesReceived);
}
var bytesReceived=0;
while(字节数小于fname1.长度)
{
字节接收+=
comport.Read(fname1,bytesserved,fname1.Length-bytesserved);
}
还可以使用
SerialPort.ReadLine
读取单行,或使用
SerialPort.ReadTo
读取某个字符串


有关这些方法的更多信息,请参见。

请包含“读取”的代码。单击按钮后,上面代码的第二部分进行读取。我应该将“read”和一个块号作为字节发送到我的设备以操作read命令no,我指的是调用
SerialPort.read
方法的代码部分。您是在
DataReceived
事件处理程序中执行此操作的吗?哦,您是对的,很抱歉它就在
comport.Write(c3,0,c3.Length)之后。代码为
comport.Read(fname1,0,fname1.Length)