0

我有一个带有 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^ convertedSerialPort 和 StreamWriter。尽管如此,还是无济于事。输出还是一样的。127 以上的字符仍表示为“?”。这样做的正确方法应该是什么?也许我这样做的方式有问题。

4

0 回答 0