我有一个带有serialPort组件的Windows窗体,我使用DataReceived事件处理程序来处理接收缓冲区中的数据。我使用ReadExisting方法返回一个String ^,因为它是我可以收集接收缓冲区中所有数据而不会遗漏任何数据的最可靠方法。像这样:
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()方法在我的文本文件中编写它。
我尝试过搜索,发现 this 与我想要的相似。所以这就是我所做的:
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以上的字符仍然表示为“?”。应该怎样做才能做到这一点?也许我做的方式有问题。