新手求教如何使用串口读取波特率为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 = "";
}
} #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上的蓝牙串口再发送出去 #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读取了从机之后,再通过蓝牙串口转发,求教到底如何才能正确读取出来从机的数据 个人猜想:
1/9600=0.000104167 对应的是2毫秒
1/115200=0.00000868 可能对应的是170微秒 串口有buff的啊,本身为异步传输设计的接口你又何必这么搞呢 bacon6581 发表于 2013-4-6 08:12 static/image/common/back.gif
个人猜想:
1/9600=0.000104167 对应的是2毫秒
1/115200=0.00000868 可能对应的是170微秒
尝试了……不过没效果…… wing 发表于 2013-4-6 12:05 static/image/common/back.gif
串口有buff的啊,本身为异步传输设计的接口你又何必这么搞呢
新手小白表示听不懂什么是“串口有buff”,高人能详细解释一下吗 就是串口有数据缓冲区,只要不溢出,读取不一定要非常同步。 fangtaonj 发表于 2013-4-6 14:34 static/image/common/back.gif
就是串口有数据缓冲区,只要不溢出,读取不一定要非常同步。
正解:victory::victory::victory: fangtaonj 发表于 2013-4-6 14:34 static/image/common/back.gif
就是串口有数据缓冲区,只要不溢出,读取不一定要非常同步。
查了一下资料,大概同步的意思是指如果我没那个延时,可能不是一条一条的准确输出,但是会输出,只是可能多条一批输出。或者一条被拆分为多批输出是吧。不过问题在于,软件串口读取115200的串口乱码,这是问题,我以为延时足够了就不会乱码了,不过貌似不对…… 最新测试结果,使用ARDUINO自带的串口,那个delay(2)在115200下收发正常,看来是虚拟串口的问题 解决了……害得我头疼了一夜的问题……竟然是虚拟串口库本身的问题…… 恭喜楼主解决了问题。
不过我是到最后才留意到 你用了 #include <SoftwareSerial.h>
虽然这些库的功能可能很吸引,不过我觉得是稳定性的一大隐患。
同时愿意听取其他意见,如果有人想续集讨论的话... wing 发表于 2013-4-6 15:19 static/image/common/back.gif
恭喜楼主解决了问题。
不过我是到最后才留意到 你用了 #include
谢谢大家帮助~我还试了NewSoftSerial、AFSoftSerial,在1.0.4的IDE环境里编译出错,不知道为什么,所以只能用自带的SoftwareSerial 我用硬串口来实现楼主基本上相同的程序,IDE端串口监视也显示乱码!
-------------------------------------------------------------------------------------------------
2560串口0用于和电脑USB端连接,串口1接另外一个设备传入的TTL信号,我将串口1接收到的字符串放到串口0上显示,就是乱码!
------------------------------------------------------------------------------------------------
波特率啊,接线啊,核对过N次了,特别是波特率,全部设成了一样的,9600,也不行!
页:
[1]
2