通过串行端口从电压表读取数据

本文关键字:读取 数据 电压表 串行端口 | 更新日期: 2023-09-27 18:29:18

我对此有点陌生,我正在编写一个小型应用程序来读取电压表中的数据。这是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数组函数的数字。

我有点不知所措,因为我从来没有做过这样的事,也不知道该向哪里求助。

通过串行端口从电压表读取数据

听起来很接近,但您需要找出要使用的正确编码。

要从字节数组中获取字符串,您需要知道正在使用的代码页。如果手册中没有涵盖,并且你无法通过google/bing/其他搜索找到它,那么你需要使用试错法。

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

 Decoder uniDecoder = Encoding.Unicode.GetDecoder();

这一行特别指出,您将使用Unicode代码页来获得正确的代码页。

从那里,您可以使用Encoding类的重写来指定不同的代码页。这里记录了这一点:编码类

如果使用的Encoding不是标准之一,则可以在Encoding类的Constructor中使用Encoding(Int32)重写。有效代码页ID的列表可以在Windows 支持的代码页中找到

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

  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。您可以使用短路电阻测量、各种稳定电压测量等

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

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

我在linux上修改并合并了几个旧的开源C程序,以便从零件号为2200039的无线电夏克表中读取数据值。这是通过usb连接的。我真的只在一个音域上加了一个C或一个F。我的程序在这里,它有我得到另外两个程序的链接。

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

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