OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4817|回复: 11

使用上位机发送命令打断单片机当前正在执行的命令该怎么做?

[复制链接]

17

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
160
金钱
160
注册时间
2019-11-12
在线时间
21 小时
发表于 2021-1-3 16:36:03 | 显示全部楼层 |阅读模式
1金钱
使用一个按键控制两个灯,按键按第一次,红灯亮一段时间熄灭,按键按第二次,黄灯亮一段时间熄灭,两个灯亮的时间长短由上位机通过串口向单片机发送数据来决定,上位机输入有两个命令,001  1000为设置延时时间,010为紧急停止,想实现在灯亮的时候,发送010,就可以熄灭灯,而不是等到延时完再熄灭,但是在我的程序中,当按键按下,灯持续亮的过程中,发送010并不能让等立即熄灭,而是等延时时间完成才会熄灭灯,请问各位前辈,该怎么做,才能实现紧急停止呢?请各位前辈指点一二,以下是我的while循环中的程序。 捕获.JPG 捕获1.JPG

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

114

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2583
金钱
2583
注册时间
2019-10-18
在线时间
414 小时
发表于 2021-1-3 20:07:46 | 显示全部楼层
新手么
是,那么就暴力解决,接收到010,直接控制灯灭,也就是led=1,串口内直接操作
不是新手,那就程序换个架构.
回复

使用道具 举报

7

主题

175

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1327
金钱
1327
注册时间
2019-7-11
在线时间
165 小时
发表于 2021-1-4 08:47:02 | 显示全部楼层
把串口命令解析和动作执行分开 每个小功能都写成单独的函数 串口命令解析里面负责各种标志位和状态的更新 动作执行负责根据标志和状态执行相关的动作 while循环里面根据标志和状态调用相关的动作执行模块
世界和平
回复

使用道具 举报

17

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
160
金钱
160
注册时间
2019-11-12
在线时间
21 小时
 楼主| 发表于 2021-1-4 09:10:37 | 显示全部楼层
decai 发表于 2021-1-3 20:07
新手么
是,那么就暴力解决,接收到010,直接控制灯灭,也就是led=1,串口内直接操作
不是新手,那就程序换个架 ...

我的程序是在接收到010就直接控制灯灭,但是不会执行灯熄灭的命令,还是会等延时再熄灭,如果换个框架,要怎么设计呢?您能指点一下思路嘛?
回复

使用道具 举报

2

主题

582

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2690
金钱
2690
注册时间
2014-5-23
在线时间
188 小时
发表于 2021-1-4 10:08:22 | 显示全部楼层
加个串口中断,串口中断里添加标志
回复

使用道具 举报

17

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
160
金钱
160
注册时间
2019-11-12
在线时间
21 小时
 楼主| 发表于 2021-1-4 11:14:05 | 显示全部楼层
礼拜天真好 发表于 2021-1-4 08:47
把串口命令解析和动作执行分开 每个小功能都写成单独的函数 串口命令解析里面负责各种标志位和状态的更新  ...

假如while循环在执行前一个动作尚未完成时,串口发送了新命令要求停止当前动作,我理解的是此时while循环中正在执行前一个动作,只有当这个动作完成了,才会进行下一次的标志位状态判断与执行,所以在while循环中,总是每一次动作完成之后,执行串口的下一个动作,那就做不到通过串口打断前一个动作了,我也不知道理解的对不对,不对的地方请您指点纠正
回复

使用道具 举报

17

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
160
金钱
160
注册时间
2019-11-12
在线时间
21 小时
 楼主| 发表于 2021-1-4 11:18:11 | 显示全部楼层
awsawzj 发表于 2021-1-4 10:08
加个串口中断,串口中断里添加标志

我在串口中断中主要是用来接收上位机发来数据,命令和数据在while循环中进行判断,您说的添加标志,是用来标志什么呢?没有想明白,希望您能指点一下
回复

使用道具 举报

12

主题

3402

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8688
金钱
8688
注册时间
2020-5-11
在线时间
4174 小时
发表于 2021-1-4 13:10:15 | 显示全部楼层
状态机了解一下,
如:
char state=0;int time=0;//全局变量
void timer(void)//定时中断调用
{
if(time)//倒计时
{
   time--;
   if(state==1)红灯亮;
   if(state==2)黄灯亮;
}
else
{
   红灯灭;
   黄灯灭;
}
}
串口中断里根据指令对state和time进行操作。
专治疑难杂症
回复

使用道具 举报

7

主题

175

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1327
金钱
1327
注册时间
2019-7-11
在线时间
165 小时
发表于 2021-1-5 08:50:11 | 显示全部楼层
懒酱酱0609 发表于 2021-1-4 11:14
假如while循环在执行前一个动作尚未完成时,串口发送了新命令要求停止当前动作,我理解的是此时while循环 ...

理论上来说你可以在串口中断里面把程序指针重新指向while循环,这相当于真正停止了当前动作
世界和平
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2021-1-5 11:00:56 | 显示全部楼层
别用延时控制灯啥事都没有了
回复

使用道具 举报

233

主题

961

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1815
金钱
1815
注册时间
2011-10-9
在线时间
230 小时
发表于 2021-1-5 13:49:03 | 显示全部楼层
那不简单么 在延时中插入检测命令标志的程序  每1ms 检查一次  有标志就退出延时 执行新状态
回复

使用道具 举报

56

主题

343

帖子

0

精华

高级会员

Rank: 4

积分
977
金钱
977
注册时间
2016-3-8
在线时间
267 小时
发表于 2021-1-5 22:21:34 | 显示全部楼层
除了初始化程序中,其余延时定时都尽量不要用delay。
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-24 20:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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