2

我对此有点陌生,我正在编写一个小应用程序来从电压表读取数据。这是一个 46 范围的 RadioShack 数字万用表。我的程序的目的是在检测到某个电压时自动执行某些操作。我正在使用 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 函数的数字。

我在我的头上,因为我从来没有做过这样的事情,不知道还有哪里可以转向。

4

4 回答 4

3

听起来您已经很接近了,但是您需要弄清楚要使用的正确编码。

要从字节数组中获取字符串,您需要知道正在使用的代码页。如果手册中没有包含它,并且您无法通过 google/bing/other 搜索找到它,那么您将需要使用反复试验。

要了解如何使用 GetChars() 从字节数组中获取字符串,请参阅Decoder.GetChars 方法 在代码示例中,请查看以下行:

 Decoder uniDecoder = Encoding.Unicode.GetDecoder();

该行特别说明您将使用 Unicode 代码页来获取正确的代码页。

从那里,您可以使用 Encoding 类的覆盖来指定不同的代码页。这记录在这里: 编码类

如果使用的 Encoding 不是标准之一,您可以在 Encoding 类的构造函数中使用 Encoding(Int32) 覆盖。可以在Windows 支持的代码页中找到有效代码页 ID 的列表

于 2013-08-27T19:36:27.870 回答
0

一些数字万用表使用 7 位数据传输。您应该将串行通信端口设置为 7 个数据位,而不是标准的 8 个数据位。

于 2014-08-31T18:30:23.727 回答
0

我在 linux 上修改并合并了几个较旧的开源 C 程序,以便从部件号为 2200039 的无线电小屋仪表中读取数据值。这是通过 USB 实现的。我真的只在一个范围内添加了 C 或 F。我的程序在这里,它有我在其中获得其他两个程序的链接。

我知道这个示例不在 C# 中,但它确实提供了您需要的格式信息。可以把它想象成用 C 编写的 API 文档,您只需自己将其翻译成 C#。

该协议以 4800 波特运行,并且 8N1 似乎可以工作。

于 2014-11-16T15:44:23.690 回答
0

有两种地区策略可以解决您的沟通问题。

  1. 找到并参考适当的文档并设计\修改程序以实现规范。

    以下内容可能是合适的,但不能保证描述您拥有的特定型号 DVM。尽管如此,它们可以作为一个起点。请注意,这些文档的作者评论说各自的模型可能“在视觉上相同”,但也评论说“据报道在 LINUX 上与早期 RS-232 模型一起工作的开源软件包不适用于 2200039”

http://forums.parallax.com/attachment.php?attachmentid=88160&d=1325568007

http://sigrok.org/wiki/RadioShack_22-812

http://code.google.com/p/rs22812/

  1. 尝试对协议进行逆向工程。如果您可以循环读取数据并收集结果,那么对协议进行逆向工程的一个好方法是将各种代表性信号应用于 DVM。您可以使用短路电阻测量、各种稳定电压测量等。

我建议最有价值的技术是使用自动可变信号发生器。这样,通过分析数据的模式,您应该更容易识别哪些点代表原始数据,哪些点代表稳定的描述性数据,如测量单位、操作模式等。

于 2013-08-30T12:34:44.100 回答