2017-03-19 8 views
0

私のコードでこの奇妙な問題があります。私が "遅延"行を削除すると、コードは正常に動作します。私がそこにおいてから、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

1)ループの終了は次のループの開始です:なぜあなたはmalloc/freeですか? 2)あなたはおそらく ''\ 0' ' – datafiddler

答えて

0

まず最初に、私はこのようなコードを書いていません。しかし、あなたの問題を解決するには、ループの中で少し遅れて実行するべきです(while(SIM900.available()))。 問題は、ループがシリアルデータが入ってくるよりも速く実行されるため、より多くのデータが入ってきてもSIM900.available()ステートメントが偽になることです。 delay(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. 
} 
0

バッファがオーバーランしている可能性があります。また、コードに2つの遅延があります。たぶんあなたはあなたが話しているラインを言うことができます。

最後に、UARTを読み取るためにプーリング方法を使用しています。可能であれば、割り込みを使用するようにしてください。ここでいくつかの良い情報を見つけることができます:https://www.arduino.cc/en/Tutorial/SerialEvent

関連する問題