我们正在使用 Visual Studio 2013 .NET Framework 4.5 中的串行端口字节处理。我们遇到了传入数据包大小不同的问题。当我们尝试将 ReceivedByteThreshold 调整为相应的数据包大小时,当阈值设置为低于传入数据包大小时会多次触发 data Received 事件,而当阈值大于数据包大小时不会激活。我们尝试了几种不同的方法来解决这个问题,但它们似乎都没有完美的效果。
private: System::Void serialPort1_DataReceived(System::Object^ sender, System::IO::Ports::SerialDataReceivedEventArgs^ e)
{
array<uint8_t>^ CS = gcnew array<uint8_t>(2);
//Check InvokeRequired to prevent cross threading problem
if (textBox3->InvokeRequired) {
//Invoke delegate
textBox3->Invoke(
gcnew System::IO::Ports::SerialDataReceivedEventHandler(this, &MyForm::serialPort1_DataReceived),
gcnew array<System::Object^> { sender, e }
);
}
else
{
//ASCII -> HEX Conversion
int numbytes = serialPort1->BytesToRead;
array<Byte>^ encodedBytes = gcnew array<Byte>(500);
serialPort1->Read(encodedBytes, 0, numbytes);
}
}
仅当阈值设置为确切的数据包大小时,上面的代码才有效。由于我们对传入数据的长度有所了解,我们使用了一个按钮单击事件来根据传出缓冲区更改阈值,但数据仍然没有正确读入。Readexisting() 工作完美,但当我们扫描任何 8 位 ASCII 字符时,它显示为“?” 例如。0xff。
我想知道是否有人遇到过同样的问题,或者对此阈值问题有任何解决方案。
提前谢谢你的帮助。
耀西