我在这方面是个新手,我正在写一个小应用程序来从电压表中读取数据。这是一个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数组函数类似。
我很困惑,因为我从来没有做过这样的事情,不知道还能去哪里。
发布于 2013-08-28 03:36:28
听起来已经很接近了,但是您需要找出正确的Encoding来使用。
要从字节数组中获取字符串,您需要知道正在使用的代码页。如果手册中没有介绍它,并且您无法通过google/bing/其他搜索找到它,那么您将需要使用试错法。
若要了解如何使用GetChars()从字节数组中获取字符串,请参阅代码示例中的Decoder.GetChars Method,请查看以下行:
Decoder uniDecoder = Encoding.Unicode.GetDecoder();该行特别说明您将使用Unicode代码页来获取正确的代码页。
在那里,您可以使用Encoding类的重写来指定不同的代码页。这里记录了这一点:Encoding Class
如果所使用的编码不是标准之一,则可以在编码类的构造函数中使用编码(Int32)覆盖。可以在Code Pages Supported by Windows上找到有效代码页ID的列表
发布于 2013-08-30 20:34:44
有两个区域策略可以解决您的通信问题。
以下可能是适当的,但不能保证描述您拥有的特定型号的DVM。尽管如此,他们可以作为一个起点。请注意,这些文档的作者评论说,各自的模型可能在视觉上是相同的,但也评论说:“据报道可以在早期RS-232型号的LINUX上工作的开源包不能在2200039"上工作
http://forums.parallax.com/attachment.php?attachmentid=88160&d=1325568007
http://sigrok.org/wiki/RadioShack_22-812
http://code.google.com/p/rs22812/
我建议的最有价值的技术是使用自动可变信号发生器。通过这种方式,通过分析数据的模式,您应该能够更容易地确定哪些点代表原始数据,哪些点代表稳定的描述性数据,如测量单位、操作模式等。
发布于 2014-09-01 02:30:24
一些数字万用表使用7位数据传输。应将串行通信端口设置为7个数据位,而不是标准的8个数据位。
https://stackoverflow.com/questions/18473869
复制相似问题