问个关于串口通信的问题-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5772|回复: 12

[已解决] 问个关于串口通信的问题

[复制链接]
发表于 2014-5-18 17:53 | 显示全部楼层 |阅读模式
如图,我看了版主的书,想用串口读取一个字符串,为什么在执行串口函数之前加一个延迟同样可以避免不在后面加delay(10)的错误?
QQ截图20140518174945.png
无标题.png
发表于 2014-5-19 14:18 | 显示全部楼层
继续沉醉 发表于 2014-5-19 13:16
呃= =我只是想知道为什么把延迟加在使用串口函数之前也可以避免不加延迟导致的错误,加在后面的情况我理 ...

加前,加后都是为了等待数据存入缓冲区。加前可以等待所有数据都进入缓冲区,再处理;加后,就是边读边等数据。
具体加哪根据自己需求来
发表于 2014-5-18 21:56 | 显示全部楼层
把程序贴出来。串行口通讯不应该用延迟。
 楼主| 发表于 2014-5-18 22:40 | 显示全部楼层
liudr 发表于 2014-5-18 21:56
把程序贴出来。串行口通讯不应该用延迟。

void setup() {
  Serial.begin(9600);
}

void loop() {
  String chuan = "";
  delay(50);
  while (Serial.available() > 0)
  {
    char inChar = Serial.read();
    chuan += inChar;
  }
  if (chuan != "")
  {
    Serial.print("I got: ");
    Serial.println(chuan);
  }
}
发表于 2014-5-18 23:37 | 显示全部楼层
我不相信版主的编程能力有你描述的那么不济。正确的程序如下,我重申,不应该用延迟!
[mw_shl_code=c,true]void loop() {
   while (Serial.available() == 0)
   {
   }
   char inChar = Serial.read();
   Serial.print("I got: ");
   Serial.println(inchar);
   }
}[/mw_shl_code]
发表于 2014-5-18 23:54 | 显示全部楼层
liudr 发表于 2014-5-18 23:37
我不相信版主的编程能力有你描述的那么不济。正确的程序如下,我重申,不应该用延迟!
[mw_shl_code=c,true ...

难道是在说我?我都没看懂楼主的问题是啥....
加延时只是为了等待数据全部存入缓冲区
具体加哪,得看自己要求
发表于 2014-5-19 08:46 | 显示全部楼层
没有没有。我只是觉得这种情况下不应该用延迟。使用延迟只在某些情况下工作。
 楼主| 发表于 2014-5-19 13:16 | 显示全部楼层
coloz 发表于 2014-5-18 23:54
难道是在说我?我都没看懂楼主的问题是啥....
加延时只是为了等待数据全部存入缓冲区
具体加哪,得看自己 ...

呃= =我只是想知道为什么把延迟加在使用串口函数之前也可以避免不加延迟导致的错误,加在后面的情况我理解。。。
发表于 2014-5-19 14:19 | 显示全部楼层
liudr 发表于 2014-5-19 08:46
没有没有。我只是觉得这种情况下不应该用延迟。使用延迟只在某些情况下工作。 ...

如果数据较长,不加延时,可能需要的数据还没接收完,就开始运行此后的程序了
发表于 2014-5-19 15:12 | 显示全部楼层
coloz 发表于 2014-5-19 14:19
如果数据较长,不加延时,可能需要的数据还没接收完,就开始运行此后的程序了 ...

问题是,即使延迟,也达不到收到所有数据的效果。唯一的办法是用Serial.avaiable()测是不是有数据并在有数据的时候才读。如果数据是一个字节一个字节发送的,中间有延迟,比如是由人工输入到terminal emulator上面的(比如用X-CTU),每个字节之间都会有不到一秒钟的延迟,这样while (Serial.available()>0)只能接到一个字符,而不是所有字符。一般要是传递一个不定长度的字符串,应该定义一个结束符,或者guard time,时间一过就假设输入已经结束了,但是这个时间应该以输入设备而定。以上只是个人想法。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-12-5 03:29 , Processed in 0.084786 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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