Year 2 Project: 上位机开发

Juntong20XX 于 2025-02-12 发布

Link to English Version.

上位机项目 IDLE 截图

在嵌入式开发中,上位机指与下位机交互的设备,通常是下位机的控制者。

在本次开发中,上位机使用的是一块 Raspberry Pi 5, 下位机是一块 Arduino Uno,二者通过 USB 连接。

上位机与下位机通过 USB 连接

代码设计

在此设计中,上位机的工作内容可以简化为:响应下位机的请求。

上位机状态图

stateDiagram
    [*] --> 等待下位机请求
    
    等待下位机请求 --> 处理Ping : 收到 ping 命令
    处理Ping --> 等待下位机请求 : 回复连接确认
    
    等待下位机请求 --> 处理WaitCommand : 收到 WaitCommand 命令
    处理WaitCommand --> 等待下位机请求 : 发送指令队列的指令
    
    等待下位机请求 --> 处理失败报告 : 收到执行失败通知
    处理失败报告 --> 等待下位机请求 : 将指令放回队列

    state 处理Ping {
        发送连接响应
    }

    state 处理WaitCommand {
        检查指令队列
        发送下一条指令
    }

    state 处理失败报告 {
        记录错误日志
        回退指令到队列
    }

此外,考虑到上位机将作为 SDK 提供,设置了 pyproject.toml 便于开发结束后打包为 Python 模块发布.

问题和解决

参数解析异常

问题分析: 下位机部分数据包仅有前 8 byte 为有效信息,因此传输时没有考虑固定长度的数据包后 8 byte 的情况。而 Python 作为强类型语言,必须将后 8 byte 作为某种数据类型进行处理。

解决方案:修改下位机,在传输数据前将无效位写为 0。

找不到串口

问题分析:上位机在开发时使用 vs code 远程连接到树莓派(系统为 Linux)上运行,而调试时使用笔记本(系统为 Windows)连接下位机执行。

解决方案:在测试代码中添加连接串口参数。

测试

在项目的 test 目录中创建测试程序。测试程序通过源代码位置调用了上位机的函数,当测试程序运行时,首先要求用户输入串口地址,之后使用 Python build-in list 创建命令队列,将命令队列和串口地址传给通信函数作为线程运行,启动线程后进入主循环,等待用户输入舵机的旋转度数。

上位机和下位机的测试是同步的,可以阅读下位机开发的博文获取更多信息。

下图是测试时的视频节选:

舵机在上位机操控下旋转