【欧时RS x Arduino】Arduino UNO Q 简洁开发之Linux和Arduino交互
再看一下硬件高清资源图硬件底层靠一根内部专用 UART(Linux 侧 /dev/ttyHS1,MCU 侧 LPUART1) 传输原始二进制数据,所有 RPC、Monitor 打印全部跑在这条 UART 上,用户不能直接打开这个 tty 设备,交给 arduino-router 统一接管。arduino-router 是一个系统后台 daemon(systemd 服务),相当于一个网关,内部同时做两件独立通道的转发,分别是RPC 通道和Monitor/Serial 日志透传通道(打印 log),对外就是一个socket,路径是/var/run/arduino-router.sock
标准包格式:
[*]type=0:REQUEST 请求(Linux 调用 MCU 函数,我们现在用这个)
[*]type=1:RESPONSE 应答
[*]type=2:NOTIFY 单向通知,不需要返回
所以python或其他语言只要按这个协议组包就能进行交互了。
mcu这边也有对应的router实现,在Zephyr RTOS中Bridge.registerFunction();注册函数。回调在后台 RPC 线程执行。重点就是使用Arduino_RouterBridge.h库,还有个Monitor.h库用来做调试打印。
那么可以使用的一个开发流程如下:
硬件 UART → arduino-router(Linux 后台服务)→ Unix Socket + Msgpack-RPC → Linux 侧程序(Python/C++/bridge-cli)<--> MCU 侧 Bridge 库。 计划开发一个如下的交互程序
Python脚本 → 连接 /var/run/arduino-router.sock
↓(发送msgpack-rpc请求包:调用show_text,参数字符串)
arduino-router服务(Linux)
↓(通过内部硬件UART转发二进制包给STM32U585)
MCU Bridge库收到RPC包 → 识别到是provide_safe注册的show_text
↓(把回调任务放进安全队列,等待主线程调度)
loop() 里 Bridge.poll() → 取出队列任务,执行 onRecvText(msg)
↓
Monitor.println → 日志流,再反向经过UART、router转发给电脑IDE串口监视器 再根据原理进行编码,使用Arduino IDE 2.0以上版本,旧版本支持不全哦。写入如下代码
#include <Arduino_RouterBridge.h>
#include <Monitor.h>
// 回调函数:Linux侧调用 show_text 时触发
void onRecvText(String msg)
{
Monitor.print("收到Linux发来文本:");
Monitor.println(msg);
}
void setup() {
Monitor.begin();
Bridge.begin();
Bridge.provide_safe("show_text", onRecvText);
}
void loop() {
delay(100);
}
然后编译上传,MCU程序就运行了,等待Linux侧的消息。
接下来Linux侧, 简单验证就使用python,需要安装msgpack库,先安装pip3包管理会方便些,安装过程会慢一些
继续,编辑python代码,使用socket和msgpack 依赖。 连接好socket,然后组好协议包发送即可
import socket
import msgpack
# 官方正确路径
SOCK = "/var/run/arduino-router.sock"
def rpc_call(method_name, arg):
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
sock.connect(SOCK)
# msgpack-rpc标准包:
packet = ]
sock.sendall(msgpack.packb(packet))
res_raw = sock.recv(4096)
resp = msgpack.unpackb(res_raw)
sock.close()
return resp
if __name__ == "__main__":
result = rpc_call("show_text", "Message from Python")
print("RPC返回包:", result) 运行pyhton程序,mcu程序早已等待这里,打开串口可以看到显示了python程序发送的字符串内容
流程验证暂时没问题。后面继续使用该方式进行功能开发。官方提供的底层交互方式还是比较方便的。对比cpu内部多核rpc,使用了一个硬件串口链路,但两部分独立开发也似乎更好解耦。板子有两排的高密度排针进行外设扩展,看看怎么方便引出来使用。
页:
[1]