π CAN Go
CAN toolkit for Go programmers.
can-go makes use of the Linux SocketCAN abstraction for CAN communication. (See the SocketCAN documentation for more details).
Examples
Setting up a CAN interface
func main() {
// Error handling omitted to keep example simple
d, _ := candevice.New("can0")
_ := d.SetBitrate(250000)
_ := d.SetUp()
defer d.SetDown()
}
Receiving CAN frames
Receiving CAN frames from a socketcan interface.
func main() {
// Error handling omitted to keep example simple
conn, _ := socketcan.DialContext(context.Background(), "can", "can0")
recv := socketcan.NewReceiver(conn)
for recv.Receive() {
frame := recv.Frame()
fmt.Println(frame.String())
}
}
Sending CAN frames/messages
Sending CAN frames to a socketcan interface.
func main() {
// Error handling omitted to keep example simple
conn, _ := socketcan.DialContext(context.Background(), "can", "can0")
frame := can.Frame{}
tx := socketcan.NewTransmitter(conn)
_ = tx.TransmitFrame(context.Background(), frame)
}
Generating Go code from a DBC file
It is possible to generate Go code from a .dbc
file.
$ go run go.einride.tech/can/cmd/cantool generate <dbc file root folder> <output folder>
In order to generate Go code that makes sense, we currently perform some validations when parsing the DBC file so there may need to be some changes on the DBC file to make it work
After generating Go code we can marshal a message to a frame:
// import etruckcan "github.com/myproject/myrepo/gen"
auxMsg := etruckcan.NewAuxiliary().SetHeadLights(etruckcan.Auxiliary_HeadLights_LowBeam)
frame := auxMsg.Frame()
Or unmarshal a frame to a message:
// import etruckcan "github.com/myproject/myrepo/gen"
// Error handling omitted for simplicity
_ := recv.Receive()
frame := recv.Frame()
var auxMsg *etruckcan.Auxiliary
_ = auxMsg.UnmarshalFrame(frame)
Running integration tests
Building the tests:
$ make build-integration-tests
Built tests are placed in build/tests.
The candevice test requires access to physical HW, so run it using sudo. Example:
$ sudo ./build/tests/candevice.test
> PASS