极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 34053|回复: 18

新手求教如何使用串口读取波特率为115200的字符串

[复制链接]
发表于 2013-4-6 01:28:39 | 显示全部楼层 |阅读模式
根据测试,Serial.read()貌似每次读取的仅仅只是一个字符,如果发送字符串需要被读取,需要用如下方法,确实没问题,但是想请教那个延时delay(2);是如何计算的。因为我是用的波特率是115200,延时2字符串依旧会乱码。谢谢

String comdata = "";

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

void loop()
{
    while (Serial.available() > 0)  
    {
        comdata += char(Serial.read());
        delay(2);
    }
    if (comdata.length() > 0)
    {
        Serial.println(comdata);
        comdata = "";
    }
}
回复

使用道具 举报

 楼主| 发表于 2013-4-6 01:35:40 | 显示全部楼层
  1. #include <SoftwareSerial.h>
  2. SoftwareSerial mySerial(12, 13); // RX, TX
  3. void setup()
  4. {
  5.   pinMode(2, INPUT_PULLUP);
  6.   pinMode(3, INPUT_PULLUP);
  7.   pinMode(4, INPUT_PULLUP);
  8.   Serial.begin(115200);
  9.   mySerial.begin(115200);
  10. }
  11. void loop()
  12. {
  13.   String comdata = "";
  14.   while (mySerial.available() >0)  
  15.   {
  16.     comdata +=char(mySerial.read());
  17.     delayMicroseconds(8);
  18.     //delay(2);
  19.   }
  20.   if (comdata.length() >0)
  21.   {
  22.     Serial.println(comdata);
  23.     comdata = "";
  24.   }
  25.   if (digitalRead(2) == LOW)
  26.   {
  27.     Serial.println("1");
  28.   }
  29.   if (digitalRead(3) == LOW)
  30.   {
  31.     Serial.println("2");
  32.   }
  33.   if (digitalRead(4) == LOW)
  34.   {
  35.     Serial.println("3");
  36.   }
  37. }
复制代码
以上是我的全部代码,我想从一个从机串口中读取了信息,然后通过arduino上的蓝牙串口再发送出去
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-4-6 02:57:01 | 显示全部楼层
  1. #include <SoftwareSerial.h>
  2. SoftwareSerial mySerial(12, 13); // RX, TX
  3. int i = 1;
  4. void setup()
  5. {
  6.   pinMode(2, INPUT_PULLUP);
  7.   pinMode(3, INPUT_PULLUP);
  8.   pinMode(4, INPUT_PULLUP);
  9.   Serial.begin(115200);
  10.   mySerial.begin(115200);
  11. }
  12. void loop()
  13. {
  14.   String comdata = "";
  15.   while (mySerial.available() >0)  
  16.   {
  17.     comdata +=char(mySerial.read());
  18.     delayMicroseconds(i);
  19.     //delay(2);
  20.   }
  21.   if (comdata.length() >0)
  22.   {
  23.     i = i + 1;
  24.     Serial.println(i);
  25.     Serial.println(comdata);
  26.     comdata = "";
  27.   }
  28.   if (digitalRead(2) == LOW)
  29.   {
  30.     Serial.println("1");
  31.   }
  32.   if (digitalRead(3) == LOW)
  33.   {
  34.     Serial.println("2");
  35.   }
  36.   if (digitalRead(4) == LOW)
  37.   {
  38.     Serial.println("3");
  39.   }
  40. }
复制代码
由于不会计算,就打算采用穷举法找出来到底该延时多少,穷举的办法如上,但是依旧没有找到。
想做的东西就是这个样子,从机使用波特率115200发送信息,想通过arduino读取了从机之后,再通过蓝牙串口转发,求教到底如何才能正确读取出来从机的数据
回复 支持 反对

使用道具 举报

发表于 2013-4-6 08:12:47 | 显示全部楼层
个人猜想:
1/9600=0.000104167 对应的是2毫秒
1/115200=0.00000868 可能对应的是170微秒
回复 支持 反对

使用道具 举报

发表于 2013-4-6 12:05:35 | 显示全部楼层
串口有buff的啊,本身为异步传输设计的接口你又何必这么搞呢
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-4-6 13:35:37 | 显示全部楼层
bacon6581 发表于 2013-4-6 08:12
个人猜想:
1/9600=0.000104167 对应的是2毫秒
1/115200=0.00000868 可能对应的是170微秒

尝试了……不过没效果……
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-4-6 13:36:23 | 显示全部楼层
wing 发表于 2013-4-6 12:05
串口有buff的啊,本身为异步传输设计的接口你又何必这么搞呢

新手小白表示听不懂什么是“串口有buff”,高人能详细解释一下吗
回复 支持 反对

使用道具 举报

发表于 2013-4-6 14:34:41 | 显示全部楼层
就是串口有数据缓冲区,只要不溢出,读取不一定要非常同步。
回复 支持 反对

使用道具 举报

发表于 2013-4-6 14:37:46 | 显示全部楼层
fangtaonj 发表于 2013-4-6 14:34
就是串口有数据缓冲区,只要不溢出,读取不一定要非常同步。

正解
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-4-6 14:49:28 | 显示全部楼层
fangtaonj 发表于 2013-4-6 14:34
就是串口有数据缓冲区,只要不溢出,读取不一定要非常同步。

查了一下资料,大概同步的意思是指如果我没那个延时,可能不是一条一条的准确输出,但是会输出,只是可能多条一批输出。或者一条被拆分为多批输出是吧。不过问题在于,软件串口读取115200的串口乱码,这是问题,我以为延时足够了就不会乱码了,不过貌似不对……
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-4-6 14:52:34 | 显示全部楼层
最新测试结果,使用ARDUINO自带的串口,那个delay(2)在115200下收发正常,看来是虚拟串口的问题
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-4-6 15:00:48 | 显示全部楼层
解决了……害得我头疼了一夜的问题……竟然是虚拟串口库本身的问题……
回复 支持 反对

使用道具 举报

发表于 2013-4-6 15:19:36 | 显示全部楼层
恭喜楼主解决了问题。

不过我是到最后才留意到 你用了 #include <SoftwareSerial.h>
虽然这些库的功能可能很吸引,不过我觉得是稳定性的一大隐患。

同时愿意听取其他意见,如果有人想续集讨论的话...
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-4-6 16:26:41 | 显示全部楼层
wing 发表于 2013-4-6 15:19
恭喜楼主解决了问题。

不过我是到最后才留意到 你用了 #include

谢谢大家帮助~我还试了NewSoftSerial、AFSoftSerial,在1.0.4的IDE环境里编译出错,不知道为什么,所以只能用自带的SoftwareSerial
回复 支持 反对

使用道具 举报

发表于 2013-6-12 23:43:36 | 显示全部楼层
我用硬串口来实现楼主基本上相同的程序,IDE端串口监视也显示乱码!
-------------------------------------------------------------------------------------------------
2560串口0用于和电脑USB端连接,串口1接另外一个设备传入的TTL信号,我将串口1接收到的字符串放到串口0上显示,就是乱码!
------------------------------------------------------------------------------------------------
波特率啊,接线啊,核对过N次了,特别是波特率,全部设成了一样的,9600,也不行!

回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-15 12:17 , Processed in 0.067914 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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