Multithreading visualc&x2B+;Serialport类处理数据的速度非常慢

Multithreading visualc&x2B+;Serialport类处理数据的速度非常慢,multithreading,c++-cli,Multithreading,C++ Cli,我正在尝试处理通过串行端口(蓝牙连接)以1Hz左右的频率从机器人接收到的数据。我将接收具有不同标头的数据,以确定将接收哪些数据以及消息的预期长度 例如: 标头:传感器值(0x32)->预期长度11,包括标头 首先,我想检查字节是否是一个头,如果是这种情况,则提取预期长度(以字节为单位) 我正在GUI中使用vc++和serialport类。 “seirialport->read(缓冲区,0,预期长度)”非常慢,而且不太可靠。我在上找到了一些技巧,但缓冲区仍然会累积到我在缓冲区中有大约200个字节的

我正在尝试处理通过串行端口(蓝牙连接)以1Hz左右的频率从机器人接收到的数据。我将接收具有不同标头的数据,以确定将接收哪些数据以及消息的预期长度

例如: 标头:传感器值(0x32)->预期长度11,包括标头

首先,我想检查字节是否是一个头,如果是这种情况,则提取预期长度(以字节为单位)

我正在GUI中使用vc++和serialport类。 “seirialport->read(缓冲区,0,预期长度)”非常慢,而且不太可靠。我在上找到了一些技巧,但缓冲区仍然会累积到我在缓冲区中有大约200个字节的程度,这在我需要在GUI上显示实时SensorValue时不是很好

我的代码的关键部分是:

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;
    }
}
serialport_DataReceived事件是否存在问题?我只能认为invoke(我对它知之甚少)是个问题,仍然将工作保持在serialport线程中。 如果是这种情况,我如何确保数据在不同的线程中处理


提前谢谢

你确定你使用的是正确的吗?您不应该等到异步操作完成后再尝试访问数据吗?我该怎么做?我认为AsyncRead在内部具有起始和结束读取。。。我需要一种方法来检查异步操作是否完成了吗?似乎
await
关键字会起作用:它似乎不支持CLR项目!所以问题是,如果有其他方法可以解决VisualC++中的问题!
System::Void MyForm::myrecievedata(char status){
if (status == 'h'){
    handleheader(header);
}
else if (status == 'b'){
    handlebyte();
}