You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
137 lines
2.3 KiB
137 lines
2.3 KiB
package serial
|
|
|
|
import (
|
|
"time"
|
|
|
|
"go.bug.st/serial"
|
|
)
|
|
|
|
type Mode serial.Mode
|
|
|
|
const (
|
|
PARATY_NONE = serial.NoParity
|
|
PARATY_ODD = serial.OddParity
|
|
PARATY_EVEN = serial.EvenParity
|
|
PARATY_MARK = serial.MarkParity
|
|
PARATY_SPACE = serial.SpaceParity
|
|
|
|
STOP_1 = serial.OneStopBit
|
|
STOP_15 = serial.OnePointFiveStopBits
|
|
STOP_2 = serial.TwoStopBits
|
|
)
|
|
|
|
var ModeDef = &serial.Mode{
|
|
BaudRate: 115200,
|
|
DataBits: 8,
|
|
Parity: PARATY_NONE,
|
|
StopBits: STOP_1,
|
|
}
|
|
|
|
func GetComList() []string {
|
|
list, err := serial.GetPortsList()
|
|
if err != nil {
|
|
return list
|
|
}
|
|
return list
|
|
}
|
|
|
|
type SerialPort struct {
|
|
p serial.Port
|
|
flag bool
|
|
}
|
|
|
|
func OpenSerial(com string, conf *serial.Mode) (SerialPort, error) {
|
|
var p serial.Port
|
|
var err error
|
|
s := SerialPort{}
|
|
s.flag = false
|
|
index := 5 //重复打开串口5次
|
|
p, err = serial.Open(com, conf)
|
|
// 打开串口失败,重新打开
|
|
if err != nil {
|
|
for i := 0; i < index; i++ {
|
|
time.Sleep(time.Millisecond)
|
|
p, err = serial.Open(com, conf)
|
|
if err == nil {
|
|
s.flag = true
|
|
break
|
|
} else {
|
|
}
|
|
}
|
|
} else {
|
|
s.flag = true
|
|
}
|
|
if !s.flag {
|
|
return s, err
|
|
}
|
|
p.SetReadTimeout(time.Millisecond * 100)
|
|
s.p = p
|
|
return s, nil
|
|
}
|
|
|
|
func CheckCom(com string) bool {
|
|
s ,_:= OpenSerial(com, ModeDef)
|
|
if s.flag {
|
|
s.Close()
|
|
return true
|
|
} else {
|
|
return false
|
|
}
|
|
}
|
|
func (s *SerialPort) GetPort() serial.Port {
|
|
return s.p
|
|
}
|
|
func (s *SerialPort) GetFlag() bool {
|
|
return s.flag
|
|
}
|
|
func (s *SerialPort) SetFlag(flag bool) {
|
|
s.flag = flag
|
|
}
|
|
func (s *SerialPort) Read(buf []byte) (n int, err error) {
|
|
n, err = s.p.Read(buf)
|
|
if err != nil {
|
|
s.Close()
|
|
}
|
|
return
|
|
}
|
|
|
|
func (s *SerialPort) ReadString() string {
|
|
var buf = make([]byte, 1024)
|
|
n, err := s.p.Read(buf)
|
|
if err != nil {
|
|
return ""
|
|
}
|
|
str := string(buf[0:n])
|
|
return str
|
|
}
|
|
|
|
func (s *SerialPort) Write(buf []byte) (n int, err error) {
|
|
n, err = s.p.Write(buf)
|
|
return
|
|
}
|
|
|
|
func (s *SerialPort) WriteString(str string) bool {
|
|
_, err := s.p.Write([]byte(str))
|
|
return err == nil
|
|
}
|
|
func try() {
|
|
if err := recover(); err != nil {
|
|
}
|
|
}
|
|
func (s *SerialPort) Close() bool {
|
|
defer try()
|
|
s.flag = false
|
|
if err := s.p.Close(); err != nil {
|
|
|
|
return false
|
|
}
|
|
return true
|
|
}
|
|
|
|
func (s *SerialPort) ResetReadBuff() bool {
|
|
if err := s.p.ResetOutputBuffer(); err != nil {
|
|
return false
|
|
} else {
|
|
return true
|
|
}
|
|
}
|
|
|