完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
目前在用STM32做控制芯片,使用一个232串口接工业触摸屏,需要向触摸屏发送编码器的数据,但编码器在运行时,触摸屏再按下经常不起作用,但编码器不运行时,就可以。同时,还有一个485通讯,连接外围伺服控制。目前主要就是在编码器计数时,触摸屏发送与接受不能及时反应甚至不起作用。请问大家,有什么好的方法来解决,在不使用系统的情况下
|
|
相关推荐
21个回答
|
|
|
先用串口软件把数据发出来看看,看看单片机发出来了不?你获取触摸屏按键对应按下的MODBUS指令,在串口里给单片机发,看看他回不回?如果手动都不行的话,基本是单片机端的问题
|
|
|
|
|
|
估计程序里面死等太多了导致。多任务都是用状态机来切换的。不能死等。
|
|
|
|
|
|
这个任务不算多,分开调试一下就清楚了
|
|
|
|
|
|
只运行某按键触摸屏部分是正常的,既向单片机发送部分,当实时传输编码器数值时,再按键有时候不起作用,需要多次按才可以。
|
|
|
|
|
|
我是用串口的空闲中断来检测接受,接受标志置为后,再出来接受的数据。
|
|
|
|
|
|
里面涉及到延时时,不要阻塞等待
|
|
|
|
|
|
有什么好的办法吗?
|
|
|
|
|
|
stm32有些芯片有专用编码器接口,应该是很少占用单片机资源的!
|
|
|
|
|
|
把代码用状态机做成非阻塞的就可以多任务,虽然这样写起来累但是用起来爽。
|
|
|
|
|
|
里面很多人都说了,用状态机就行
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
当然可以,你可以这么理解 操作系统也是写在裸奔系统上的
|
|
|
|
|
|
状态机加时间片,就能搞定了。
|
|
|
|
|
|
可以啊,你现在用的模式是大循环模式,即前后台模式,你可以用状态机把实现一个功能的过程全部拆解,然后代码里不要让CPU空转。需要延迟的话要用定时器中断加状态机来做,多个任务,可以做多个状态机。上OS当然最好了,也可以用时间片轮询。我刚做了一个项目比你这个需求要求多了些,也没有OS,做出来效果也很好
|
|
|
|
|
|
能发下你的简单程序看看嘛?没有用过状态机。
|
|
|
|
|
|
用中断啊
|
|
|
|
|
|
****小小调度器开始**********************************************/
#ifndef _Task_H_ #define _Task_H_ #define MAXTASKS 6 //volatile //extern volatile unsigned char timers[MAXTASKS]; #define _SS static unsigned char _lc=0; switch(_lc){default: #define _EE ;}; _lc=0; return 255; #define WaitX(tickets) do {_lc=(__LINE__%255)+1; return tickets ;} while(0); case (__LINE__%255)+1: #define RunTask(TaskName,TaskID) do { if (timers[TaskID]==0) timers[TaskID]=TaskName(); } while(0); #define RunTaskA(TaskName,TaskID) { if (timers[TaskID]==0) {timers[TaskID]=TaskName(); continue;} } //前面的任务优先保证执行 #define CallSub(SubTaskName) do {unsigned char currdt; _lc=(__LINE__%255)+1; return 0; case (__LINE__%255)+1: currdt=SubTaskName;if(currdt!=255) return currdt;} while(0); //和上面是同一行,因为一行显示不下了,里面有 return 0,在执行子函数前释放了一下 CPU #define InitTasks() {unsigned char i; for(i=MAXTASKS;i>0 ;i--) timers[i-1]=0; } #define UpdateTimers() {unsigned char i; for(i=MAXTASKS;i>0 ;i--){if((timers[i-1]!=0)&&(timers[i-1]!=255)) timers[i-1]--;}} #define SEM unsigned char //初始化信号量 #define InitSem(sem) sem=0; //等待信号量 #define WaitSem(sem) do{ sem=1; WaitX(0); if (sem>0) return 1;} while(0); //里面有WaitX(0),执行的时候释放了一下 CPU //等待信号量或定时器溢出, 定时器 tickets 最大为 0xFFFE #define WaitSemX(sem,tickets) do { sem=tickets+1; WaitX(0); if(sem>1){ sem--; return 1;} } while(0); //里面有 WaitX(0),执行的时候释放了一下 CPU //发送信号量 #define SendSem(sem) do {sem=0;} while(0); //延时执行某进程 #define WaitTask(TaskID,Time) timers[TaskID] = Time //激活进程 #define ActTask(TaskID) timers[TaskID] = 1 //停止进程 #define StopTask(TaskID) timers[TaskID] = 255 //暂停执行 #define PauseSelf(); WaitX(255) /*****小小调度器结束**********************************************************************/ |
|
|
|
|
|
没有接触过这个知识 学习一下
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
651 浏览 0 评论
712 浏览 0 评论
STM32F405驱动DS1302时钟模块,输出时间错乱该怎么排查?
4375 浏览 2 评论
stm32f405rgt6驱动DS1302ZN出现时间错乱问题
3176 浏览 1 评论
stm32用fsmc读取ad7606采集数据,数据不变,只有开发版复位才更新数据
2629 浏览 0 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-10 03:58 , Processed in 2.094876 second(s), Total 110, Slave 92 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
4013