私のコードでこの奇妙な問題があります。私が "遅延"行を削除すると、コードは正常に動作します。私がそこにおいてから、SoftSerialを通してテキストを送ると、そのテキストは全体として受け取られませんが、受け取ったテキストは短い文字になります。遅延のためにmillis
を使用すると同じことが起こります。 SoftSerialは互換性がありませんか?回避策はありますか?遅延を使用するとArduino SoftSerialは全文を受信しません
#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)ループの終了は次のループの開始です:なぜあなたはmalloc/freeですか? 2)あなたはおそらく ''\ 0' ' – datafiddler