Arduino SoftSerial赢得';使用延迟时无法接收全文
我下面的代码有一个奇怪的问题。如果我删除“延迟”行,代码工作正常。如果我把它留在那里,然后通过SoftSerial发送一条文本,该文本将不会作为一个整体接收,但接收到的文本将短几个字符。如果我使用Arduino SoftSerial赢得';使用延迟时无法接收全文,arduino,Arduino,我下面的代码有一个奇怪的问题。如果我删除“延迟”行,代码工作正常。如果我把它留在那里,然后通过SoftSerial发送一条文本,该文本将不会作为一个整体接收,但接收到的文本将短几个字符。如果我使用millis作为延迟,也会发生同样的情况。SoftSerial和delay是否不兼容?有解决办法吗 #include <SoftwareSerial.h> #define DEBUG true #define relayPin1 8 //Ou
millis
作为延迟,也会发生同样的情况。SoftSerial和delay是否不兼容?有解决办法吗
#include <SoftwareSerial.h>
#define DEBUG true
#define relayPin1 8 //Output for relay pin 1
#define relayPin2 7 //Output for relay pin 2
#define relay1Run 5 //Load relay 1 feedback pin
#define relay2Run 6 //Load relay 2 feedback pin
#define NOP __asm__ __volatile__ ("nop\n\t")
SoftwareSerial SIM900(10, 11); // RX, TX
char phoneNumber[16]={'\0'};
char simExpirationDate[11]={'\0'}; //31/12/2017
char smsExpirationDate[11]={'\0'}; //31/12/2017
char signalStrength[8]={'\0'}; //100/100
char cardRemainingBalance[7]={'\0'};
char cardExpirationDate[11]={'\0'}; //31-12-2017
char autoReportsOnOff[5]={' ', 'O', 'F', 'F', '\0'}; //AUTO
char outputPinToRelay1[4]={'O', 'F', 'F', '\0'}; //OFF
char outputPinToRelay2[4]={'O', 'F', 'F', '\0'}; //OFF
char relay1State[4]={'O', 'F', 'F', '\0'}; //OFF
char relay2State[4]={'O', 'F', 'F', '\0'}; //OFF
byte reportsOnOffSetting = 2; //0=off, 1=on, 2=auto
int timeout=2000L;
byte tempValue=0;
void setup() {
// if(DEBUG)Serial.begin(9600);
Serial.begin(9600);
SIM900.begin(9600);
pinMode(relayPin1, OUTPUT);
digitalWrite(relayPin1, HIGH);
pinMode(relayPin2, OUTPUT);
digitalWrite(relayPin2, HIGH);
pinMode(relay1Run, INPUT);
digitalWrite(relay1Run, HIGH);
pinMode(relay2Run, INPUT);
digitalWrite(relay2Run, HIGH);
}
void loop() {
char *textReceived;
textReceived = (char *) malloc(90);
if(SIM900.available()) {
delay(1000);
readData(timeout, 89, textReceived);
Serial.print("textReceived: ");
Serial.println(textReceived);
free(textReceived);
delay(40000L);
}
}
byte readData(long int timeout,int charsToRead, char *textRecieved) {
unsigned long time = millis();
byte counter=0;
while((time+3000L) > millis()) {
while(SIM900.available()) {
if(counter>=charsToRead)SIM900.read();
else {
textReceived[counter] = SIM900.read();
if((textReceived[counter]) == '\0')goto here;
counter++;
}
}
}
textReceived[counter] = '\0';
return counter;
here:
return counter;
}
void sendData(char *data) {
SIM900.print(data); // send the read character to the ESP8266
if(DEBUG) Serial.println(data);
}
#包括
#定义调试为真
#定义继电器引脚1的继电器类型1 8//输出
#定义继电器引脚2的继电器类型2 7//输出
#定义继电器1运行5//负载继电器1反馈引脚
#定义继电器2运行6//负载继电器2反馈引脚
#定义NOP\uuu asm\uuuu\uuuu volatile\uuuu(“NOP\n\t”)
软件串行SIM900(10,11);//接收,发送
字符电话号码[16]={'\0'};
char simExpirationDate[11]={'\0'}//31/12/2017
字符smsExpirationDate[11]={'\0'}//31/12/2017
字符信号强度[8]={'\0'}//100/100
char cardRemainingBalance[7]={'\0'};
char cardExpirationDate[11]={'\0'}//31-12-2017
char autoReportsOnOff[5]={'','O','F','F','\0'}//自动的
char outputPinToRelay1[4]={'O','F','F','\0'}//关
char outputPinToRelay2[4]={'O','F','F','\0'}//关
字符relay1State[4]={'O','F','F','0'}//关
charrelay2state[4]={'O','F','F','0'}//关
字节reportsonoffset=2//0=关闭,1=打开,2=自动
int超时=2000L;
字节值=0;
无效设置(){
//如果(调试)串行。开始(9600);
Serial.begin(9600);
SIM900.begin(9600);
pinMode(relayPin1,输出);
数字写入(relayPin1,高);
pinMode(relayPin2,输出);
数字写入(relayPin2,高);
引脚模式(继电器1运行,输入);
数字写入(relay1Run,HIGH);
pinMode(relay2Run,输入);
数字写入(relay2Run,高);
}
void循环(){
char*textReceived;
textReceived=(char*)malloc(90);
如果(SIM900.available()){
延迟(1000);
读取数据(超时,89,文本接收);
Serial.print(“textReceived:”);
Serial.println(textReceived);
免费(已收到);
延迟(40000L);
}
}
字节读取数据(长int超时,int charsToRead,char*textReceived){
无符号长时间=毫秒();
字节计数器=0;
而((时间+3000L)>毫秒(){
而(SIM900.available()){
如果(计数器>=charsToRead)SIM900.read();
否则{
textReceived[计数器]=SIM900.read();
如果((textReceived[counter])=='\0')转到此处;
计数器++;
}
}
}
textReceived[计数器]='\0';
返回计数器;
在这里:
返回计数器;
}
void sendData(字符*数据){
SIM900.print(data);//将读取的字符发送到ESP8266
if(调试)Serial.println(数据);
}
您的缓冲区可能已溢出。另外,代码中有两个延迟。也许你可以说你在说哪一行
最后,您将使用池方法读取UART。如果可能的话,你应该尝试使用中断。你可以在这里找到一些好信息:首先,我不会写这样的代码。但是要解决您的问题,您应该在
while(SIM900.available())
循环中稍微延迟一下。
问题是循环的运行速度比串行数据的输入速度快,因此SIM900.available()。A延迟(1)代码>就可以了
像这样
while(SIM900.available()) {
if(counter>=charsToRead)SIM900.read();
else {
textReceived[counter] = SIM900.read();
if((textReceived[counter]) == '\0')goto here;
counter++;
}
delay(1); // Add this.
}
1) 循环的结束是下一个循环的开始:为什么要malloc/free?2) 您可能不会收到'\0'