串口使用的一点心得-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3050|回复: 0

串口使用的一点心得

[复制链接]
发表于 2019-3-12 17:37 | 显示全部楼层 |阅读模式
串口使用的一点心得

经不断努力已在纸面上用面包板实现了远程温湿度记录与设备反向控制,这离实际应用还差一步。在解决这一步过程中碰到了一些问题,特别是串口应用的问题,总结心得如下。

在测试时用的板子是MEGA2560,这块板子有4个硬串口,但是尺寸太大,不便实用。所以看上了只有几元钱的ATMEGA328P最小系统板。但是只有一个硬串,而且缓存也小。OneNet平台反向控制返回的信息如下,近300个字符。
1.png

用MEGA2560不存在的问题在ATMEGA328P上出现了,串口缓存不够,收到的信息总是缺后面的内容。网上有人说可以改缓存文件来提高串口缓存,于是做了测试。

我的Arduino系统是安装在D盘的,Arduino中有二个缓存文件,分别在C盘和D盘。
缓存文件C:
C:\Users\User\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.5.0-beta2\libraries\SoftwareSerial
修改内容:

2.png
缓存文件D:
D:\Program Files(x86)\Arduino\hardware\arduino\avr\libraries\SoftwareSerial\src
修改内容:
3.png

测试结果如下:
4.png
总结一下:
1)只有MEGA2560软硬串口都能接收完整OneNet返回的近300个字符的信息,ATMEGA328P和leana板都不行。
2)我用了二种接收串口字符的方法,我自己写的方法稍好点
3)MEGA2560尺寸太大,不想用,网上看到有用STM32F103跑arduino的,经测试成功,将另文介绍。

在测试中碰到一些其它问题,汇总如下:
Find使用问题
正常的返回信息:
5.png

使用Serial.find("HTTP")后的返回信息:
6.png
少了”HTTP”。
使用Serial.find("OK")后获取的信息:
7.png
少了”OK”。

就是说,find后,再read,只是读取find之后的值,find具有指针作用。

波特率问题
ESP8266默认波特率是115200,但是用在软串上获取的信息都是乱码,改ESP8266波特率为9600后接收正常。
另外如果已设了9600,写入时代码忘了改,用了115200,ESP8266明显会发烫。
更改ESP8266波特率AT命令:
AT+UART_DEF=115200,8,1,0,0

二种读串口方法代码如下:
String get_string1()
{//Serial.println("get_stringrun.....");
delay(2000);
String comdata1 = "";//缓存清零
Seriala.listen();
if(Seriala.available() > 0)//判读是否串口有数据
{
     if(Seriala.find("HTTP"))//串口是否有有效数据
     {
     while (Seriala.available() > 0)//循环串口是否有数据
     {
     comdata1 += char(Seriala.read());//叠加数据到comdata
     delay(2);//延时等待响应
     }
     if (comdata1.length() > 0)//如果comdata有数据
    {
     Serial.println(comdata1);
    comdata = "";
    comdata = comdata1;
    }
    }
    else{
     comdata = "error data";
    }
}else {
comdata="errordata";
}
Serial.println(comdata1);
return comdata;
}

String get_string2()
{Serial.println("get_stringrun.....");
String comdata1 = "";
unsigned long stime = millis()/1000;//开始时间
comdata = "";
Seriala.listen();
while (1){
if (Seriala.available() > 0)//判读是否串口有数据
{break;}else{delay(500);}//
}
while (1)
     {
     comdata1 += char(Seriala.read());//叠加数据到comdata1
     delay(2);//延时等待响应
    if(comdata1.indexOf("succ")>0) {
     while(Seriala.read()>= 0){};//缓存清零  
     break;}

endtime=millis()/1000;
if(endtime-stime>3)//超过3秒退出读串口
{
while(Seriala.read()>= 0){};//缓存清零   
break;}
}
     if (comdata1.length() > 0)
    {
    comdata = comdata1;
    }
    Serial.println(comdata1);
return comdata;
}

参考文选(感谢作者的分享):
arduino修改串口缓冲区大小的三种办法
https://blog.csdn.net/q809198545/article/details/79544429

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

本版积分规则

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

GMT+8, 2024-11-28 11:48 , Processed in 0.097715 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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