找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2526|回复: 3
打印 上一主题 下一主题
收起左侧

一个Arduino loop()语句的疑问,请指点

[复制链接]
跳转到指定楼层
楼主
ID:618619 发表于 2019-10-5 20:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我在本论坛发过一个上下位机arduino通过iic互传数据的程序,我对里面的这段代码
//主程序
void loop()
{
  delay(100);//延时
}
有点疑惑,我认为程序会卡在那里不动,然而今天找了两个arduino板子试了一下,居然是可以完成预期通信效果的,这是为啥,为啥loop这里卡不住程序?请指点。

  1. /*循环接受主机发送来的数据包,同时显示在串口监视器上
  2. 把数据包的最后一个字节,再上传回主机
  3. */
  4. #include <Wire.h>//声明I2C库文件
  5. int x;//变量x值决定主机的LED是否点亮
  6. //初始化
  7. void setup()
  8. {
  9.   Wire.begin(4);                // 加入 i2c 总线,设置从机地址为 #4
  10.   Wire.onReceive(receiveEvent); //注册接受到主机字符的事件
  11.   Wire.onRequest(requestEvent); // 注册主机通知从机上传数据的事件
  12.   Serial.begin(9600);           //设置串口波特率
  13. }
  14. //主程序
  15. void loop()
  16. {
  17.   delay(100);//延时
  18. }

  19. // 当从机接受到主机字符,执行该事件
  20. void receiveEvent(int howMany)
  21. {
  22.   while( Wire.available()>1) // 循环执行,直到数据包只剩下最后一个字符
  23.   {
  24.     char c = Wire.receive(); // 作为字符接受字节
  25.     Serial.print(c);         // 把字符打印到串口监视器中
  26.   }
  27.   //接受主机发送的数据包中的最后一个字节
  28.   x = Wire.receive();    // 作为整数接受字节
  29.   Serial.println(x);    //把整数打印到串口监视器中,并回车
  30. }

  31. //当主机通知从机上传数据,执行该事件
  32. void requestEvent()
  33. {
  34.   //把接受主机发送的数据包中的最后一个字节再上传给主机
  35.   Wire.send( x); // 响应主机的通知,向主机发送一个字节数据
  36. }
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:8222 发表于 2019-10-5 23:37 | 只看该作者
这只是一个延时程序,延时时间一到,就会往下执行别的语句。
回复

使用道具 举报

板凳
ID:618619 发表于 2019-10-6 08:23 | 只看该作者
温xyz 发表于 2019-10-5 23:37
这只是一个延时程序,延时时间一到,就会往下执行别的语句。

单片机里头 这个是表示循环的,在我的理解里,loop() {},相当于 while(1) {}
回复

使用道具 举报

地板
ID:618619 发表于 2019-10-7 12:21 | 只看该作者
哪位大佬能解释,奉送十个黑币。。。

评分

参与人数 1黑币 +8 收起 理由
杨雪飞 + 8 同样的疑问

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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