找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

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

查看数: 4125 | 评论数: 4 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2021-5-18 22:44

正文摘要:

#include <Metro.h>复制代码  arduino单片机驱动步进电机,同时通过单片机的软串口读取一台设备的数据,    因为这两个任务要同时进行,每个任务都有delay,delay堵塞影响其它任务,所以我 ...

回复

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. }
复制代码
ID:894800 发表于 2021-5-19 12:35
devcang 发表于 2021-5-19 09:20
要做到高精度,就不是那么简单的了。 中断可以减少延时带来的坏处。

请问中断是通过attachInterrupt()函数实现吗?还是通过定时器
ID:844772 发表于 2021-5-19 11:07
arduino的delay()和软串口应该都用了time0,也就是说你要是使用软串口等中断服务,就别使用delay(),这也不麻烦,可以用循环替代。
ID:277550 发表于 2021-5-19 09:20
要做到高精度,就不是那么简单的了。 中断可以减少延时带来的坏处。

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

Powered by 单片机教程网

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