C#Comport - 可能的数据丢失

时间:2012-09-25 20:52:37

标签: c# wpf serial-port

我一直在努力解决问题,我真的不想解决以下问题:

我有一个能够侦听能够将数据上传到计算机的设备的软件应用程序。一旦捕获到这些数据,就会将其写入文本文件并存储起来供以后使用。

void DataRecieved(object sender, EventArgs e)
{
   while ((bufferedData = comport.ReadLine()) != null)
   {
       uploadedData += bufferedData + Environment.NewLine;
   }

   comport.Close();

   System.IO.StreamWriter writeUploadedPro = new System.IO.StreamWriter(uploadFilePath);
   writeUploadedPro.Write(uploadedData);
   writeUploadedPro.Close();

   isUploadComplete = true;
}

我可以建立,接收和验证连接,我编写的内容确实会生成上传数据的文本文件,但数据包含的内容并不完整。

示例:

%
N0?77??.5???3
G0? X3.??? Z4.5??6 
Z5.?? 
?3.5?76 
G01 Z5.?? 
Z4.9471 
X?.?3 Z4.???9 
Z?.???6 
?3.?? Z?.??? 
Z4.???? 
X3.7??4 
G?? X3.???? ?4.5??6 
M30
?

它有很多'?'哪个应该是字母或数字。我重申我对comport的设置(波特,数据,停止,奇偶校验,握手和COM名称都已正确指定)。我也尝试过设置ReadBufferSize,RecievedBytesThreshold,Encoding和NewLine设置。我对这些属性一点也不熟悉,我也没有找到MSDN来解释它们。

如果您对我在上传中获取不完整数据的原因有任何想法或建议,我们将不胜感激。谢谢你的帮助。

2 个答案:

答案 0 :(得分:1)

我认为问题在于:

while ((bufferedData = comport.ReadLine()) != null)

尝试将语句更改为:

    while(comport.BytesToRead>0)
{
uploadedData += comport.ReadExisting() + Environment.NewLine;
}

如果有帮助,请告诉我。

答案 1 :(得分:1)

问题在于您的编码。尝试将Encoding property更改为UTF8。默认值为ASCII。在ASCII编码中,任何大于0x7F的字符都默认转换为?,因为ASCII只能达到0x7F(十进制127)。

虽然这可能会解决您的问题,但更好的方法是将数据读入字节数组,然后使用these encoding classes之一将其转换为正确的字符串。之所以有效是因为您不再将接收到的字节转换为字符串。您正在使用不执行字符串转换的Read(byte[], int, int)重载。纯字节。