Skip to content

Instantly share code, notes, and snippets.

@reflechant
Created December 21, 2017 14:00
Show Gist options
  • Save reflechant/537cef967d281e52e3f7151c3d6ea836 to your computer and use it in GitHub Desktop.
Save reflechant/537cef967d281e52e3f7151c3d6ea836 to your computer and use it in GitHub Desktop.
package main
import (
"bufio"
"flag"
"fmt"
"io"
"log"
"os"
"strings"
"github.com/tarm/serial"
)
var port = flag.String("port", "", "Имя последовательного порта для работы")
var speed = flag.Int("speed", 9600, "Скорость последовательного порта в бодах, по умолчанию 9600")
func strToBytes(str string) []byte {
var (
data []byte
b byte
)
dataStr := strings.Replace(str, " ", "", -1)
if len(dataStr)%2 != 0 {
fmt.Println("неверный формат строки (нечётное число символов)")
return data
}
for i := 0; i < len(dataStr); i += 2 {
n, err := fmt.Sscanf(dataStr[i:i+1], "%x", &b)
if n != 1 || err != nil {
fmt.Println("неверный формат строки (подстроку невозможно интерпретировать как шестнадцатеричное число)")
return []byte{}
}
data = append(data, b)
}
return data
}
func tx(out io.WriteCloser) {
var (
str string
err error
)
scanner := bufio.NewScanner(os.Stdin)
for scanner.Scan() {
if err = scanner.Err(); err != nil {
fmt.Println(">>> ", err)
}
str = scanner.Text()
data := strToBytes(str)
_, err = out.Write(data)
if err != nil {
fmt.Println(err)
break
}
}
}
func rx(in io.ReadCloser) {
var data []byte
for {
n, err := in.Read(data)
if err != nil {
log.Fatalln(err)
}
for i := 0; i < n; i++ {
log.Printf("<<< %2[1]X | %[1]b\n", data[i])
}
}
}
func main() {
flag.Parse()
if *port == "" {
log.Fatalln("не указан последовательный порт")
}
uart := &serial.Config{Name: *port, Baud: *speed}
p, err := serial.OpenPort(uart)
// p, err := os.Open(*port)
if err != nil {
log.Fatal(err)
}
defer p.Close()
go rx(p)
tx(p)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment