Dark_Angel 发表于 2013-4-6 01:28:39

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

根据测试,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 = "";
    }
}

Dark_Angel 发表于 2013-4-6 01:35:40

#include <SoftwareSerial.h>
SoftwareSerial mySerial(12, 13); // RX, TX
void setup()
{
pinMode(2, INPUT_PULLUP);
pinMode(3, INPUT_PULLUP);
pinMode(4, INPUT_PULLUP);
Serial.begin(115200);
mySerial.begin(115200);
}
void loop()
{
String comdata = "";
while (mySerial.available() >0)
{
    comdata +=char(mySerial.read());
    delayMicroseconds(8);
    //delay(2);
}
if (comdata.length() >0)
{
    Serial.println(comdata);
    comdata = "";
}
if (digitalRead(2) == LOW)
{
    Serial.println("1");
}
if (digitalRead(3) == LOW)
{
    Serial.println("2");
}
if (digitalRead(4) == LOW)
{
    Serial.println("3");
}
}以上是我的全部代码,我想从一个从机串口中读取了信息,然后通过arduino上的蓝牙串口再发送出去

Dark_Angel 发表于 2013-4-6 02:57:01

#include <SoftwareSerial.h>
SoftwareSerial mySerial(12, 13); // RX, TX
int i = 1;
void setup()
{
pinMode(2, INPUT_PULLUP);
pinMode(3, INPUT_PULLUP);
pinMode(4, INPUT_PULLUP);
Serial.begin(115200);
mySerial.begin(115200);
}
void loop()
{
String comdata = "";
while (mySerial.available() >0)
{
    comdata +=char(mySerial.read());
    delayMicroseconds(i);
    //delay(2);
}
if (comdata.length() >0)
{
    i = i + 1;
    Serial.println(i);
    Serial.println(comdata);
    comdata = "";
}
if (digitalRead(2) == LOW)
{
    Serial.println("1");
}
if (digitalRead(3) == LOW)
{
    Serial.println("2");
}
if (digitalRead(4) == LOW)
{
    Serial.println("3");
}
}
由于不会计算,就打算采用穷举法找出来到底该延时多少,穷举的办法如上,但是依旧没有找到。
想做的东西就是这个样子,从机使用波特率115200发送信息,想通过arduino读取了从机之后,再通过蓝牙串口转发,求教到底如何才能正确读取出来从机的数据

bacon6581 发表于 2013-4-6 08:12:47

个人猜想:
1/9600=0.000104167 对应的是2毫秒
1/115200=0.00000868 可能对应的是170微秒

wing 发表于 2013-4-6 12:05:35

串口有buff的啊,本身为异步传输设计的接口你又何必这么搞呢

Dark_Angel 发表于 2013-4-6 13:35:37

bacon6581 发表于 2013-4-6 08:12 static/image/common/back.gif
个人猜想:
1/9600=0.000104167 对应的是2毫秒
1/115200=0.00000868 可能对应的是170微秒

尝试了……不过没效果……

Dark_Angel 发表于 2013-4-6 13:36:23

wing 发表于 2013-4-6 12:05 static/image/common/back.gif
串口有buff的啊,本身为异步传输设计的接口你又何必这么搞呢

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

fangtaonj 发表于 2013-4-6 14:34:41

就是串口有数据缓冲区,只要不溢出,读取不一定要非常同步。

wing 发表于 2013-4-6 14:37:46

fangtaonj 发表于 2013-4-6 14:34 static/image/common/back.gif
就是串口有数据缓冲区,只要不溢出,读取不一定要非常同步。

正解:victory::victory::victory:

Dark_Angel 发表于 2013-4-6 14:49:28

fangtaonj 发表于 2013-4-6 14:34 static/image/common/back.gif
就是串口有数据缓冲区,只要不溢出,读取不一定要非常同步。

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

Dark_Angel 发表于 2013-4-6 14:52:34

最新测试结果,使用ARDUINO自带的串口,那个delay(2)在115200下收发正常,看来是虚拟串口的问题

Dark_Angel 发表于 2013-4-6 15:00:48

解决了……害得我头疼了一夜的问题……竟然是虚拟串口库本身的问题……

wing 发表于 2013-4-6 15:19:36

恭喜楼主解决了问题。

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

同时愿意听取其他意见,如果有人想续集讨论的话...

Dark_Angel 发表于 2013-4-6 16:26:41

wing 发表于 2013-4-6 15:19 static/image/common/back.gif
恭喜楼主解决了问题。

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


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

拾瑞 发表于 2013-6-12 23:43:36

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

页: [1] 2
查看完整版本: 新手求教如何使用串口读取波特率为115200的字符串