本人初学,鼓捣2天实在搞不定,求大神指导。先说一下功能:另一个arduino设备串口输出一串数组比如 156,0,1,560,20,30,12350 本UNO软串口读取没任何问题,但加上红外接收代码就经常显示乱码。比方说上面的数组中间的某个逗号变成空格或者大于号,也有可能数字20直接变成30,读取错误数据的几率大约30%。但只要把下列代码中的 irrecv.enableIRIn(); //启动红外解码 删掉就一切正常。会不会是库里冲突呢?附代码求指导,先谢了!
#include <IRremote.h>
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3); //定义软串口 RX, TX
int RECV_PIN = 11; //定义RECV_PIN为11引脚
IRrecv irrecv(RECV_PIN); //设置RECV_PIN(也就是11引脚)为红外接收端
decode_results results; //定义results变量为红外结果存放位置
//定义一个comdata字符串变量,赋初值为空值
int mark = 0;
String comdata = "";
void setup(){
// irrecv.enableIRIn(); //启动红外解码
Serial.begin(57600); //串口波特率设为57600
mySerial.begin(57600); //软串口波特率设为57600
}
void loop() {
checkIR( ); // 檢查 IR 紅外遙控
checkRC( ); // 檢查 软串口
}
void checkRC( ) {
//j是分拆之后数字数组的位置记数
int j = 0;
//不断循环检测串口缓存,一个个读入字符串,
while (mySerial.available() > 0)
{
//读入之后将字符串,串接到comdata上面。
comdata += char(mySerial.read());
//延时一会,让串口缓存准备好下一个数字,不延时会导致数据丢失,
delay(2);
//标记串口读过数据,如果没有数据的话,直接不执行这个while了。
mark = 1;
}
if(mark == 1) //如果接收到数据则执行comdata分析操作,否则什么都不做。
{
//显示刚才输入的字符串(可选语句)
Serial.println(comdata);
//comdata的字符串已经全部转换到numdata了,清空comdata以便下一次使用,
//如果不请空的话,本次结果极有可能干扰下一次。
comdata = String("");
//输出之后必须将读到数据的mark置0,不置0下次循环就不能使用了。
mark = 0;
}
}
void checkIR( ) {
//是否接收到解码数据,把接收到的数据存储在变量results中
if (irrecv.decode(&results)) {
//接收到的数据以16进制的方式在串口输出
//Serial.println(results.value, HEX);
//一旦接收到红外代码,根据不同键执行不同程序。
if(results.value == 0xFD00FF){
delay(1000);//其他代码省略
}
irrecv.resume(); // 继续等待接收下一组信号
}
}
|