极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 14171|回复: 9

串口数据问题

[复制链接]
发表于 2012-9-25 09:11:28 | 显示全部楼层 |阅读模式
   最近小弟在用串口通信时发现个问题,当我对串口发送数据时,总是每次循环过后之前发送的数据就被删掉了,不能保持直到我下一个数据传进来,不知道怎么才能让我上次的数据可以保持到我下次对串口发送数据,请各位高手大神指点指点啊
  1. void loop()
  2. {
  3.   ch=Serial.read();
  4.     if(ch=='1') //发送1时执行下面程序
  5.    {
  6.       gradual_change();
  7.     }
  8.     else if(ch=='2')//发送2时执行下面程序
  9.     {
  10.       twinkle();
  11.     }
  12.     else//其余情况执行下面程序
  13.     {
  14.        digitalWrite(Blue,HIGH);
  15.     }
  16. }
复制代码
每次发过后,只执行一次应该执行的,之后一直是在else中,请各位指导指导
感激不尽呀!!!!!!!
回复

使用道具 举报

发表于 2012-9-25 10:52:57 | 显示全部楼层
想了半个小时 终于想出来了 已测试 我直接上我的测试代码得了 自己看
  1. int flag ; //标志位
  2. char ch;
  3. void setup()
  4. {               
  5. Serial.begin(9600);
  6.   pinMode(13, OUTPUT);     
  7. }

  8. void loop()
  9. {
  10.   if (Serial.available()>0) //如果有数据传入
  11.     {flag  = 0;}

  12.   ch=Serial.read();
  13. if(ch=='1'||flag==1) //发送1时执行下面程序
  14.    {
  15.   digitalWrite(13, HIGH);   // 使Led亮
  16.   delay(200);              // 持续1秒钟
  17.   digitalWrite(13, LOW);    // 使Led灭
  18.   delay(200);              // 持续1秒钟。

  19.       flag  = 1;
  20.     }
  21.     else if(ch=='2'||flag==2)//
  22.     {
  23.   digitalWrite(13, HIGH);   // 使Led亮
  24.   delay(1000);              // 持续1秒钟
  25.   digitalWrite(13, LOW);    // 使Led灭
  26.   delay(1000);              // 持续1秒钟。

  27.       flag  = 2;

  28.     }
  29.     else//其余情况执行下面程序
  30.     {
  31.        digitalWrite(13,HIGH);
  32.     }

  33. }
复制代码


思路就是设立标志位

评分

参与人数 1 +1 收起 理由
弘毅 + 1 很给力!

查看全部评分

回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-9-26 22:40:02 | 显示全部楼层
anfe09 发表于 2012-9-25 10:52
想了半个小时 终于想出来了 已测试 我直接上我的测试代码得了 自己看
int flag ; //标志位
char ch;

{:2_27:}太有帮助了  真的是十分感谢呀  困扰了我好几天
回复 支持 反对

使用道具 举报

发表于 2012-10-7 11:56:27 | 显示全部楼层
if (Serial.available()>0) //如果有数据传入

在这一句下面加一个大括号包进前一部分程序就行了...可以不用标志位...
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-10-7 13:08:12 | 显示全部楼层
anfe09 发表于 2012-9-25 10:52
想了半个小时 终于想出来了 已测试 我直接上我的测试代码得了 自己看
int flag ; //标志位
char ch;

为什么我需要打上一串个1才能实现1是的循环呢?
2的循环也是呀!
这是怎么回事呀?
回复 支持 反对

使用道具 举报

发表于 2012-10-7 14:45:34 | 显示全部楼层

int ledon = 13;
char ch;
char flag = 0;
void setup()
{
  Serial.begin(9600);
  pinMode(ledon,OUTPUT);
}
void loop()
{
  if(Serial.available())  //串口收到数据;
  {
    ch = Serial.read();
    if(ch == '1') flag = 1;
    else if(ch == '2') flag = 2;
    else flag = 0;
  }

    if(flag == 1)    //led亮1s;
    {
      digitalWrite(ledon,HIGH);
      delay(1000);
      digitalWrite(ledon,LOW);
      delay(1000);
    }
    else if(flag == 2)  //led亮2s;
    {
      digitalWrite(ledon,HIGH);
      delay(2000);
      digitalWrite(ledon,LOW);
      delay(1000);
    }
    else
    {
      digitalWrite(ledon,LOW);  //led灭;
    }
}
都是借鉴,在楼上的基础上稍稍改了下,希望对你有所帮助
回复 支持 反对

使用道具 举报

发表于 2012-10-7 15:51:40 | 显示全部楼层
星_star_雲 发表于 2012-10-7 13:08
为什么我需要打上一串个1才能实现1是的循环呢?
2的循环也是呀!
这是怎么回事呀?

没看懂啥意思 你看六楼的 六楼写的很好
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-10-8 14:42:51 | 显示全部楼层
本帖最后由 星_star_雲 于 2012-10-8 15:18 编辑

为什么还是只执行一次呀,就是当我输入1时led亮1秒,灭1秒,之后就执行的是else里的语句呀????????




我用Serial.println(flag)测试了一下,发现输出的全部是0,当我输入1之后,只有一个1秒的间隔,接着输出的仍然是0,无法让flag保持在1上....这是怎么回事呢??????{:soso_e134:}
回复 支持 反对

使用道具 举报

发表于 2013-2-8 15:22:51 | 显示全部楼层
Tim 发表于 2012-10-7 14:45
int ledon = 13;
char ch;
char flag = 0;

但是如果想要3位数字控制呢?我试验了好久,就是没成功!
回复 支持 反对

使用道具 举报

发表于 2013-4-12 15:39:21 | 显示全部楼层
highplay86 发表于 2012-10-7 11:56
if (Serial.available()>0) //如果有数据传入

在这一句下面加一个大括号包进前一部分程序就行了...可以不 ...

严重同意,不过俺没验证。
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-4 10:47 , Processed in 0.044904 second(s), 24 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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