Initial commit
This commit is contained in:
commit
701f051953
|
@ -0,0 +1,8 @@
|
|||
module gx-proj
|
||||
|
||||
go 1.18
|
||||
|
||||
require (
|
||||
github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07 // indirect
|
||||
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a // indirect
|
||||
)
|
|
@ -0,0 +1,4 @@
|
|||
github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07 h1:UyzmZLoiDWMRywV4DUYb9Fbt8uiOSooupjTq10vpvnU=
|
||||
github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA=
|
||||
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a h1:dGzPydgVsqGcTRVwiLJ1jVbufYwmzD3LfVPLKsKg+0k=
|
||||
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
@ -0,0 +1,32 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"gx-proj/tools"
|
||||
)
|
||||
|
||||
func main() {
|
||||
var availableSlave []int
|
||||
fmt.Println("Checking available slaves...")
|
||||
for i := 0; i < 0xFF; i++ {
|
||||
if tools.CheckSlave(i, 0) {
|
||||
availableSlave = append(availableSlave, i)
|
||||
}
|
||||
}
|
||||
fmt.Println("\nAvailable slaves:", availableSlave)
|
||||
fmt.Println("Please press any key to continue")
|
||||
var input string
|
||||
_, err := fmt.Scanln(&input)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
// query the slaves to get score
|
||||
var scoreMap = make(map[int]int)
|
||||
for _, slave := range availableSlave {
|
||||
fmt.Println("\nChecking slave", slave)
|
||||
score := tools.GetGrade(slave, 0)
|
||||
scoreMap[slave] = score
|
||||
}
|
||||
fmt.Println("\nScore statistics:", scoreMap)
|
||||
tools.Reset()
|
||||
}
|
|
@ -0,0 +1,84 @@
|
|||
package tools
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"time"
|
||||
)
|
||||
|
||||
const (
|
||||
FUN_CHECKSLAVE = 0x08
|
||||
FUN_READINFO = 0x03
|
||||
FUN_RESET = 0x01
|
||||
FUN_WRONG_ADDR = 0x10
|
||||
CHECK_CONTENT = 0x13
|
||||
ERROR_INFO = 0x6f
|
||||
PACKET_HEAD = 0x5a
|
||||
BROADCAST_ADDR = 0x00
|
||||
)
|
||||
|
||||
func CheckSlave(addr, depth int) bool {
|
||||
if depth == 10 {
|
||||
fmt.Println("CheckSlave: Transfer error 10 times")
|
||||
return false
|
||||
}
|
||||
var sendData = []byte{byte(PACKET_HEAD), byte(addr), byte(FUN_CHECKSLAVE), byte(CHECK_CONTENT)}
|
||||
sendData = append(sendData, checkSum(sendData))
|
||||
go Send(sendData)
|
||||
recvData := Recv()
|
||||
if recvData[0] == byte(PACKET_HEAD) &&
|
||||
recvData[1] == byte(addr) &&
|
||||
recvData[2] == byte(FUN_CHECKSLAVE) &&
|
||||
recvData[3] == byte(CHECK_CONTENT) { // device ok
|
||||
fmt.Printf("CheckSlave: device #%v ok\n", addr)
|
||||
return true
|
||||
} else if recvData[0] == byte(PACKET_HEAD) &&
|
||||
recvData[1] == byte(addr) &&
|
||||
recvData[2] == byte(FUN_CHECKSLAVE) &&
|
||||
recvData[3] == byte(ERROR_INFO) { // device error
|
||||
fmt.Println("CheckSlave: data transfer error")
|
||||
return CheckSlave(addr, depth+1) // check 10 times, and return
|
||||
} else {
|
||||
fmt.Println("CheckSlave: unknown error")
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
func GetGrade(addr, depth int) int {
|
||||
if depth == 10 {
|
||||
fmt.Println("GetGrade: Transfer error 10 times")
|
||||
return -1
|
||||
}
|
||||
var sendData = []byte{byte(PACKET_HEAD), byte(BROADCAST_ADDR), byte(FUN_READINFO), byte(addr)}
|
||||
sendData = append(sendData, checkSum(sendData))
|
||||
go Send(sendData)
|
||||
recvData := Recv()
|
||||
if recvData[0] == byte(PACKET_HEAD) &&
|
||||
recvData[1] == byte(addr) &&
|
||||
recvData[2] == byte(FUN_READINFO) {
|
||||
score := int(recvData[3])
|
||||
if score >= 0 && score <= 100 { // success
|
||||
fmt.Printf("GetGrade: device #%v grade %v\n", addr, score)
|
||||
return score
|
||||
} else { // not prepared
|
||||
time.Sleep(1 * time.Second)
|
||||
return GetGrade(addr, depth+1)
|
||||
}
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func Reset() {
|
||||
var sendData = []byte{byte(PACKET_HEAD), byte(BROADCAST_ADDR), byte(FUN_RESET), 0x00}
|
||||
sendData = append(sendData, checkSum(sendData))
|
||||
go Send(sendData)
|
||||
fmt.Printf("Reset: success\n")
|
||||
}
|
||||
|
||||
func checkSum(num []byte) byte {
|
||||
// 累加和校验
|
||||
var sum int
|
||||
for _, v := range num {
|
||||
sum += int(v)
|
||||
}
|
||||
return byte(sum % 256)
|
||||
}
|
|
@ -0,0 +1,29 @@
|
|||
package tools
|
||||
|
||||
import "github.com/tarm/serial"
|
||||
|
||||
var conn *serial.Port
|
||||
|
||||
func init() {
|
||||
c := &serial.Config{Name: "/dev/ttyUSB0", Baud: 9600}
|
||||
var err error
|
||||
conn, err = serial.OpenPort(c)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
func Send(data []byte) {
|
||||
_, err := conn.Write(data)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
|
||||
func Recv() []byte {
|
||||
buf := make([]byte, 128)
|
||||
n, err := conn.Read(buf)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return buf[:n]
|
||||
}
|
Loading…
Reference in New Issue