我试图搜索问题的重复项,但找不到。另外,对标题不是很容易理解也深表歉意。我对正在搜索的内容以及术语感到困惑。我是一位电子工程师,对.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转换为其实际值。

10-06 13:16
查看更多