小R科技-WIFI机器人网·机器人创意工作室

 找回密码
 立即注册
查看: 10070|回复: 3

arduino小车串口接收和执行指令的中断方式是怎么样的?

[复制链接]
发表于 2016-2-23 21:10:12 | 显示全部楼层 |阅读模式
在arduino小车的下位机源代码wifi_robots.ino中,主函数loop如下:
  1. void loop()
  2. {  
  3.     while(1)
  4.     {
  5.         Get_uartdata();
  6.         UartTimeoutCheck();
  7.     }
  8. }
复制代码
其中:Get_uartdata();是接收串口数据的函数。
本人在使用过程中发现一个问题:如果PC端一直按着前进键(W),小车会一直前进。然后马上换成左转或右转(D)键,小车就会卡一下,大概过1秒,才执行D键的效果。
我曾经认为,这是无法连续识别按键的问题。
但是,如果无法连续识别按键,为什么按着W键,就会一直保持前进呢?
所以现在比较疑惑这是什么缘故?如果想要连续,该怎么修改?

有几个问题:
1.主函数中,UartTimeoutCheck()这个函数看不太懂,它的作用是不是将某个按键的效果保持一段时间?其中的costtime是什么含义?
2.这个小车识别指令的中断方式是什么样子的?为什么会产生上述不连续的现象?要如何克服这个现象使之能够连续动作?


由于是非编程专业的小白,代码都只是涉猎,为了实现上述连续动作,想了许久也不知道怎么改写。希望能详尽指点一二,不甚感激!!
回复

使用道具 举报

发表于 2016-2-24 11:49:29 | 显示全部楼层
其实代码 原理和51duino是一样的,都是接收到特定的动作指令后,让Arduino主板的指定管脚电平变高或变低,在下一个指令到来改变管脚电平之前,芯片会始终保持当前管脚的状态,也就是小车保持当前的运动动作。
串口问题,Arduino的串口其实是很糟糕的机制,他是轮询方式读取,当然底层也是中断,但是上层的轮询导致执行效率不如51duino的中断,具体体现就是有延迟现象,因此如果你要快速让小车响应,要么删去loop函数里面无关的其他代码,让轮询时间减短,要么修改底层C代码,直接在中断里面执行逻辑。
UartTimeoutCheck()是一个检测串口是否接收超时的函数,由于一些客观原因,可能串口数据下来后,只接受到一小部分,后面的丢包了,此时加入这个机制进行超时检测,如果长时间没有收到符合规范的数据包,则默认接收到的是垃圾包,直接丢弃,准备下一轮接收。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-2-24 11:57:15 | 显示全部楼层
  1. void UartTimeoutCheck(void)
  2. {
  3.     if(rec_flag == 1)
  4.     {
  5.        //Nowtime = millis();
  6.        Costtime++;  
  7.       if(Costtime == 100000)
  8.       {
  9.            rec_flag = 0;
  10.       }
  11.     }
  12.    // Uartcount++;
  13. }
复制代码

costtime一直到100000,是不是耗时长就是十万个机器周期
回复 支持 反对

使用道具 举报

发表于 2016-2-25 22:23:08 | 显示全部楼层
我是小白,我的理解:按键版上位机中对按键释放应该是发送“停止”指令,如果你要提高效率,可以采用放弃该中间过度指令,而直接切换到左转或者右转,另外指定一个停止的按键即可。理论上效率会提高,你可以测试一下。
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

新品特惠推荐上一条 /2 下一条

QQ|QQ技术咨询1|QQ技术咨询2|商务合作微信1:xiaorgeek001|商务合作微信2:XiaoRGEEK|诚聘英才|Archiver|手机版|小R科技-WIFI机器人网·机器人创意工作室 ( 粤ICP备15000788号-6 )

GMT+8, 2024-11-26 17:54 , Processed in 1.106424 second(s), 20 queries .

Powered by XiaoR GEEK X3.4

© 2014-2021 XiaoR GEEK

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