c - 为什么我的arduino串口到LCD在26个循环后卡住了?

标签 c arduino serial-port lcd

我从树莓派(通过结构模块)获得了一个 float ,我的草图仅在液晶屏幕上显示数据。

经过26次更正循环后,27日,Arduino崩溃了。

你能告诉我27号出了什么问题吗?

  • 将延迟从 20 毫秒更改为 1 秒:NOK
  • 将字节指针移出函数:NOK
float f;

void getFloat(){
  byte *fdata = (byte *) &f;
  while(Serial.available() <= 4){}
  Serial.readBytes(fdata,4);
  }

void loop() {
  // set the cursor to column 0, line 1
  // (note: line 1 is the second row, since counting begins with 0):

  lcd.setCursor(0, 0);
  lcd.print("Ready to receive");
  getFloat();
  AZ=f;
  getFloat();
  AL=f;
  lcd.setCursor(0, 0);
  lcd.print("Moving            ");
  lcd.setCursor(0, 1);
  // print the number of seconds since reset:
  lcd.print("AZ");
  lcd.print(String(AZ));
  lcd.setCursor(7, 1);
  lcd.print("; AL");
  lcd.print(String(AL));
  delay(1000);
  Serial.println("ok");
}

27日,arduino不再确认数据,LCD显示: ==维 AZy; AL0.00=

===分辨率===

之前,我必须通过下一个代码发送两倍的 float 才能获得最后一个,如果没有,我会在我的arduino上获取之前的数据,但我认为限制来自那里:

  def sendFloatToArduino(self,data):
    self.serial.write(struct.pack('<f', data))
    self.serial.flush()

  def pointer(self,AZ,AL):
#send the data
    print("AZ : "+str(AZ)+" ; AL : "+str(AL))
    self.sendFloatToArduino(AZ)
    self.sendFloatToArduino(AL)
    self.sendFloatToArduino(AZ)
    self.sendFloatToArduino(AL)
#wait for ack
    while (self.serialArduino.in_waiting==0):
      pass
    print(self.serialArduino.readline())

删除重复发送后,一切正常。

最佳答案

感谢您的回答。

问题不在于您所说的解析,而在于 LCD 显示屏。

我尝试将 float 转换为数组,但只得到 16 个字符:

  char str[16];
  AZ=getFloat();
  AL=getFloat();
  char buffer1[20];
  char buffer2[20];
  dtostrf(AZ,7,5,buffer1);
  dtostrf(AL,7,5,buffer2);
  for (int i=0;i<8;i++){
    if (i>1){
      str[i]=buffer1[i-2];
      str[i+8]=buffer2[i-2];
    }
  }
  Serial.println(str);

但是我在串行输出上得到了这个:AZ358.54AL48.544\x12.BBHE\xb3CGm=\r\n =>用\0修复 我认为问题出在其他地方:我必须通过下一个代码发送两倍的 float 才能获得最后一个,如果没有,我会在我的arduino上获取之前的数据,但我认为限制来自那里:

  def sendFloatToArduino(self,data):
    self.serial.write(struct.pack('<f', data))
    self.serial.flush()

  def pointer(self,AZ,AL):
#send the data
    print("AZ : "+str(AZ)+" ; AL : "+str(AL))
    self.sendFloatToArduino(AZ)
    self.sendFloatToArduino(AL)
    self.sendFloatToArduino(AZ)
    self.sendFloatToArduino(AL)
#wait for ack
    while (self.serialArduino.in_waiting==0):
      pass
    print(self.serialArduino.readline())

关于c - 为什么我的arduino串口到LCD在26个循环后卡住了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57123174/

相关文章:

c++ - 如何设置 CreateFile() 打开 COM 端口时将使用的 DTR/RTS 状态

c++ - 避免在 C++ 库中使用全局对象

c - c中的二叉树段失败

c++ - Arduino 未定义对“运算符”的引用

c# - .NET 中的 SerialPort 是非托管资源吗?我的包装类是否正确?

java - 处理/读取串口数据流导致程序崩溃

python - 获取 ttf/otf 字体本地化名称

c - 从包装器中锁定程序

c++ - 如何独立检查多个变量?

json - Web 服务 C# JSON 到 Arduino