Arduino 1未正确读取串行监视器中的字符串

Arduino 1未正确读取串行监视器中的字符串,arduino,serial-port,arduino-uno,arduino-ide,Arduino,Serial Port,Arduino Uno,Arduino Ide,我在Arduino Uno上的串行监视器有问题 基本上我想在串行监视器上写一些命令,读取字符串并根据字符串做一些事情 问题如下:假设我在串行监视器中键入命令“read 4”,有时会正确读取字符串,有时会像“ead 4”一样读取,缺少第一个字符。 我甚至在串行监视器的两个读数之间设置了一个延迟。有人有解释吗 为了完整性,我发布了我的代码(基本上它从EEPROM读取/写入:例如,“read 5”将读取EEPROM的5块,“write 4 5”将值5写入第4块内存) #定义最大字符串长度14 #包括

我在Arduino Uno上的串行监视器有问题

基本上我想在串行监视器上写一些命令,读取字符串并根据字符串做一些事情

问题如下:假设我在串行监视器中键入命令“read 4”,有时会正确读取字符串,有时会像“ead 4”一样读取,缺少第一个字符。 我甚至在串行监视器的两个读数之间设置了一个延迟。有人有解释吗

为了完整性,我发布了我的代码(基本上它从EEPROM读取/写入:例如,“read 5”将读取EEPROM的5块,“write 4 5”将值5写入第4块内存)

#定义最大字符串长度14
#包括
#包括
//函数将字符串初始化为空格
void initString(char*mystr,char strLength);
//如果是读取操作,则函数返回true,否则返回false
布尔isReadEEPROM(字符*myStr,字符长度);
//如果是写操作,则函数返回true,否则返回false
布尔值iswriteeprom(char*myStr,char strLength);
//函数从字符串返回EEPROM地址
无符号整数findAddress(char*myStr,char strLength);
char find值(char*myStr,char strLength);
//检查地址范围
布尔isAddressOk(无符号整数地址);
无效设置(){
//将安装代码放在此处,以便运行一次:
Serial.begin(9600);
}
void循环(){
char pos=0;
bool newDataFound=false;
char serialStr[最大字符串长度];
无符号整数地址=0;
char-val=0;
while(Serial.available()){
val=Serial.read();
}
val=0;
initString(&serialStr[0],(char)最大字符串长度);
while(Serial.available()&&pos
char val=0;
while(Serial.available()){
  val = Serial.read();
}
val = 0;
正在使用可能留在输入缓冲区中的任何字符。您还可以执行以下操作:

while (Serial.avaialble())
  Serial.read();
下一个while循环不会等待整个命令。有时,它会获取“r”,但不会及时获取“ead…”。它们将在下一次执行
loop
时出现,因此看起来“r”丢失了。它只是在上一次
loop
中使用的

通过USB(从串行监视器窗口)发送的东西可能会有奇怪的延迟

要收集完整的行,应保存字符,直到收到“\n”:

for (;;) {
  if (Serial.available()) {
    char c = Serial.read();
    if (c == '\n')
      break;
    if (pos < MAX_LINE_LENGTH) {
      serialStr[pos] = c;
      pos ++;
    }
    newDataFound = true;
  }
}
(;;)的
{
if(Serial.available()){
char c=Serial.read();
如果(c=='\n')
打破
if(位置<最大线长度){
serialStr[pos]=c;
pos++;
}
newDataFound=true;
}
}

delay
调用是完全不必要的,因为
for
循环等待直到收到“\n”字符(确保在串行监视器下拉菜单中选择了“新行”或“NL&CR均选”)。然后您就知道您已经阅读了该行中的所有字符。

谢谢您的回答。我有一些问题:我放置了第一个循环来清理序列:它有用吗?我尝试了您的解决方案:它似乎从未脱离for循环:您确定“\n”是字符串的最后一个字符吗?这取决于您在串行监视器windo中选择的内容w、 有一个下拉菜单,可供您选择“无换行符”、“换行符”、“回车符”或“双换行符和换行符”。\n字符是通用的“换行符”字符,是Arduino上的换行符。因此,您必须选择第二个或第四个选项,以便在“发送”行中输入的内容末尾发送“\n”。
for (;;) {
  if (Serial.available()) {
    char c = Serial.read();
    if (c == '\n')
      break;
    if (pos < MAX_LINE_LENGTH) {
      serialStr[pos] = c;
      pos ++;
    }
    newDataFound = true;
  }
}