Skip to content

Instantly share code, notes, and snippets.

@lachlan
Created April 9, 2014 21:54
Show Gist options
  • Save lachlan/10321939 to your computer and use it in GitHub Desktop.
Save lachlan/10321939 to your computer and use it in GitHub Desktop.
Writes data to a serial port
package main
import (
"encoding/base64"
"encoding/hex"
"github.com/docopt/docopt.go"
"github.com/tarm/goserial"
"log"
"strconv"
)
var version string = "0.0.1"
var usage string = `cereal -- writes data to a serial port
Usage:
cereal write [--device=<device>] [--baud=<baud>] [--base64 | --hex] <data>
cereal -h | --help
cereal --version
Options:
-h --help Show this screen.
--version Show version.
--device=<device> The serial port to write the specified data to [default: COM1].
--baud=<baud> The baud rate used when transmitting the specified data [default: 9600].
--base64 Data is provided as a base64-encoded string, for example "aGVsbG8=".
--hex Data is provided as a hex-encoded string, for example "00fffa08".
`
func main() {
// parse the command line arguments
arguments, err := docopt.Parse(usage, nil, true, version, false)
if err != nil {
log.Fatal("Error: command line arguments could not be parsed: ", err)
}
// extract the command line arguments
data, _ := arguments["<data>"].(string)
base64Encoded, _ := arguments["--base64"].(bool)
hexEncoded, _ := arguments["--hex"].(bool)
device, _ := arguments["--device"].(string)
baud, _ := strconv.Atoi(arguments["--baud"].(string))
write, _ := arguments["write"].(bool)
if (write) {
// encode the data as a byte array using the specified encoding
var bytes []byte;
if (base64Encoded) {
bytes, err = base64.StdEncoding.DecodeString(data)
if err != nil {
log.Fatal("Error: base64-encoded data is malformed: ", err)
}
} else if (hexEncoded) {
bytes, err = hex.DecodeString(data)
if err != nil {
log.Fatal("Error: hex-encoded data is malformed: ", err)
}
} else {
bytes = []byte(data)
}
// open the serial port
c := &serial.Config{Name: device, Baud: baud}
handle, err := serial.OpenPort(c)
if err != nil {
log.Fatal("Error: device ", device, " could not be opened: ", err)
}
// close the serial port when done
defer handle.Close()
// write the data to the serial port
n, err := handle.Write(bytes)
if err != nil {
log.Fatal("Error: device ", device, " could not be written to: ", err)
}
// log the number of bytes written to the console
if (n == 1) {
log.Printf("%v byte written to device %v", n, device)
} else {
log.Printf("%v bytes written to device %v", n, device)
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment