我从称量秤(串口)接收数据为HEX。我想将它转换为ASCII,只需要它的权重。 代码:
0
( q p 0 8 0 0
( q p 0 8 0 0
( q p 0 8 0 0
( q p 0 8 0 0
( q p 0 8 0 0
( q p 0 8 0 0
( q p 0 8 0
这是我的输出: 聆听COM1 ... 20 20 20 30 0D 28 02 71 70 30 20 20 20 20 38 30 20 20 20 20 20 30 0D 28 02 71 70 30 20 20 20 20 38 30 20 20 20 20 20 30 0D 28 02 71 70 30 20 20 20 20 38 30 20 20 20 20 20 30 0D 28 02 71 70 30 20 20 20 20 38 30 20 20 20 20 20 0D 28 02 71 70 30 20 20 20 20 38 30 20 20 20 20 20 30 0D 28 02 71 70 30 20 20 20 20 38 30 20 20 20 20 20 0D 28 02 71 70 30 20 20 20 20 38 30 20 20 20 ....
这是我从网站手动转换的ASCII码:
<!DOCTYPE html>
<html lang="en-US" xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Star Rating Demo</title>
<link rel="stylesheet" type="text/css" href="./font-awesome.min.css">
</head>
<body>
<h1>Star Rating Demo</h1>
<div class="rating">
<span class="fa fa-star-o"></span>
<span class="fa fa-star-o"></span>
<span class="fa fa-star-o"></span>
<span class="fa fa-star-o"></span>
<span class="fa fa-star-o"></span>
</div>
<script type="text/javascript" src="https://code.jquery.com/jquery-2.2.0.min.js"></script>
<script type="text/javascript">
jQuery(".fa-star-o, .fa-star")
.on("click, mouseover", function (event) {
var star = jQuery(this)
jQuery(star).removeClass("fa-star-o").addClass("fa-star")
.prevAll()
.removeClass("fa-star-o").addClass("fa-star")
jQuery(star).nextAll()
.removeClass("fa-star").addClass("fa-star-o")
})
</script>
</body>
</html>
答案 0 :(得分:1)
您已复制了一些示例,但有更合适的方法可以从串口读取,更适合您的目的。
首先,您需要从手册中确定加权指标的数据格式。然后你可以使用它(而不是while循环):
string myData = _serialPort.ReadTo("\r");
其中"\r"
权重记录分隔符(也可能是其他字符串,如<CR><LF>
,<STX>
<ETX>
等。
如果要从串口缓冲区读取所有可用输入数据,可以使用
string myData = _serialPort.ReadExisting();
并按指定的char
拆分字符串string[] weightRecords = myData.Split('\r');
然后从解析的字符串中解析权重数值。因此,您不需要从字节转换数据,您可以直接将其作为字符串读取。如果您需要更多灵感,请查看this project。
如果你想尝试一下,你可以像这样重写DataReceived处理程序的主体:
if (InvokeRequired)
BeginInvoke(new Closure(() => { SerialPortOnDataReceived(sender, serialDataReceivedEventArgs); }));
else
{
//There may be multiple records available in the Serial Port buffer
string myData = _serialPort.ReadExisting();
//Suppose that 0D character (equals to \r) marks the end of record, see manual of the indicator
string[] weightRecords = myData.Split('\r');
foreach (var s in weightRecords)
{
//9,5 = Position and length of the numeric weight value, for exact values see your weight indicator manual
textBox1.Text += string.Format("{0} kg \n", s.Substring(9,5));
}
}
要通过由多个字符组成的分隔符来拆分字符串,可以使用以下内容:
string[] stringSeparators = new string[] {
System.Text.Encoding.ASCII.GetString(new byte[] {0x0d, 0x28})
};
string[] weightRecords = myData.Split(stringSeparators, StringSplitOptions.None);