我对此有点陌生,我正在编写一个小型应用程序来从电压表读取数据。这是一款 RadioShack 数字万用表 46 量程。我的程序的目的是在检测到特定电压时自动执行某些操作。我正在使用 C#,并且已经熟悉 SerialPort 类。
我的程序运行并从电压表读取数据。然而,数据都是未格式化/乱码的。该设备确实附带了自己的软件,可以在 PC 上显示电压,但这对我没有帮助,因为我需要从自己的程序中获取电压。我只是不知道如何将这些数据转化为有用的东西。
作为引用,我正在使用 SerialPort.Read() 方法:
byte[] voltage = new byte[100];
_serialPort.Read(voltage, 0, 99);
它抓取数据并按如下方式显示:
16 0 30 0 6 198 30 6 126 254 30 0 30 16 0 30 0 6 198 30 6 126 254 30 0 30 16 0 3
0 0 6 198 30 6 126 254 30 0 30 16 0 30 0 6 198 30 6 126 254 30 0 30 16 0 30 0 6
198 30 6 126 254 30 0 30 24 0 30 0 6 198 30 6 126 254 30 0 30 16 0 30 0 254 30 6
126 252 30 0 6 0 30 0 254 30 6 126 254 30 0
空格分隔数组的每个元素。如果我使用 char[] 数组而不是 byte[],我会得到完整的乱码:
▲ ? ? ▲ ♠ ~ ? ▲ ♠ ▲ ? ? ▲ ♠ ~ ? ▲ ♠ ▲ ? ? ▲ ♠ ~ ? ▲ ♠
使用 .ReadExisting() 方法给我:
▲ ?~?♠~?▲ ▲? ▲ ?~♠~?▲ ?↑ ▲ ??~♠~?▲ F? ▲ ??~♠~?▲ D? ▲ ??~♠~?▲ f?
.ReadLine() 超时,因此不起作用。 ReadByte() 和 ReadChar() 只是给我类似于 Read() into array 函数的数字。
我有点不知所措,因为我从来没有做过这样的事情,不知道还能去哪里。
最佳答案
听起来您很接近,但您需要找出要使用的正确编码。
要从字节数组中获取字符串,您需要知道正在使用的代码页。如果手册中没有介绍,并且您无法通过 google/bing/其他搜索找到它,那么您将需要进行反复试验。
要了解如何使用 GetChars() 从字节数组中获取字符串,请参阅 Decoder.GetChars Method 在代码示例中,查看这一行:
Decoder uniDecoder = Encoding.Unicode.GetDecoder();
该行明确指出您将使用 Unicode 代码页来获取正确的代码页。
从那里,您可以使用 Encoding 类的重写来指定不同的代码页。这记录在此处:Encoding Class
如果使用的编码不是标准之一,则可以在 Encoding 类的构造函数中使用 Encoding(Int32) 重写。有效代码页 ID 的列表可以在 Code Pages Supported by Windows 中找到。
关于c# - 通过串口从电压表读取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18473869/