| | |
| | | package rfid |
| | | |
| | | import ( |
| | | "context" |
| | | "encoding/binary" |
| | | "encoding/hex" |
| | | "fmt" |
| | | "io" |
| | | "time" |
| | | |
| | | "github.com/tarm/serial" |
| | |
| | | } |
| | | |
| | | type Reader struct { |
| | | DevName string |
| | | Baud int |
| | | ReadDuration int |
| | | DevPort *serial.Port |
| | | DevName string |
| | | Baud int |
| | | ReadDuration int |
| | | EPCData string |
| | | ReadTimestamp int64 |
| | | DevPort *serial.Port |
| | | } |
| | | |
| | | func (r *Reader) OpenSerial() (err error) { |
| | |
| | | for { |
| | | select { |
| | | case <-stop: |
| | | fmt.Println("读取已超时") |
| | | return false, nil |
| | | default: |
| | | for i := 0; i < 1024; i++ { |
| | |
| | | } |
| | | } |
| | | } |
| | | |
| | | func (r *Reader) ReadEPCData(ctx context.Context) error { |
| | | err := r.StartAutoRead() |
| | | if err != nil { |
| | | return err |
| | | } |
| | | |
| | | // 根据协议最大数据长度调整缓冲区 |
| | | buf := make([]byte, 1024) |
| | | for { |
| | | select { |
| | | case <-ctx.Done(): |
| | | return nil |
| | | default: |
| | | for i := 0; i < 1024; i++ { |
| | | buf[i] = 0 // 清零或其他处理 |
| | | } |
| | | |
| | | n, err := r.DevPort.Read(buf) |
| | | if err != nil && err != io.EOF { |
| | | return err |
| | | } |
| | | |
| | | if n == 0 || n < 8 { |
| | | continue // 如果没有读取到数据 |
| | | } |
| | | |
| | | // 检查帧头 |
| | | if buf[0] != 0x5A { |
| | | continue // 忽略错误帧 |
| | | } |
| | | fmt.Printf("Read message %x\n", buf[:n]) // 打印协议控制字进行调试 |
| | | |
| | | // 校验CRC |
| | | //fmt.Printf("Crc %x\n",buf[n-2 : n]) |
| | | receivedCrc := binary.BigEndian.Uint16(buf[n-2 : n]) |
| | | computedCrc := CRC16XMODEM(buf[1 : n-2]) |
| | | if receivedCrc != (computedCrc & 0xFFFF) { |
| | | fmt.Println("CRC check failed") |
| | | continue |
| | | } |
| | | |
| | | // 解析协议控制字 (仅在需要时使用) |
| | | //fmt.Printf("Control Word: %x\n", buf[1:5]) // 打印协议控制字进行调试 |
| | | |
| | | controlWord := binary.BigEndian.Uint32(buf[1:5]) |
| | | if controlWord != ControlWordEPCReadResponse6C { |
| | | fmt.Printf("Control Word: %d, rec word %d\n", ControlWordEPCReadResponse6C, controlWord) |
| | | continue |
| | | } |
| | | |
| | | // 解析EPC数据长度 |
| | | epcLength := binary.BigEndian.Uint16(buf[7:9]) |
| | | //fmt.Printf("EPC length %d, EPC %x \n", epcLength, buf[9:9+epcLength]) |
| | | |
| | | // 回调传送epc数据 |
| | | //callBack(buf[9 : 9+epcLength]) |
| | | r.EPCData = fmt.Sprintf("%X", buf[9:9+epcLength]) |
| | | r.ReadTimestamp = time.Now().Unix() |
| | | |
| | | fmt.Printf("read epc %s\n", r.EPCData) |
| | | } |
| | | } |
| | | } |