• 请不要在回答技术问题时复制粘贴 AI 生成的内容
TirionHo
V2EX  ›  程序员

Windows 平台的上位机开发,需要用 CAN 通信,能用 go 吗?

  •  
  •   TirionHo · May 21 · 3732 views
    This topic created in 170 days ago, the information mentioned may be changed or developed.

    之前做互联网的,现在转到了搞嵌入式的公司做物联网相关工作,小公司要求啥都会,现在把服务器、小程序、APP 、上位机这些都交给我来做。 小程序、APP 这些有点经验都好说,但是现在要做上位机,功能是连接 BMS 进行数据监控和参数配置,需要使用 CAN 通信。 我一开始想的是用 electron 之类的,但是发现只对串口通信支持较好,做 CAN 通信很难。又调研了下,发现了 wails 这个东西,问了下 AI ,说 go 可以做底层开发,但是深入了解后发现还是需要用 cgo 之类的,感觉坑有点多,主要是之前没做过这方便,完全不知道可行性如何。不知道有没有大佬用 go 实现过类似的功能呢? 如果用 go 实现难度很大,要做上位机是不是从学习成本、开发效率这些来说,应该选择 avalonia ,这个相对来说能更快速的上手?

    30 replies  •  2026-05-25 16:34:47 +08:00
    ljl024
    ljl024
    May 21
    1
    UI 和 CAN 通信肯定不会跑在一个线程上,干脆把界面和通信拆开来做
    electron 之类的做界面,负责 CAN 通信的部分单独起一个服务
    gwkoooo
    gwkoooo
    May 21❤️1
    2
    上位机用 winform 或者 wpf 比较方便吧
    TirionHo
    TirionHo
    OP
    May 21
    3
    @ljl024 问题就是 CAN 通信用啥来写好,用 go 的话怕坑太深自己搞不定,求稳的话就只有 C#和 QT ,那就要新学了
    opengps
    opengps
    May 21
    4
    做上位机,依然优先推荐最原始的那套,因为硬件厂商提供的资料会丰富,甚至有些是 sdk 直接调用
    除非纯粹通信,你有精力有文档能从头解析,否则不要用太新的语言,为了有车坐还要从其他地方移植一套生产线很不值
    niboy
    niboy
    May 21
    5
    主要是看你买的 USB‑CAN 支持哪些语言的 sdk ,一般来说,可能底层都是 C 库或者 dll ,其他语言封装了库,你做上位机来调
    anthoy
    anthoy
    May 21 via Android
    6
    pyqt 会不会容易上手多一点
    slowly
    slowly
    May 21❤️1
    7
    建议使用 winform ,大部分提供的 sdk 选择都很少,上位机要么 c++ 要么 c#,上位机基本都是跑在 win 上面
    supemaomao
    supemaomao
    May 21 via Android
    8
    can 转网络模块,你直接用 TCP/UDP 通讯就行了。模块有个好处,自带滤波。不然数据大了,你处理不过来。
    liuliuliuliu
    9
    上位机下位机的话 C#是第一选择,至于 UI ,其实没必要 avalonia 这个是跨平台的,你也不需要,winform 和 wpf 就行,当然用 avalonia 也没问题
    longaiwp
    longaiwp
    May 21
    10
    不要考虑什么上手不上手,看看 SDK 用的什么,然后就选那个。
    a33291
    a33291
    May 21
    11
    对接硬件(sdk/protocol)啥的还是要选 native 交互方便的语言,比如 c/c++,c#,大部分厂商也都直接提供这 2 种示例代码
    当然现在也有一些通用协议开始流行,比如 modbus 啥的

    ui 部分无所谓,你后端对接完出 api,ui 部分就 html 套 electron 就完事,简单直接
    zsj1029
    zsj1029
    May 21
    12
    可以的,go 有包能解析,再不济 ffi 接入 dll 、so ,
    监听串口设备 /dev/ttyUSB0 或 COM3 就行了
    古早的协议了,带宽很低,ascii 的编码处理,比 tcp 简单。
    现在新车都走 tcp 以太网协议了
    TirionHo
    TirionHo
    OP
    May 21
    13
    @liuliuliuliu 我问各个 AI 都说有前端经验学 avalonia 会比 WPF 更快,是这样吗
    mosfet
    mosfet
    May 21
    14
    @zsj1029
    你这是物理层
    OP 肯定还要解析 CanOpen 之类的协议

    工业还是用 C#吧,有成熟的解决方案
    dbskcnc
    dbskcnc
    May 21
    15
    go 通过 cgo 调用 c/c++资源很方便啊,你把跟硬件的接口用 c/c++来实现,直接用 purego 编译也很方便,wails v3 近来开发挺活跃,go (逻辑)+wails ( UI )也算是比较实在的选择
    zsj1029
    zsj1029
    May 21
    16
    @mosfet 你说对了一半,canopen 算是公开协议,自己二次处理报文数据就好了。
    这可不是物理层,物理层靠的是硬件设备芯片。
    ai 加持,自己维护一套协议处理,开始复杂,后面就舒服了,不然全捆死 c#了
    liuliuliuliu
    17
    @TirionHo 是差不多的……他俩语法基本一致啊……都是 xaml
    WPF 是官方的框架,可能资料还更多一些
    crime1024
    crime1024
    May 21
    18
    用最顺手的语言 不行就加个中间层 怕啥
    xyfan
    xyfan
    May 21
    19
    用什么语言都可以,国内占有率最高的就是周立功 CAN 卡,周立功官方有 ControlCAN.dll 的官方驱动库,用任何语言只要能方便的调用 DLL 即可,周立功的驱动封装的还挺完善的,OpenDevice 、OpenChannel 、receive 、transmit 几个函数一调用即可。

    这里面对于 CAN 卡的控制是最不重要最好实现的功能,我认为你需要关注界面上的功能实现,建议选择自己上手容易的,go 我没有接触过不知道做 GUI 怎么样,我之前都是用 PyQT/PySide 做简单的 BMS 上位机,通过 ctypes 调用 ControlCAN.dll ,再做界面展示。
    TirionHo
    TirionHo
    OP
    May 21
    20
    @dbskcnc 那我先用 go 写个 demo 来用 CAN 收发数据,只要能正常收发数据,后面的就没问题了吧
    NotLongNil
    21
    像 1 楼说的,界面通行拆开,通信按硬件提供资料和 SDK 什么语言就用什么语言,把资料丢给 AI 很容易写的
    capric
    capric
    May 21
    22
    可以考虑让 ai 试试 rust ,bindgen 生成厂商 c sdk 的 rust 绑定,再让 ai 生成 safe wrapper ,再到 rust 里面调用,我们就是这样的
    woshizhuwow
    woshizhuwow
    May 21 via Android
    23
    直接用 electron 就可以,CAN 厂商都会有 C 库接口,把头文件和开发示例扔给 AI ,让他给你生成个 napi 的接口,编译一下,产物直接从 js 文件里面调用就可以了
    ca2oh4
    ca2oh4
    May 21
    24
    遇事不决先 github 查一查有没有库,有的话跑个 demo 看看能不能通

    https://github.com/brutella/can

    如果没有库的话,问下 ai 怎么用 cgo 调用 c can
    lzz161788837
    25
    windows 的话最简单就是 winform 了,考虑美观的话可以 wpf 。can 的话一般都有 sdk ,c++写的可以 p/invoke 直接调,也可以用 QT 全套 c++
    WebKit
    WebKit
    May 21
    26
    学啥,直接 AI 梭哈
    humbass
    humbass
    May 21
    27
    Node.js 都有现成的 CAN 第三方接口,还是原生 JS/TS 的。
    c4011001
    c4011001
    May 22
    28
    统一用.net 生态简单高效还稳定,can 最好封装 C#库来实现,ui 推荐 avalonia ,wpf 已经老了
    ssack9
    ssack9
    May 22
    29
    @TirionHo CAN 协议很简单, 下位机看是 USB, 还是串口, 根据下位机的协议做好粘包处理其它不复杂
    capric
    capric
    May 25
    30
    @lzz161788837 推荐 avalonia ,wpf 早就不维护了,也不跨平台
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1610 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 81ms · UTC 15:14 · PVG 23:14 · LAX 07:14 · JFK 10:14
    ♥ Do have faith in what you're doing.