Created
December 21, 2017 14:00
-
-
Save reflechant/537cef967d281e52e3f7151c3d6ea836 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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