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