visual c ++ Serialport类处理数据非常慢

时间:2015-05-11 11:31:13

标签: multithreading c++-cli

我试图通过串口(蓝牙连接)处理从机器人收到的大约1Hz的数据。我将收到不同标题的数据,确定将收到哪些数据以及预期的消息长度。

例如: 标题:sensorvalues(0x32) - >预计长度11含头。

首先,我想检查字节是否是标题,如果是这样,则提取预期长度(以字节为单位)。

我在GUI中使用vc ++和serialport类。 " seirialport->读取(缓冲区,0,预期长度)"非常慢,不太可靠。我在http://www.sparxeng.com/blog/software/must-use-net-system-io-ports-serialport找到了一些提示,但缓冲区仍然在缓冲区中有大约200个字节,这在我需要在GUI上显示实时传感器值时效果不是很好。

我的代码的关键部分是:

System::Void MyForm::serialPort1_DataReceived_1(System::Object^  sender, System::IO::Ports::SerialDataReceivedEventArgs^  e) {
if (serialPort1->BytesToRead > 0){
    if (write_position == 0){
        serialPort1->BaseStream->ReadAsync(data_recieved_buffer, 0, 1);
        header = data_recieved_buffer[0];
        if (this->InvokeRequired){
            myrecievedata_delegate^ d = gcnew myrecievedata_delegate(&myrecievedata);
            this->Invoke(d, gcnew array < Object^ > {'h'});
        }
        else
        {
            myrecievedata('h');
        }
    }
    else if (this->serialPort1->BytesToRead > expected_length - 1)
    {
        serialPort1->BaseStream->ReadAsync(data_recieved_buffer, 0, expected_length - 1);
        if (this->InvokeRequired){
            myrecievedata_delegate^ d = gcnew myrecievedata_delegate(&myrecievedata);
            this->Invoke(d, gcnew array < Object^ > {'b'});
        }
        else
        {
            myrecievedata('b');
        }
    }
    else{
        return;
    }
}

并将收到的数据发送到

System::Void MyForm::myrecievedata(char status){
if (status == 'h'){
    handleheader(header);
}
else if (status == 'b'){
    handlebyte();
}

serialport_datarecieved事件的问题是什么?我只能想到invoke(我很少知道)成为问题,仍然保持在serialport线程中的工作。 如果是这样的话,我如何确保在不同的线程中处理数据?

提前致谢!

0 个答案:

没有答案