Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arduino SoftSerial赢得';使用延迟时无法接收全文_Arduino - Fatal编程技术网

Arduino SoftSerial赢得';使用延迟时无法接收全文

Arduino SoftSerial赢得';使用延迟时无法接收全文,arduino,Arduino,我下面的代码有一个奇怪的问题。如果我删除“延迟”行,代码工作正常。如果我把它留在那里,然后通过SoftSerial发送一条文本,该文本将不会作为一个整体接收,但接收到的文本将短几个字符。如果我使用millis作为延迟,也会发生同样的情况。SoftSerial和delay是否不兼容?有解决办法吗 #include <SoftwareSerial.h> #define DEBUG true #define relayPin1 8 //Ou

我下面的代码有一个奇怪的问题。如果我删除“延迟”行,代码工作正常。如果我把它留在那里,然后通过SoftSerial发送一条文本,该文本将不会作为一个整体接收,但接收到的文本将短几个字符。如果我使用
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'