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

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

  •  
  •   TirionHo · 10h 34m ago · 1462 views

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

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

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

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

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

    https://github.com/brutella/can

    如果没有库的话,问下 ai 怎么用 cgo 调用 c can
    lzz161788837
        25
    lzz161788837  
       4h 43m ago
    windows 的话最简单就是 winform 了,考虑美观的话可以 wpf 。can 的话一般都有 sdk ,c++写的可以 p/invoke 直接调,也可以用 QT 全套 c++
    WebKit
        26
    WebKit  
       4h 41m ago
    学啥,直接 AI 梭哈
    humbass
        27
    humbass  
       1h 33m ago
    Node.js 都有现成的 CAN 第三方接口,还是原生 JS/TS 的。
    c4011001
        28
    c4011001  
       6 mins ago
    统一用.net 生态简单高效还稳定,can 最好封装 C#库来实现,ui 推荐 avalonia ,wpf 已经老了
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1538 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 89ms · UTC 16:45 · PVG 00:45 · LAX 09:45 · JFK 12:45
    ♥ Do have faith in what you're doing.