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

zhuhai 发表于 2019-3-12 17:37

串口使用的一点心得

串口使用的一点心得
经不断努力已在纸面上用面包板实现了远程温湿度记录与设备反向控制,这离实际应用还差一步。在解决这一步过程中碰到了一些问题,特别是串口应用的问题,总结心得如下。
在测试时用的板子是MEGA2560,这块板子有4个硬串口,但是尺寸太大,不便实用。所以看上了只有几元钱的ATMEGA328P最小系统板。但是只有一个硬串,而且缓存也小。OneNet平台反向控制返回的信息如下,近300个字符。
用MEGA2560不存在的问题在ATMEGA328P上出现了,串口缓存不够,收到的信息总是缺后面的内容。网上有人说可以改缓存文件来提高串口缓存,于是做了测试。
我的Arduino系统是安装在D盘的,Arduino中有二个缓存文件,分别在C盘和D盘。缓存文件C:C:\Users\User\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.5.0-beta2\libraries\SoftwareSerial修改内容:
缓存文件D:D:\Program Files(x86)\Arduino\hardware\arduino\avr\libraries\SoftwareSerial\src修改内容:
测试结果如下: 总结一下:1)只有MEGA2560软硬串口都能接收完整OneNet返回的近300个字符的信息,ATMEGA328P和leana板都不行。2)我用了二种接收串口字符的方法,我自己写的方法稍好点3)MEGA2560尺寸太大,不想用,网上看到有用STM32F103跑arduino的,经测试成功,将另文介绍。
在测试中碰到一些其它问题,汇总如下:Find使用问题:正常的返回信息:
使用Serial.find("HTTP")后的返回信息: 少了”HTTP”。使用Serial.find("OK")后获取的信息: 少了”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
页: [1]
查看完整版本: 串口使用的一点心得