我有一个带有 serialPort 组件的 Windows 窗体,我使用 DataReceived 事件处理程序来处理接收缓冲区中的数据。我使用返回 String^ 的 ReadExisting 方法,因为它是最可靠的方法,我可以收集接收缓冲区中的所有数据而不会丢失任何数据。像这样:
void serialPort1_DataReceived(System::Object^ sender, System::IO::Ports::SerialDataReceivedEventArgs^ e)
{
try{
String^ receive = this->serialPort1->ReadExisting();
StreamWriter^ swriter = gcnew StreamWriter("filename.txt", true, Encoding::Unicode);
//Insert some code for encoding conversion here
//Convert String^ receive to another String^ whose character encoding accepts character values from (DEC) 127-255.
//Echo to serialPort the data received, so I can see in the terminal
this->serialPort1->Write(receive);
//Write to file using swriter
this->swriter->Write(receive);
this->swriter->Close();
}catch(TimeoutException^){
in ="Timeout Exception";
}
}
问题在于 ReadExisting() 方法返回的 String^ 值。如果我输入诸如“wêyÿØÿþÿý6”之类的字符,则仅显示十进制值小于127的字符,因此我从终端读取“w?y??????6”。
我想要的是将 ReadExisting() 方法返回的 String^ 值以 Windows-1252 编码格式编码,以便它可以识别具有 127-255 值的字符。我需要它是一个 String^ 变量,这样我就可以使用 StreamWriter 中的 Write() 方法将它写入我的文本文件中。
我试过搜索,发现这与我想做的类似。所以这就是我所做的:
Encoding^ win1252 = Encoding::GetEncoding("Windows-1252");
Encoding^ unicode = Encoding::Unicode;
array <Byte>^ srcTextBytes = win1252->GetBytes(in);
array <Byte>^ destTextBytes = Encoding::Convert(win1252, unicode, srcTextBytes);
array <Char>^ destChars = gcnew array <Char>(unicode->GetCharCount(destTextBytes, 0, destTextBytes->Length));
unicode->GetChars(destTextBytes, 0, destTextBytes->Length, destChars, 0);
String^ converted= gcnew System::String(destChars);
然后我写入String^ converted
SerialPort 和 StreamWriter。尽管如此,还是无济于事。输出还是一样的。127 以上的字符仍表示为“?”。这样做的正确方法应该是什么?也许我这样做的方式有问题。