Python 从PySerial到Arduino的通信:数据损坏

Python 从PySerial到Arduino的通信:数据损坏,python,arduino,pyserial,data-transfer,Python,Arduino,Pyserial,Data Transfer,我需要通过USB使用PySerial将命令从python代码(计算机)发送到Arduino。顺序是以终止行字符结尾的逗号分隔值字符串,即“199,8,0,112345,0,0\n”。订单的最大大小为32字节 下面是用于将相同顺序的10倍从python发送到Arduino的代码(用于调试目的) 在Arduino端,使用以下代码接收、处理和重新编制订单: char c = 0; int it = 0; bool newData = false; String lastMessage; String

我需要通过USB使用PySerial将命令从python代码(计算机)发送到Arduino。顺序是以终止行字符结尾的逗号分隔值字符串,即
“199,8,0,112345,0,0\n”
。订单的最大大小为32字节

下面是用于将相同顺序的10倍从python发送到Arduino的代码(用于调试目的)

在Arduino端,使用以下代码接收、处理和重新编制订单:

char c = 0;
int it = 0;
bool newData = false;
String lastMessage;
String orderNumber, slaveNumber, singleOrReturn, order, orderComplement, valueI, valueII;

void saveSubStr(String subStr, int iterator){  
  switch (iterator) {
    case 1: orderNumber = subStr; break;
    case 2: slaveNumber = subStr; break;
    case 3: singleOrReturn = subStr; break;
    case 4: order = subStr; break;
    case 5: orderComplement = subStr; break;
    case 6: valueI = subStr; break;
    case 7: valueII = subStr; break;
    default: break; // it might be that some bugs leads the code here
  }
}

void formulateLastMessage(){
  lastMessage = orderNumber+","+slaveNumber+","+singleOrReturn+","+order+","+orderComplement+","+valueI+","+valueII+"\n";
}

void setup() {
  Serial.begin(57600);
  delay(1000);
}

void loop() {
  it = 0;
  while (Serial.available()){
    c = Serial.read();
    if (c!= '\n'){
      if (c != ','){
        subStr += c;
      }
      else {
        it ++;
        saveSubStr(subStr, it);
        subStr = ""
      }
    }
    else {
      it ++;
      saveSubStr(subStr, it);
      subStr = "";
      newData = true;
      it = 0;
    }
  }
  if (newData) {
    formulateLastMessage();
  }
newData = false;  
}
例如,如果我从python 10 time发送相同的命令,下面是我在Arduino中获得的全局变量
lastMessage
的值:

199,8,0,1,12345,0,0
199,8,0,1,12345,0,0
199,8,0,1,12345,0,0
0,1,12345,0,0,0,0
199,8,0,1,12345,0,0
199199,8,0,1,12345,0,0
12345,0,0,1,12345,0,0
199,8,0,1,12345,0,0
199,8,0,1,12345,0,0

我不明白为什么大多数时候我都能正确地接收数据,但有时字符串顺序会被破坏。有人知道是什么导致了这个问题吗

我编辑你的python代码。Serial在每次发送之前都有清除应答和清除缓冲区的延迟。@dsgdfg这并不能解决问题。我忘了提到,当我手动发送订单时,问题也会发生,例如,每分钟发送一个订单。因此,这似乎不是一个与时间相关的问题(至少在发送方)。
而(Serial.available())
等于
如果(Serial.available()>0)
?为什么在循环中运行循环?而
时钟
(平均时间)就是串行通信的一切!检查你的arduino代码
else{it++;saveSubStr(subStr,it);subStr=“”;newData=true;it=0;}
如何确保
it
值正确
else{saveSubStr(subStr,it+1);subStr=“”;newData=true;it=0;}
并使用全局变量。哪种情况是书面的?你的代码不清楚,朋友。
199,8,0,1,12345,0,0
199,8,0,1,12345,0,0
199,8,0,1,12345,0,0
0,1,12345,0,0,0,0
199,8,0,1,12345,0,0
199199,8,0,1,12345,0,0
12345,0,0,1,12345,0,0
199,8,0,1,12345,0,0
199,8,0,1,12345,0,0