星_star_雲 发表于 2012-9-25 09:11:28

串口数据问题

   最近小弟在用串口通信时发现个问题,当我对串口发送数据时,总是每次循环过后之前发送的数据就被删掉了,不能保持直到我下一个数据传进来,不知道怎么才能让我上次的数据可以保持到我下次对串口发送数据,请各位高手大神指点指点啊void loop()
{
ch=Serial.read();
    if(ch=='1') //发送1时执行下面程序
   {
      gradual_change();
    }
    else if(ch=='2')//发送2时执行下面程序
    {
      twinkle();
    }
    else//其余情况执行下面程序
    {
       digitalWrite(Blue,HIGH);
    }
}每次发过后,只执行一次应该执行的,之后一直是在else中,请各位指导指导
感激不尽呀!!!!!!!

anfe09 发表于 2012-9-25 10:52:57

想了半个小时 终于想出来了 已测试 我直接上我的测试代码得了 自己看
int flag ; //标志位
char ch;
void setup()
{               
Serial.begin(9600);
pinMode(13, OUTPUT);   
}

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

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

      flag= 1;
    }
    else if(ch=='2'||flag==2)//
    {
digitalWrite(13, HIGH);   // 使Led亮
delay(1000);            // 持续1秒钟
digitalWrite(13, LOW);    // 使Led灭
delay(1000);            // 持续1秒钟。

      flag= 2;

    }
    else//其余情况执行下面程序
    {
       digitalWrite(13,HIGH);
    }

}

思路就是设立标志位

星_star_雲 发表于 2012-9-26 22:40:02

anfe09 发表于 2012-9-25 10:52 static/image/common/back.gif
想了半个小时 终于想出来了 已测试 我直接上我的测试代码得了 自己看
int flag ; //标志位
char ch;


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

highplay86 发表于 2012-10-7 11:56:27

if (Serial.available()>0) //如果有数据传入

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

星_star_雲 发表于 2012-10-7 13:08:12

anfe09 发表于 2012-9-25 10:52 static/image/common/back.gif
想了半个小时 终于想出来了 已测试 我直接上我的测试代码得了 自己看
int flag ; //标志位
char ch;


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

Tim 发表于 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灭;
    }
}
都是借鉴,在楼上的基础上稍稍改了下,希望对你有所帮助:)

anfe09 发表于 2012-10-7 15:51:40

星_star_雲 发表于 2012-10-7 13:08 static/image/common/back.gif
为什么我需要打上一串个1才能实现1是的循环呢?
2的循环也是呀!
这是怎么回事呀?

没看懂啥意思 你看六楼的 六楼写的很好

星_star_雲 发表于 2012-10-8 14:42:51

本帖最后由 星_star_雲 于 2012-10-8 15:18 编辑

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




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

wsy0315 发表于 2013-2-8 15:22:51

Tim 发表于 2012-10-7 14:45 static/image/common/back.gif
int ledon = 13;
char ch;
char flag = 0;


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

葱拌豆腐 发表于 2013-4-12 15:39:21

highplay86 发表于 2012-10-7 11:56 static/image/common/back.gif
if (Serial.available()>0) //如果有数据传入

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

严重同意,不过俺没验证。
页: [1]
查看完整版本: 串口数据问题