我试图搜索问题的重复项,但找不到。另外,对标题不是很容易理解也深表歉意。我对正在搜索的内容以及术语感到困惑。我是一位电子工程师,对.Net框架了解甚少,所以请对我好:)
我当前的项目是一个心率监测器,它可以将测得的心率存储到EEPROM中,然后发送到PC以供以后查看日志。
我正在与使用RS-232(串行)协议(protocol)的8位微 Controller 接口(interface)。每当我向微 Controller 发送代表l
的char log
时,它将以以下格式向我发送一些信息:
0x1E 0x21 0x01 0x13 0x14 0x35 0x46 0x1E 0x21 0x01 0x13 0x14 0x43 0x48 0x0A 0x0D
空格仅供引用,这些字节不会彼此分开。
从微 Controller 发送的这8位HEX值包括记录信息的开始,即
0x1E
,格式为DD MM YY HH MM的日期和时间,以及记录的心率。当所有记录都回显后,则发送0x0A和0x0D字符。例如,上面的代码表示:
Record start.
21.01.13 14:35
Heart Rate: 70
Record start.
21.01.13 14:43
Heart Rate: 72
End of records.
我如何获得这样的字符串值:“S210113143570S210113144372”,其中
S
可以是任何值。之后,我将对此应用正则表达式语法并将其划分为组,以便可以将这些值添加到listview
控件中。编辑后的评论和答案:
我没有把样本写错。不幸的是,编码与上面的完全一样。
最佳答案
因此,实际上每个字节代表一个数字。我假设您已经以某种方式拥有包含这些值的byte[]
数组:
var data = new byte[] { 0x1E, 0x21, 0x01, 0x13, 0x14, 0x35, 0x46,
0x1E, 0x21, 0x01, 0x13, 0x14, 0x43, 0x48, 0x0A, 0x0D };
现在,您可以创建像这样的真实对象:
class LogEntry
{
public DateTime Timestamp { get; set; }
public int HeartRate { get; set; }
}
var logEntries = new List<LogEntry>();
for(int i = 0; i < data.Length; i+= 7)
{
if(data[i] == 0x0a && data[i + 1] == 0x0d)
break;
if(data[i] != 0x1e)
throw new InvalidDataException();
var logEntry = new LogEntry();
var year = BcdToDecimal(data[i + 3]) + 2000;
var month = BcdToDecimal(data[i + 2]);
var day = BcdToDecimal(data[i + 1]);
var hour = BcdToDecimal(data[i + 4]);
var minute = BcdToDecimal(data[i + 5]);
var heartRate = data[i + 6];
logEntry.Timestamp = new DateTime(year, month, day, hour, minute, 0);
logEntry.HeartRate = heartRate;
logEntries.Add(logEntry);
}
byte BcdToDecimal(byte bcdValue)
{
return (byte)((bcdValue / 16 * 10) + (bcdValue % 16));
}
方法
BcdToDecimal
将BCD转换为其实际值。