硬汉嵌入式论坛

 找回密码
 立即注册
查看: 460|回复: 17
收起左侧

[技术讨论] 串口解析指令

[复制链接]

2

主题

12

回帖

18

积分

新手上路

积分
18
发表于 2024-2-21 10:16:18 | 显示全部楼层 |阅读模式
本帖最后由 YinFu 于 2024-2-21 10:18 编辑

输入mode正常打开灯,输入modx正常关灯,输入mod要输入两次,最上面if是不是把这个情况给排除掉了,进不来,usstatus一直为3,我测试了一下第一次输入mod没反应,第二次输入mode应该开灯,实际情况是关灯,这个有点bug,这个咋优化一下,求指点
1.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
发表于 2024-2-21 10:39:55 | 显示全部楼层
ucStatus做初始化数组了吧
回复

使用道具 举报

2

主题

12

回帖

18

积分

新手上路

积分
18
 楼主| 发表于 2024-2-21 10:45:52 | 显示全部楼层
eric2013 发表于 2024-2-21 10:39
ucStatus做初始化数组了吧

没,就uint8_t ucStatus = 0;  没用数组,简单的挨个接收,mod是三个字符,第一次发到不了最下面的关灯,第二次进去直接先进的关灯那里
回复

使用道具 举报

2

主题

12

回帖

18

积分

新手上路

积分
18
 楼主| 发表于 2024-2-21 10:48:22 | 显示全部楼层
eric2013 发表于 2024-2-21 10:39
ucStatus做初始化数组了吧

我要接受多种指令,hex指令,字符串指令不同的指令,这种写法是不是代码要写很多重复的
回复

使用道具 举报

75

主题

684

回帖

909

积分

金牌会员

积分
909
发表于 2024-2-21 11:37:22 | 显示全部楼层
第一次输入mod,状态进入3,加下来mode,第一个m在状态3里面用掉了,并且判定为关灯,回到状态0, 剩下的ode一直在状态0哪儿
回复

使用道具 举报

2

主题

12

回帖

18

积分

新手上路

积分
18
 楼主| 发表于 2024-2-21 11:39:22 | 显示全部楼层
庄永 发表于 2024-2-21 11:37
第一次输入mod,状态进入3,加下来mode,第一个m在状态3里面用掉了,并且判定为关灯,回到状态0, 剩下的ode ...

是的,和目的有冲突,输入mode应该是开灯
回复

使用道具 举报

2

主题

12

回帖

18

积分

新手上路

积分
18
 楼主| 发表于 2024-2-21 12:06:16 | 显示全部楼层
这是用数组接收了一下,再判断。这样MODEMODE也给判断正确了,包含了MODE灯也会快速闪烁一下,HEX指令有报头报尾比较好判断,不定长字符串有点麻烦
2.png
回复

使用道具 举报

2

主题

12

回帖

18

积分

新手上路

积分
18
 楼主| 发表于 2024-2-21 13:25:10 | 显示全部楼层
这是用数组接收,只要字符串包含MODE就熄灭,不知道有没有方法精准检测MODE,比如DMODEF这种排除掉 2.png
回复

使用道具 举报

11

主题

36

回帖

69

积分

初级会员

积分
69
发表于 2024-2-21 13:36:20 | 显示全部楼层
还不如mode1和mode2来区分
回复

使用道具 举报

3

主题

120

回帖

129

积分

初级会员

积分
129
发表于 2024-2-21 13:48:54 | 显示全部楼层
意思是输入mode开灯,mod或者mod*关灯吗?要求第一次输入是mod关灯,第二次输入是mode关灯,是这样吗。单片机 实际收到的是modmode,这个需要case3加个判断m
回复

使用道具 举报

5

主题

192

回帖

212

积分

高级会员

积分
212
发表于 2024-2-21 14:15:28 | 显示全部楼层
你这个是一串数据的字符串可以使用 memcmp 函数 或者 strncmp 函数解析。就不用这个多的case了
回复

使用道具 举报

3

主题

120

回帖

129

积分

初级会员

积分
129
发表于 2024-2-21 14:23:16 | 显示全部楼层
modmode,这个算mod*还是算mode,没搞懂楼主要实现啥
回复

使用道具 举报

75

主题

684

回帖

909

积分

金牌会员

积分
909
发表于 2024-2-21 14:53:31 | 显示全部楼层
YinFu 发表于 2024-2-21 11:39
是的,和目的有冲突,输入mode应该是开灯

你这是输入不合法呀,你要对不合法的输入做处理吗?
回复

使用道具 举报

2

主题

12

回帖

18

积分

新手上路

积分
18
 楼主| 发表于 2024-2-21 15:45:52 | 显示全部楼层
skyshine 发表于 2024-2-21 14:23
modmode,这个算mod*还是算mode,没搞懂楼主要实现啥

只输入mode这四个字符是开灯,其他的都是关灯(包含mode的也关灯),不用数组单个字节判断也就是第一个图的程序,烧录完默认开灯,我输入mod,应该是关灯的,但是程序if那里空是进不来的,所以灯依然亮,第二次我发mode,按理说应该灯依然亮,实际上是灭的,第二次指令是延续了第一次的,没有单独读取mode指令,我把第一个图程序改成数组了,单个读取容易卡在那个位置,而且我感觉那样写如果要读取多条不同指令代码要一大堆
回复

使用道具 举报

2

主题

12

回帖

18

积分

新手上路

积分
18
 楼主| 发表于 2024-2-21 16:01:22 | 显示全部楼层
旮旯旭 发表于 2024-2-21 14:15
你这个是一串数据的字符串可以使用 memcmp 函数 或者 strncmp 函数解析。就不用这个多的case了

这样只能比较前四个字符,硬汉哥这程序思路是一个一个取,没用数组,不知道是不是我理解错了
回复

使用道具 举报

2

主题

12

回帖

18

积分

新手上路

积分
18
 楼主| 发表于 2024-2-21 16:10:05 | 显示全部楼层
庄永 发表于 2024-2-21 14:53
你这是输入不合法呀,你要对不合法的输入做处理吗?

我是想只输入mode四个字符才开灯,其他的全关灯,现在改成放数组里了
回复

使用道具 举报

3

主题

120

回帖

129

积分

初级会员

积分
129
发表于 2024-2-21 17:13:01 | 显示全部楼层
YinFu 发表于 2024-2-21 15:45
只输入mode这四个字符是开灯,其他的都是关灯(包含mode的也关灯),不用数组单个字节判断也就是第一个图 ...

还是直接加接收超时判断算了,超时时间到了视为接收完毕,之后处理数组,满足条件就开灯,否则就关灯。一开始的帖子是状态机,有数据就继续判断,对modmode这个情况不好处理,可能会出现只输入一次但出现开关开的情况
回复

使用道具 举报

3

主题

120

回帖

129

积分

初级会员

积分
129
发表于 2024-2-21 17:17:22 | 显示全部楼层
这个状态机如果不另外做超时处理的话,会保留上一次的状态,每次输入都按上次状态继续判断
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-30 00:24 , Processed in 0.306310 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表