Initial commit

This commit is contained in:
cyp0633 2022-05-30 20:15:24 +08:00
commit 701f051953
Signed by: cyp0633
GPG Key ID: E1BC508A994A5138
5 changed files with 157 additions and 0 deletions

8
go.mod Normal file
View File

@ -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
)

4
go.sum Normal file
View File

@ -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=

32
main.go Normal file
View File

@ -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()
}

84
tools/func.go Normal file
View File

@ -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)
}

29
tools/rw.go Normal file
View File

@ -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]
}