serial.go 989 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. package modem
  2. import (
  3. "context"
  4. "errors"
  5. "fmt"
  6. "go.bug.st/serial"
  7. )
  8. type SerialOpener struct {
  9. SessionOptions SessionOptions
  10. BaudRate int
  11. }
  12. func (opener SerialOpener) Open(ctx context.Context, port Port) (Client, error) {
  13. if err := ctx.Err(); err != nil {
  14. return nil, err
  15. }
  16. path := port.OpenPath()
  17. if path == "" {
  18. return nil, errors.New("modem: candidate has no AT port")
  19. }
  20. baudRate := opener.BaudRate
  21. if baudRate <= 0 {
  22. baudRate = 115200
  23. }
  24. rawPort, err := serial.Open(path, &serial.Mode{
  25. BaudRate: baudRate,
  26. DataBits: 8,
  27. Parity: serial.NoParity,
  28. StopBits: serial.OneStopBit,
  29. })
  30. if err != nil {
  31. return nil, fmt.Errorf("open AT port %s: %w", path, err)
  32. }
  33. if err := rawPort.ResetInputBuffer(); err != nil {
  34. _ = rawPort.Close()
  35. return nil, fmt.Errorf("reset AT input buffer %s: %w", path, err)
  36. }
  37. session, err := NewSession(rawPort, opener.SessionOptions)
  38. if err != nil {
  39. _ = rawPort.Close()
  40. return nil, err
  41. }
  42. return session, nil
  43. }