日期:2014-05-17  浏览次数:20804 次

关于c#串口通讯问题
本帖最后由 dahaianb 于 2013-04-06 13:31:20 编辑
最近在研究c#通过串口与rfid读卡器进行通讯,废话不多,请大家先看下面的rfid写epc号的协议:
8.2.4 写EPC号
这个命令向电子标签写入EPC号。写入的时候,天线有效范围内只能有一张电子标签。


命令:
Len Adr Cmd          Data[]            CRC-16
ENum Pwd  WEPC
0xXX 0xXX 0x04 0xXX 4Byte 变长 LSB MSB
参数解析:
ENum:1个字节。要写入的EPC的长度,以字为单位。不能为0,也不能超过15,否则返回参数错误信息。

Pwd:4个字节的访问密码。32位的访问密码的最高位在Pwd的第一字节(从左往右)的最高位,访问密码最低位在Pwd第四字节的最低位,Pwd的前两个字节放置访问密码的高字。在本命令中,当EPC区设置为密码锁、且标签访问密码为非0的时候,才需要使用访问密码。在其他情况下,Pwd为零或正确的访问密码。

WEPC:要写入的EPC号,长度必须和ENum说明的一样。WEPC最小1个字,最多15个字,否则返回参数错误信息。

应答:
Len Adr reCmd Status Data[] CRC-16
0x05 0xXX 0x04 0x00 —— LSB MSB


我根据上面的协议设计出相关通讯代码如下:

byte[] data = new byte[14];
                data[0] = 11;
                data[1] = 0x00;
                data[2] = 0x04;
                data[3] = 2;
                data[4] = 0;
                data[5] = 0;
                data[6] = 0;
                data[7] = 0;
                data[8] = 0;
                data[9] = 0;
                data[10] = 0;
                data[11] = 0;
                CalculateCRC(ref data, 0, 12);
                byte[] me = Write(data, 0, 14);

public byte[] Write(byte[] date, int offset, int count)
        {
            port.WriteTimeout = 3000;
            port.Write(date, offset, count);
            System.Threading.Thread.Sleep(3000);
            port.ReadTimeout = 2000;
            int cou = port.BytesToRead;
            byte[] da = new byte[cou];
            port.Read(da, 0, cou);
            port.DiscardInBuffer();
            port.DiscardOutBuffer();<