找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3195|回复: 4
收起左侧

arduino delay堵塞延时问题,大家进来看看吧,哭唧唧

[复制链接]
ID:894800 发表于 2021-5-18 22:44 | 显示全部楼层 |阅读模式
  1. #include <Metro.h>
复制代码
  arduino单片机驱动步进电机,同时通过单片机的软串口读取一台设备的数据,
   因为这两个任务要同时进行,每个任务都有delay,delay堵塞影响其它任务,所以我使用了多线程。
  尝试过scoop库,chrono库定义节拍,Mstimer中断,只有这个metro库初步调试成功,电机可正常运行,但产生脉冲的时间6.4s还是影响了读取数据,本想500毫秒读取一次数据,结果7秒一次。

附几个疑问:
1.使用单片机的软串口库读数据,无论设置采样周期多少,都会加上1秒,这是为何?详见我求助帖子
2.tone函数产生脉冲   tone(pin, frequency, duration),第三个参数设置周期,为何要再加延时才生效?
  1. tone(7, 440, 200);  //7号引脚发声200毫秒 ,440HZ
  2. delay(200);
复制代码
这个delay函数卡了我一个星期了,我这个菜鸡崩溃了。马上去学中断,听说这个也是一种方法。


< 刷到这个帖子大家随便留言,你的任何留言都是对我的鼓励,十分感谢大家指导。 (鞠躬)>
1.png





回复

使用道具 举报

ID:277550 发表于 2021-5-19 09:20 | 显示全部楼层
要做到高精度,就不是那么简单的了。 中断可以减少延时带来的坏处。
回复

使用道具 举报

ID:844772 发表于 2021-5-19 11:07 | 显示全部楼层
arduino的delay()和软串口应该都用了time0,也就是说你要是使用软串口等中断服务,就别使用delay(),这也不麻烦,可以用循环替代。
回复

使用道具 举报

ID:894800 发表于 2021-5-19 12:35 | 显示全部楼层
devcang 发表于 2021-5-19 09:20
要做到高精度,就不是那么简单的了。 中断可以减少延时带来的坏处。

请问中断是通过attachInterrupt()函数实现吗?还是通过定时器
回复

使用道具 举报

ID:894800 发表于 2021-5-19 12:39 | 显示全部楼层
程序在这里,粗心的我
  1. [em01]
  2. #include <Metro.h>
  3. #include <SoftwareSerial.h>      
  4. SoftwareSerial DLSerial(2, 3); // 软串口 RX(D2), TX(D3) 红
  5. String stringOne="";//存储接收的“+5.5019e+06,BIN00”      

  6. Metro blink1Metro = Metro(1000);   //把 blink1Metro 实例化 Metro 对象 ,并设置间隔时间
  7. Metro blink2Metro = Metro(1000);     //把 blink2Metro 实例化 Metro 对象 ,并设置间隔时间

  8. void setup(){
  9. DLSerial.begin(38400); //设备波特率38400     
  10. Serial.begin(9600) ;//默认串口波特率9600   
  11. pinMode(7,OUTPUT); // Step   
  12. pinMode(6,OUTPUT); // Dir  方向
  13. }

  14. void loop(){

  15.   if(blink1Metro.check()){  //检查blink1Metro间隔(我的理解是计时器每隔100毫秒就会返回true,就执行以下程序)
  16.   digitalWrite(6,HIGH); // 方向拉高     
  17.     for(int x = 0; x < 6400; x++) // Loop 2000 times     //6400  
  18.     {     
  19.         digitalWrite(7,HIGH); //  
  20.      delayMicroseconds(250); // Wait   ms  
  21.     digitalWrite(7,LOW); //  
  22.      delayMicroseconds(250); // Wait  ms  250 2000HZ 周期0.5ms
  23.      //正转   
  24.     }  
  25.       //delay(1000); //  
  26.             
  27.      digitalWrite(6,LOW); // Set Dir high      
  28.     for(int x = 0; x < 6400; x++) // Loop 6400 times   
  29.     {     
  30.         digitalWrite(7,HIGH); //  
  31.      delayMicroseconds(250); // Wait  ms     
  32.     digitalWrite(7,LOW); //  
  33.      delayMicroseconds(250); // Wait   ms   
  34.     }  
  35.      // delay(1000);
  36. }

  37.   
  38.   if(blink2Metro.check()){  
  39.     int val=analogRead(0);//读取模拟接口0 的值,并将其赋给val
  40. Serial.println(val);//显示出val 的值 Serial.println(val,DEC);     

  41. DLSerial.write("fetch?"); //发送字节数据      
  42. delay(500); //延时500ms   
  43. if (DLSerial.available()>0) //如果缓存中有接收到的数据     
  44. {      
  45.     String stringOne = DLSerial.readString(); //读取软串口数据赋给字符串stringOne      
  46.     Serial.print(stringOne);  //通过串口发到PC      
  47. }         
  48.   }
  49. }
复制代码
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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