A Go library for dealing with serial ports.
Switch branches/tags
Nothing to show
Clone or download
Type Name Latest commit message Commit time
Failed to load latest commit information.
arduino/increment_and_echo Renamed hardware/ to arduino/. Nov 8, 2011
go-serial-test switch to github.com/jacobsa import Mar 31, 2016
serial Add support for RTS/CTS flow control Dec 6, 2017
.gitignore Added entries for Go tests. Oct 20, 2011
LICENSE Added a license file. Oct 19, 2011
README.markdown Update README.markdown Jan 31, 2018



This is a package that allows you to read from and write to serial ports in Go.

OS support

Currently this package works only on OS X, Linux and Windows. It could probably be ported to other Unix-like platforms simply by updating a few constants; get in touch if you are interested in helping and have hardware to test with.


Simply use go get:

go get github.com/jacobsa/go-serial/serial

To update later:

go get -u github.com/jacobsa/go-serial/serial


Set up a serial.OpenOptions struct, then call serial.Open. For example:

    import "fmt"
    import "log"
    import "github.com/jacobsa/go-serial/serial"


    // Set up options.
    options := serial.OpenOptions{
      PortName: "/dev/tty.usbserial-A8008HlV",
      BaudRate: 19200,
      DataBits: 8,
      StopBits: 1,
      MinimumReadSize: 4,

    // Open the port.
    port, err := serial.Open(options)
    if err != nil {
      log.Fatalf("serial.Open: %v", err)

    // Make sure to close it later.
    defer port.Close()

    // Write 4 bytes to the port.
    b := []byte{0x00, 0x01, 0x02, 0x03}
    n, err := port.Write(b)
    if err != nil {
      log.Fatalf("port.Write: %v", err)

    fmt.Println("Wrote", n, "bytes.")

See the documentation for the OpenOptions struct in serial.go for more information on the supported options.