How can I convert bytes received on a port back to string?
本问题已经有最佳答案,请猛点这里访问。
我有一些这样的代码,它将串行端口数据存储到一个名为buffer的int数组中现在我想让缓冲区把它转换成字符串形式。我该怎么做?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | private void serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) { //if (cCommon.DecryptText(CallerId) =="enable") //{ if (buffer.Length > 0) { try { for (int c = 0; c != serialPort.BytesToRead; c++) { buffer[pointer] = serialPort.ReadByte(); pointer++; } } catch (TimeoutException x) { //BackgroundWorker bw = new BackgroundWorker(); bw = new BackgroundWorker(); bw.DoWork += new DoWorkEventHandler(bw_DoWork); bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted); bw.RunWorkerAsync(); } } // } //else //{ // MessageBox.Show("You do not have permission to use This feature serialPort","Error", MessageBoxButtons.OK, MessageBoxIcon.Error); //} } |
我不确定确切的解决方案,因为它取决于您正在通信的设备,但我可以建议以下方法。首先读取字节,然后应该使用字节数组而不是整数数组。你想读的数字并不意味着你应该使用整数(数字?)。我想您可能应该有ASCII字符,所以您应该使用该转换,但这是您自己应该看到的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | byte[] buffer = new byte[255]; private void serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) { try { for (int c = 0; pointer+c < buffer.Length && c < serialPort.BytesToRead; c++) { buffer[pointer++] = (byte)serialPort.ReadByte(); } } catch { MessageBox.Show("Error reading port!"); } } . . . //and then you convert what you have read with something like this: System.Text.Encoding.ASCII.GetString(buffer); |
但请记住,您正在转换那里的整个255字节,而读取的字符可能更少。因此,您可能应该修改从端口读取的代码。
请参见encoding.getString()。如果整数数组可以解析为字节数组,并且您知道编码,那么您应该能够执行如下操作:
1 | Encoding.UTF8.GetString(buffer) |
…将整数数组转换为字节数组之后。