我试图通过串口(蓝牙连接)处理从机器人收到的大约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线程中的工作。 如果是这样的话,我如何确保在不同的线程中处理数据?
提前致谢!