难以处理通过串口接收的数据

时间:2014-08-01 19:40:08

标签: serial-port c++-cli

我是VC ++编写者的新手,我的大部分工作都是在嵌入式系统上使用C语言。我需要为我正在设计的嵌入式系统编写测试和校准程序,我遇到了问题。我开始使用的代码(在http://abhishek4273.wordpress.com/2014/06/13/serial-port-and-visual-studio/找到)基本上将所有收到的数据放在一个文本框中。我需要使用收到的数据,并做出适当的响应我现在的基本串行处理程序是:

    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");
}

现在,它挂了     while(String :: Compare(data3,&#34; n?&#34;)); 因为只有&#34; n&#34;在数据3中。

非常感谢任何帮助!

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

1 个答案:

答案 0 :(得分:0)

只保留一个不完整消息的数据缓冲区。每当有新数据进入时,请将其粘贴在缓冲区的末尾。然后检查并删除完整的消息。缓冲区中可能会有额外的粘连,以便接收下一个块。

关于您的更新:串行端口是缓冲的。只要您没有真正关闭串口,就不会因为程序在到达时忙碌而丢失数据(至少,没有缓冲区溢出错误)。