serial.go 1002 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package util
  2. import (
  3. "bytes"
  4. "encoding/hex"
  5. "fmt"
  6. "time"
  7. "github.com/tarm/serial"
  8. )
  9. // ReadSerial read from serial
  10. func ReadSerial(name string, baudrate int, bits byte) (data []byte, err error) {
  11. s := &serial.Port{}
  12. c := &serial.Config{}
  13. c.Name = name
  14. c.Baud = baudrate
  15. c.Size = bits
  16. c.StopBits = serial.Stop1
  17. c.ReadTimeout = 100 * time.Microsecond
  18. c.Parity = serial.ParityNone
  19. s, err = serial.OpenPort(c)
  20. if err != nil {
  21. return
  22. }
  23. defer s.Close()
  24. var ss bytes.Buffer
  25. buf := make([]byte, 1024)
  26. for {
  27. n, err := s.Read(buf)
  28. if err != nil {
  29. if ss.Len() > 0 {
  30. break
  31. }
  32. continue
  33. }
  34. if n > 0 {
  35. if n == 1 {
  36. if buf[0] == 0x0d {
  37. continue
  38. }
  39. if buf[0] == 0x0a {
  40. break
  41. }
  42. } else if n == 2 {
  43. if buf[0] == 0x0d && buf[1] == 0x0a {
  44. break
  45. }
  46. }
  47. ss.Write(buf[:n])
  48. fmt.Println("Read", n, "bytes", string(buf[:n]), hex.EncodeToString(buf[:n]))
  49. } else {
  50. break
  51. }
  52. }
  53. if ss.Len() > 0 {
  54. data = ss.Bytes()
  55. }
  56. return
  57. }