Serial port 难以处理通过串行端口接收的数据

Serial port 难以处理通过串行端口接收的数据,serial-port,c++-cli,Serial Port,C++ Cli,我是一个有点新的VC++作者,我的大部分工作都是用C语言编写的嵌入式系统。我需要为我正在设计的嵌入式系统编写一个测试和校准程序,但我遇到了一个问题。我开始使用的代码(位于)基本上将所有接收到的数据放在一个文本框中。我需要使用接收到的数据,并适当地响应我现在拥有的基本串行处理例程是: private: System::Void SetTextCallback(System::Object^ sender, System::EventArgs^ e) { this->t

我是一个有点新的VC++作者,我的大部分工作都是用C语言编写的嵌入式系统。我需要为我正在设计的嵌入式系统编写一个测试和校准程序,但我遇到了一个问题。我开始使用的代码(位于)基本上将所有接收到的数据放在一个文本框中。我需要使用接收到的数据,并适当地响应我现在拥有的基本串行处理例程是:

    private: System::Void SetTextCallback(System::Object^ sender, System::EventArgs^ e)
    {
    this->txtTransfer->AppendText(data1);
    data3 = data3 + data1;
    Data = this->txtTransfer->Text;
    }

private: System::Void serialPort1_DataReceived_1(System::Object^ sender, System::IO::Ports::SerialDataReceivedEventArgs^ e) 
     {
    data1 = serialPort1->ReadExisting();
    this->Invoke(gcnew EventHandler(this, &Form1::SetTextCallback));
    }
如您所见,我试图将接收到的数据复制到一个名为data3的新缓冲区中。(所有数据都作为字符串处理)并尝试处理该数据。我的问题是data3经常有不完整或额外的数据。我需要的是一种方法,以确保我已收到要处理的整行数据,并以返回结束

我的数据处理程序是:

    private: System::Void btnMemTest_Click(System::Object^  sender, System::EventArgs^  e) {
         // button to test flash memory receive functions
         // create array to hold memory
         unsigned char memtest[4096];
         unsigned int i, j;

         // Send 'n' on serial port, followed by memory start address
         this->serialPort1->Write("n");
         while (String::Compare(data3, "n?"));
         data3 = "";
         this->serialPort1->Write("000000");

         for (i = 0; i < 1024; i++)
         {
             while (!String::IsNullOrEmpty(data1))
             j = Convert::ToInt16(data3,16);
             memtest[i] = j;
             data3 = "";
             this->serialPort1->Write("y");
         }
         this->serialPort1->Write("n");
}
private:System::Void btnmetest_单击(System::Object^sender,System::EventArgs^e){
//用于测试闪存接收功能的按钮
//创建数组以保存内存
无符号字符memtest[4096];
无符号整数i,j;
//在串行端口上发送“n”,后跟内存开始地址
此->串行端口1->写入(“n”);
while(String::Compare(data3,“n?”);
数据3=“”;
此->串行端口1->写入(“000000”);
对于(i=0;i<1024;i++)
{
而(!String::IsNullOrEmpty(data1))
j=转换::ToInt16(数据3,16);
memtest[i]=j;
数据3=“”;
此->串行端口1->写入(“y”);
}
此->串行端口1->写入(“n”);
}
现在,它挂在 while(String::Compare(data3,“n?”); 因为数据3中只有“n”

任何帮助都将不胜感激


更新问题:串行接收过程是否受中断驱动?或者,当我进入数据处理过程时,它会停止吗?我注意到字符串中的数据彼此不一致,几乎就好像串行接收例程在此过程中没有运行一样…

只保留一个非完整消息的数据缓冲区。每当有新数据输入时,将其粘贴在缓冲区的末尾。然后检查并删除完整的消息。对于接收到的下一个块,缓冲区中可能会有额外的卡滞


关于您的更新:串行端口被缓冲。只要你不关闭串口,就不会因为程序忙时丢失数据(至少,没有缓冲区过满错误)。

这是C++ + CLI而不是C++。请适当标记您的问题。只需使用ReadLine()而不是ReadExisting()。考虑到您已经在使用C++/CLI并且需要将CLR?更新为C++/CLI,因此您不能使用C#/.NET的任何原因。只有CR或NL才触发ReadLine()吗?我曾经上过C++课,以前从来没有在C语言中工作过!工作很好,.NET包装程序很糟糕。我试图通过创建字符串data3来实现这一点,但它不起作用。已经尝试过:data3=data3+data1;data3=String::Concat(data3,data1);他们两个似乎都不起作用。结果是空字符串。这么基本的东西有什么错呢???@CharlesEdmondson:使用
byte[]
(或
List
),而不是
string
,来保存串行数据。列表的
AddRange
RemoveRange
函数在这种情况下很好。对不起,Ben,表单似乎都设置为处理字符串数据。转到byte[]将意味着大量关于…@查尔斯:在连接部分读取并找到消息分隔符后,您可以将其解码为字符串。如果有任何CRC计算正在进行,您肯定还想使用
byte[]
。其实不需要做那么多。有趣的数据:如果我把data1放在前面,它会工作,但是如果把data3放在前面,它不会工作。如果data3是空的,它不能向其中添加数据吗?????