A Go linux/windows/osx CAN stack running in userland with low level adapter drivers written from the ground up J2534 support in Windows / Linux
- OBDLinx SX/EX/MX/MX+: https://www.obdlink.com/
- STN1130
- STN1170
- STN2120
- CANUSB adapter running in VCP mode using Lawicel ascii api
- CANable Nano and Pro running slcan
- YACA
- Drewtech Mongoose GM PRO II: https://www.drewtech.com/
- Scanmatik 2 PRO: https://scanmatik.pro/
- Tech2 passthru ( limited support )
- GM MDI
- OBDX Pro GT/VT: https://www.obdxpro.com/
- Tactrix Openport 2.0: https://github.com/dschultzca/j2534
- Machina: https://github.com/rnd-ash/Macchina-J2534
- WQCAN: https://github.com/witoldo7/STM32CAN
- SocketCAN
- OBDX Pro GT BLE & Wifi
- Combiadapter via libusb
package main
import (
"context"
"log"
"github.com/roffe/gocan"
"github.com/roffe/gocan/adapter"
"github.com/roffe/gocan/pkg/gmlan"
)
func main() {
dev, err := adapter.New(
"J2534",
&gocan.AdapterConfig{
Port: `C:\Program Files (x86)\Drew Technologies, Inc\J2534\MongoosePro GM II\monpa432.dll`,
PortBaudrate: 0,
CANRate: 33.3,
CANFilter: []uint32{0x64F},
},
)
if err != nil {
log.Fatal(err)
}
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
c, err := gocan.New(ctx, dev)
if err != nil {
log.Fatal(err)
}
defer c.Close()
gm := gmlan.New(c, 0x24F, 0x64F)
gm.TesterPresentNoResponseAllowed()
if err := gm.InitiateDiagnosticOperation(ctx, 0x02); err != nil {
log.Fatal(err)
}
defer func() {
if err := gm.ReturnToNormalMode(ctx); err != nil {
log.Println(err)
}
}()
if err := gm.DisableNormalCommunication(ctx); err != nil {
log.Fatal(err)
}
vin, err := gm.ReadDataByIdentifierString(ctx, 0x90)
if err != nil {
log.Fatal(err)
}
log.Println("VIN:", vin)
}
> $env:CGO_ENABLED=1; $env:GOARCH=386; go run .\examples\gmlan\read_vin_from_uec\main.go
VIN: YS3FB45F231027975