4.3 通讯协议
阅读器接受标签发送的ID信息后,以ASCII码的形式向PC机发送数据,格式如下:数据格式
STX(1BYTE), RFID_ID(6BYTE) 共7 个ASCII字符数据解释 数据包头 ID号
数据内容 0x02 6个ASCII码字符,表示3字节的ID号
数据长度 1字节 6字节(ASCII码)说明:
STX为 0x02h
RFID_ID 为6字节,表示一个3字节的无符号整形数,如ID=10811,则16进制表示为
0x2Ah,0x3Bh,用6字节的ASCII标识为0,0,2,A,3,B。
对于ID=10811的电子标签,上位机收到的数据为:
ASCII表示: STX 0 0 2 A 3 B
16机制表示: 0x02h 0x30h 0x30h 0x32h 0x41h 0x33h 0x42h
既以0x02h开头作为间隔标志,后6个字节表示一个ID号。前面的那个符号是卡号数据包头0x02,是个固定格式。
利用这个包头来关判断收到的数据是否为一个新的数据包的开始。--------------
类似于这样的数据转化成卡号 当然前面有一个校验位,但是无法复制出来032B32
09AA10
09A9CA
032B32
09A341
032B32
05E042
032B32-----
求怎么转化成卡号,和怎么校验
阅读器接受标签发送的ID信息后,以ASCII码的形式向PC机发送数据,格式如下:数据格式
STX(1BYTE), RFID_ID(6BYTE) 共7 个ASCII字符数据解释 数据包头 ID号
数据内容 0x02 6个ASCII码字符,表示3字节的ID号
数据长度 1字节 6字节(ASCII码)说明:
STX为 0x02h
RFID_ID 为6字节,表示一个3字节的无符号整形数,如ID=10811,则16进制表示为
0x2Ah,0x3Bh,用6字节的ASCII标识为0,0,2,A,3,B。
对于ID=10811的电子标签,上位机收到的数据为:
ASCII表示: STX 0 0 2 A 3 B
16机制表示: 0x02h 0x30h 0x30h 0x32h 0x41h 0x33h 0x42h
既以0x02h开头作为间隔标志,后6个字节表示一个ID号。前面的那个符号是卡号数据包头0x02,是个固定格式。
利用这个包头来关判断收到的数据是否为一个新的数据包的开始。--------------
类似于这样的数据转化成卡号 当然前面有一个校验位,但是无法复制出来032B32
09AA10
09A9CA
032B32
09A341
032B32
05E042
032B32-----
求怎么转化成卡号,和怎么校验
7个字符
0X02开头
后面6个是数据
而且数据只可能是0123456789ABCDEF这15种可能032B32
比如这个字符串
从左到右循环取单个字符
单个处理
0x30 处理成 int 0 左移20位
0x33 处理成 int 3 左移16位
0x32 处理成 int 2 左移12位
'B' 处理成 int 11 左移8位
0X33 处理成 int 3 左移4位
0x32 处理成 int 2 把结果相加就是卡号了十六进制的字符串转换成整型好像没有现成的方法。
static int GetID(byte[] datagram)
{
if (datagram.Length != 7)
throw new Exception("数据包长度不正确");
if (datagram[0] != 0x02)
throw new Exception("STX不正确"); try
{
string id = Encoding.ASCII.GetString(datagram, 1, 6);
return Convert.ToInt32(id, 16);
}
catch (Exception ex)
{
throw new Exception("数据格式不正确", ex);
}
}