【发布时间】:2014-08-01 16:55:41
【问题描述】:
我有一个插入 USB 端口的Electronic balance device。输出始终是连续的,我可以通过 C# 中的 LibUsbDotNet 读取它。传输代码是 ASCII 8 位代码。其他设备信息为:
start bit:1bit, Data bit:8bits, Parity bit:0/1 bits, Stop bit:2bits
数据位(D1-D7)或(D1-D8)为数值(0-9);代码为 30H-39H。
我的问题是:
如何从设备中读取最后的数据?
如何将它们(字节)转换为 ASCII 8 位 (30H-39H) 以便了解它们的数字?
我的代码是:
private void cmdRead_Click(object sender, EventArgs e)
{
cmdRead.Enabled = false;
byte[] readBuffer = new byte[64];
int uiTransmitted;
ErrorCode eReturn;
if ((eReturn = mEpReader.Read(readBuffer, 1000, out uiTransmitted)) == ErrorCode.None)
{
tsStatus.Text = uiTransmitted + " bytes read.";
showBytes(readBuffer, uiTransmitted);
}
else
tsStatus.Text = "No data to read! " + eReturn;
cmdRead.Enabled = true;
}
private void showBytes(byte[] readBuffer, int uiTransmitted)
{
if (ckShowAsHex.Checked)
{
// Convert the data to a hex string before displaying
string hex = GetHexString(readBuffer, 0, uiTransmitted).ToString();
tRecv.AppendText(hex);
tRecv.AppendText(Environment.NewLine);
}
else
{
// Display the raw data
tRecv.AppendText(Encoding.UTF8.GetString(readBuffer, 0, uiTransmitted));
tRecv.AppendText(Environment.NewLine);
}
}
private static StringBuilder GetHexString(byte[] data, int offset, int length)
{
StringBuilder sb = new StringBuilder(length * 3);
for (int i = offset; i < (offset + length); i++)
{
sb.Append(data[i].ToString("X2") + " ");
}
return sb;
}
如果需要,我可以上传项目。比如设备显示3.04时,应用返回的值为:
01 62 21 60 68 38 7F 60 78 61 60 28 6D 7F 61 40 7F 69 61 62 79 69 79 79 78 79 79 20 78 69 61 21 20 68 20 61 68 7F 6B 63 61 7B 60 78 39 6D 7F 60 41 28 69 7F 60 63 01 4F 7F 60 78 69 79 69 40 69
如何从上述响应中找到设备显示的值,或者如何从设备中获取正确的数据(正确的编码)?
【问题讨论】:
-
System.Text.Encoding.ASCII.GetString -
@MattBurland 好像是这样。因此,要么包格式不使用 ASCII(我承认我懒得阅读那些文档),要么没有删除任何开始(奇偶校验)位,或者一些配置(使用)问题等......远程调试未知程序难,远程调试整个软硬件系统更难。
-
您将 USB 总线与串行端口混为一谈。手册只提到了一个串口,这个设备应该带有一个模拟串口的 USB 驱动程序。您使用 C# 中的 SerialPort 类来读取它。 USB 帧数据根本没有帮助,制造商没有记录它。连接秤后,使用设备管理器验证您是否获得了 COM 端口。
-
我已经提到:“使用设备管理器”。如果您不知道这意味着什么,请 Google 一下。