极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13404|回复: 2

串口使用serialEvent只能时入一次的问题

[复制链接]
发表于 2015-12-23 10:21:39 | 显示全部楼层 |阅读模式
这几天用serialEvent来做一个串口读问题,代码如下
void serialEvent()
{
  while (Serial.available())
  {
    char inChar = (char)Serial.read();
    if (inChar != '\n')
    {
      SerialString += inChar;
    }
    else
    {
      readCompleted = true;
    }
  }
}

在代码中的读中断来读取一个字符串,碰到换行符则置readCompleted为true
在loop中则来判断readCompleted来处理字符串
void loop()
{
   while(readCompleted == false);
   mm += 1;
   SerialString="";
  readCompleted = false;     //位置1
  while(readCompleted == false);
  nn += 1;
}

运行后发现,只能运行到位置1,然后再也进不了serialEvent

后来改为
void loop()
{
   while(readCompleted == false);
   mm += 1;
   SerialString="";
  readCompleted=false;     //位置1
}

则可以在有数据时进入了serialEvent
总结:原来serialEvent,并不是一个真真的中断,只是在loop 中一个循环时查一遍,不知是否如此???
回复

使用道具 举报

发表于 2015-12-23 10:48:38 | 显示全部楼层
官網的範例中已有說明: https://www.arduino.cc/en/Tutorial/SerialEvent

/*
  SerialEvent occurs whenever a new data comes in the  hardware serial RX.  This routine is run between each time loop() runs, so using delay inside loop can delay response.  Multiple bytes of data may be available.
*/

問題是, 你改了的同樣會停在 while(readCompleted == false); 中, SerialEvent 應該同樣不能執行.

你的 loop 內應該是檢查 readCompleted 是否 true 才去執行, 而不應該用  while(readCompleted == false); 去自己生成一個 loop.  
回复 支持 反对

使用道具 举报

发表于 2015-12-23 15:11:42 | 显示全部楼层
对啊,他不是真真的中断,书上都说是在2次loop之间执行一次。
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-15 14:48 , Processed in 0.035716 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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