USART(串口通讯)是怎么接收 Orin NX 传来的高级指令的
Orin NX 负责复杂的视觉识别和力控计算,算完了只需要通过串口扔出一个小小的字母,STM32 就能瞬间通过中断“听”到,并忠实地指挥博世扳手干活。如果单片机没有“特殊机制”,它根本听不见,必须要等这 3 秒延时结束、进入下一次循环时才会去检查有没有新消息,那扳手早就把电网螺栓拧滑丝了。线接好了,但 Orin NX 是一台性能怪兽跑着 Linux 系统,STM32 只是个底层小芯片,它们俩讲话的
第一步:拉线搭桥(硬件连接的“交叉法则”)
USART 通讯之所以被称为工程师最爱的“神仙协议”,是因为它极其精简,只需要 3 根线就能让两个不同世界的芯片聊起天来:
-
GND(地线):必须把 Orin NX 的 GND 和 STM32 的 GND 连在一起。这是为了让两边有统一的电压参考标准,否则信号就是乱码。
-
TX(发送线,Transmit):负责把话“说”出去。
-
RX(接收线,Receive):负责把话“听”进来。
核心法则:交叉连接!
你想想,你对着电话筒说话(TX),对方肯定是用听筒听(RX)。所以接线时必须是交叉的:
-
Orin NX 的 TX 接到 STM32 的 RX(PA10)
-
Orin NX 的 RX 接到 STM32 的 TX(PA9)

第二步:对暗号(Baud Rate 波特率)
线接好了,但 Orin NX 是一台性能怪兽跑着 Linux 系统,STM32 只是个底层小芯片,它们俩讲话的“语速”可能完全不一样。
如果 Orin NX 像机关枪一样一秒钟发一万个字,STM32 慢吞吞地一秒钟只能听懂一百个,那听到的一定全是乱码。
所以,它们必须提前约定一个**“波特率(说话的速度)”**。
在之前 STM32CubeMX 的配置中,默认的波特率通常是 115200。
未来你在 Orin NX 上写 Python 或 C++ 代码发指令时,也必须在代码里强制规定:baudrate = 115200。这样,两个芯片的语速就完美同频了。
第三步:竖起耳朵(IT 中断机制的魔法)
这是最核心、也是最巧妙的一步软件逻辑!
你回想一下 main.c 里的那个 while(1) 死循环。单片机是个“单核单线程”的死脑筋,当它执行到 HAL_Delay(3000)(让扳手转 3 秒)的时候,它是在“原地死等”的,什么都不干。
假设就在这 3 秒里,Orin NX 突然发现扳手扭矩过大,发来了一个紧急指令:"STOP"!
如果单片机没有“特殊机制”,它根本听不见,必须要等这 3 秒延时结束、进入下一次循环时才会去检查有没有新消息,那扳手早就把电网螺栓拧滑丝了。
这个“特殊机制”,就是我们在 CubeMX 里勾选的 USART1 global interrupt(串口全局中断)。
中断(Interrupt)的通俗解释:
-
平时(
while循环): 单片机在厨房里专心炒菜(执行扳手转动逻辑)。 -
触发中断: Orin NX 突然发来一个字符
'S'。这就像是门铃突然响了! -
保存现场: 单片机会瞬间放下锅铲(暂停当前的延时或代码执行),把炉子火关小(保存当前运行状态)。
-
处理紧急事务(进入
stm32f1xx_it.c): 单片机一路小跑去开门,签收 Orin NX 发来的'S'这个快递,并把它存进一个变量里(比如Command = 'S')。 -
恢复现场: 签收完毕,单片机立刻跑回厨房,拿起锅铲,继续从刚才暂停的地方接着炒菜。
未来你的代码长什么样?
一旦有了这个中断机制,未来你电网拧螺栓的逻辑就会变得极其优雅:
Orin NX 端只需要发极简的字母:
-
发
'F'(Forward) 代表正转拧紧 -
发
'R'(Reverse) 代表反转拆卸 -
发
'S'(Stop) 代表停止
STM32 端收到字母后,存进大脑里,然后在 while(1) 循环里根据字母干活:
C
while(1) {
if (Command == 'F') {
// 执行 PA4、PA5 闭合,DAC 输出电压的动作
}
else if (Command == 'S') {
// 执行所有继电器断开,DAC 归零的动作
}
}
Orin NX 负责复杂的视觉识别和力控计算,算完了只需要通过串口扔出一个小小的字母,STM32 就能瞬间通过中断“听”到,并忠实地指挥博世扳手干活。这就叫“软硬结合”的最高境界!
更多推荐



所有评论(0)