断开连接时Arduino系列读取

Arduino Serial Read when disconnected

本文关键字:系列 读取 Arduino 连接 断开      更新时间:2023-10-16

我正在开发赛车模拟器,我有问题。我有一个将数据发送到Arduino的C 程序。Arduino接收到它,解析字符串,其中一个必须显示在TFT中。我已经注意到,当C 程序完成时,Arduino仅在TFT中打印值,因此仅在Serial.read()函数返回false时才打印值。如何获取实时数据,打印实时值?

在这里,我给您带来Arduino代码:

#include <SoftwareSerial.h>
#include <Adafruit_GFX.h>
#include <UTFTGLUE.h>
UTFTGLUE myGLCD(0x9488, A5, A4, A3, A2, A0);
char lastgear = '0';
extern uint8_t Bigfont[];
String sParams[3];
int iCount, i;
String sLine;
void setup() {
  randomSeed(analogRead(5));   //.kbv Due does not like A0
  pinMode(A0, OUTPUT);       //.kbv mcufriend have RD on A0
  digitalWrite(A0, HIGH);
  // Set up the LCD
  myGLCD.InitLCD();
  myGLCD.clrScr();
  myGLCD.setFont(BigFont);
  myGLCD.setTextSize(5);
  myGLCD.print("  Victor Casado", LEFT, 15);
  delay(500);
  myGLCD.clrScr();
  myGLCD.setTextSize(24);
  Serial.begin(9600);
}
void loop() {
  while (Serial.available() > 0) {
    // reading the line from file
    sLine = Serial.readString();
    // parse only if exists
    if (sLine.length() > 0) {
      // parse the line
      iCount = StringSplit(sLine, ',', sParams, 3);
      // print the extracted paramters
      for (i = 0; i < iCount; i++) {
        Serial.print(sParams[i]);
        myGLCD.setColor(255, 255, 255);
        myGLCD.print(sParams[0], 200, 75);
      }
      Serial.println("");
    }
  }
}
int StringSplit(String sInput, char cDelim, String sParams[], int iMaxParams) {
  int iParamCount = 0;
  int iPosDelim, iPosStart = 0;
  do {
    // Searching the delimiter using indexOf()
    iPosDelim = sInput.indexOf(cDelim, iPosStart);
    if (iPosDelim > (iPosStart + 1)) {
      // Adding a new parameter using substring()
      sParams[iParamCount] = sInput.substring(iPosStart, iPosDelim - 1);
      iParamCount++;
      // Checking the number of parameters
      if (iParamCount >= iMaxParams) {
        return (iParamCount);
      }
      iPosStart = iPosDelim + 1;
    }
  } while (iPosDelim >= 0);
  if (iParamCount < iMaxParams) {
    // Adding the last parameter as the end of the line
    sParams[iParamCount] = sInput.substring(iPosStart);
    iParamCount++;
  }
  return (iParamCount);
}

我试图更改此部分:

while (Serial.available() > 0) {
  // reading the line from file
  sLine = Serial.readString();
  // parse only if exists
  if (sLine.length() > 0) {
    // parse the line
    iCount = StringSplit(sLine, ',', sParams, 3);
    // print the extracted paramters
    for (i = 0; i < iCount; i++) {
      Serial.print(sParams[i]);
      myGLCD.setColor(255, 255, 255);
      myGLCD.print(sParams[0], 200, 75);
    }
    Serial.println("");
  }
}

对此,它的工作原理相同:

while (Serial.available() > 0) {
  // reading the line from file
  sLine = Serial.readString();
  // parse only if exists
  if (sLine.length() > 0) {
    // parse the line
    iCount = StringSplit(sLine, ',', sParams, 3);
    // print the extracted paramters
    for (i = 0; i < iCount; i++) {
      Serial.print(sParams[i]);
    }
    Serial.println("");
  }
  myGLCD.setColor(255, 255, 255);
  myGLCD.print(sParams[0], 200, 75);
}

和此:

while (Serial.available() > 0) {
  // reading the line from file
  sLine = Serial.readString();
  // parse only if exists
  if (sLine.length() > 0) {
    // parse the line
    iCount = StringSplit(sLine, ',', sParams, 3);
    // print the extracted paramters
    for (i = 0; i < iCount; i++) {
      Serial.print(sParams[i]);
    }
    Serial.println("");
    myGLCD.setColor(255, 255, 255);
    myGLCD.print(sParams[0], 200, 75);
  }
}

希望你能帮助我!

谢谢!

使用Serial.readString()时,它会尝试读取直到超时为止。串行的默认超时为1秒。这意味着在读取最后一个角色后,它等待1秒。在完成之前。您可以通过在Serial.begin()之后使用Serial.setTimeout(10);或按照@sami建议的方式手动设置设置中的超时值,您可以使用Serial.readStringUntil("xxx"),其中'xxx'是您发送FX的字符串的末端。' n'或' r n'如果您用线折终止字符串。