zhangzengfei
2024-10-17 7a19301f6972e0b81490e57200a634e4e3731a4c
rfid/rw.go
@@ -1,9 +1,11 @@
package rfid
import (
   "context"
   "encoding/binary"
   "encoding/hex"
   "fmt"
   "io"
   "time"
   "github.com/tarm/serial"
@@ -18,10 +20,12 @@
}
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) {
@@ -95,7 +99,6 @@
   for {
      select {
      case <-stop:
         fmt.Println("读取已超时")
         return false, nil
      default:
         for i := 0; i < 1024; i++ {
@@ -153,3 +156,67 @@
      }
   }
}
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)
      }
   }
}