BIGGGG 发表于 2024-1-12 13:55:41

大佬们,问一个代码逻辑的问题【标题不合格】

情况介绍:MCU给模块发AT指令,我必须得等模块回复我数据,并且判断回复的数据,我才可以发送下一条指令
问题:目前是写代码,测试阶段,已经嵌套了四层if了,我想让我的代码简洁点,有没有其他逻辑可以用,因为要是按照现在这个逻辑下去,可能到最后大概得嵌套大概十层
回复的数据,大部分都是OK,只是有一两条不是OK
谢谢大佬,今年刚毕业 之前没碰见过这种情况

aammoo 发表于 2024-1-12 14:16:21

用状态机

albert_w 发表于 2024-1-12 14:31:19

这东西就是不好写。
封装起来,出错就return拉拉倒呗
别说单片机不好写,命令行自动化交互工具都不好写,所以出来个Expect,用于这类交互。
我觉得可以参考Linux的拨号工具那一套,找找灵感。

但是,单片机,一般发送后赶紧让出时间片给别的任务,不能死等呢

t3486784401 发表于 2024-1-12 14:49:42

使用 continue,return 可在一定程度上减轻 if 嵌套。

xmlbb 发表于 2024-1-12 15:13:02

不能正确嵌套,要异常嵌套
send("xxx")
if(recv()==fail){
//错误处理
return ;
}
//正确处理
send("yyy")
if(recv()==fail){
//错误处理
return ;
}
//正确处理

wshtyr 发表于 2024-1-12 15:21:38

本帖最后由 wshtyr 于 2024-1-12 15:23 编辑

用事件驱动的状态机
事件可以是定时器,也可以是收到的特定数据

裸机:
用标志位代表事件,事件在串口接收中断里产生。有事件就执行下一步操作,切换状态,没事件就跳过,运行其它逻辑。全程可以无阻塞。

有OS:
用OS类似标志位的线程同步机制,事件在串口接收中断或接收线程里产生。状态机线程有事件就执行下一步操作,切换状态,没事件就挂起,让出CPU给其它逻辑。

wxws 发表于 2024-1-12 15:24:21

去 看一下 arduino的 at 库吧。

BIGGGG 发表于 2024-1-12 15:31:49

xmlbb 发表于 2024-1-12 15:13
不能正确嵌套,要异常嵌套
send("xxx")
if(recv()==fail){
(引用自5楼)

好的我去试试

BIGGGG 发表于 2024-1-12 15:32:07

wshtyr 发表于 2024-1-12 15:21
用事件驱动的状态机
事件可以是定时器,也可以是收到的特定数据

(引用自6楼)

OKOKOK 我去弄一弄

BIGGGG 发表于 2024-1-12 15:32:35

wxws 发表于 2024-1-12 15:24
去 看一下 arduino的 at 库吧。
(引用自7楼)

我周末看一看

qwe2231695 发表于 2024-1-12 15:38:05

规划状态机,在不同状态之间转移。

初音之恋 发表于 2024-1-12 16:38:56

if return continue goto都行

armok. 发表于 2024-1-12 17:15:51

“大佬们,问一个代码逻辑的问题”标题不合格。请自行修正。

帖子标题必须能充分说明帖子的内容。如你要问AVR的ADC如何才能测量得比较准确,“AVR的ADC如何消除干扰测量得比较准确?”是合格的标题。不合格举例:
    1:小女子冰天雪地裸体跪求解决方法
    2:救命啊...
    3:高手请出招,一个无法解决的AVR问题
    4:一个困扰学习单片机初学者,惊动单片机开发者的难题
    5:AVR的ADC测量   (点评:你到底是问问题,或是有技术心得与大家分享?)

shawn_bu 发表于 2024-1-12 17:22:14

状态机就很合适啊
页: [1]
查看完整版本: 大佬们,问一个代码逻辑的问题【标题不合格】