串行读取更改输入且不读取整行

问题描述 投票:0回答:2

使用Arduino Uno和Arduino IDE无法正确读取通过串行发送的大字符串。如果键入的命令太长,则不会返回全部数据,有时甚至是随机数。

99,3,0,1,0,0,0正确生成(不确定为什么会有结尾, tho):receivedValues are: 99,3,0,1,0,0,0,

[99,3,0,0,0,0,0结果正确于:receivedValues are: 99,3,0,0,0,0,0,

哪里开始出错:

[99,3,0,100,200,300,400结果为:receivedValues are: 99,3,0,100,200,44,144,

[99,123456789结果为:receivedValues are: 99,21,0,1,200,200,244,

[99,3,0,1,200,200,2000结果为:receivedValues are: 99,3,0,1,200,200,208,

这是我的代码中与之相关的部分:

uint8_t receivedValues[7] = {0, 0, 0, 0, 0, 0, 0};

#define HEADER 0 // 99
#define CMD   1 // LICHT (2)   || GEUR (3)
#define DATA0 2 // KLEUR INDEX || GEUR INDEX
#define DATA1 3 // H           || ON / OFF
#define DATA2 4 // S
#define DATA3 5 // V
#define DATA4 6 // BlendTime

#define CHECK 99

#define ON 1
#define OFF 0

bool messageReceived = false;
bool startBlending = false;

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  ParseSerial();
  if (messageReceived)
  {
    printMessage();
    // CheckCommand();
    messageReceived = false;
  }
}


void ParseSerial()
{
  int serialIndex = 0;
  if (Serial.available() > 8)
  {
    while (0 < Serial.available())
    {
      String bufferString;
      int bufferInt;

      bufferString = Serial.readStringUntil(',');
      bufferInt = bufferString.toInt();
      receivedValues[serialIndex] = bufferInt;

      serialIndex++;
    }
    if (receivedValues[HEADER] == CHECK)
    {
      Serial.print("receivedValues[0]: ");
      Serial.println(receivedValues[0]);
      messageReceived = true;
    }
    if (receivedValues[HEADER] != CHECK)
    {
      Serial.println("not a good package");
    }
    Serial.flush();
  }
  else
  {
    Serial.flush();
  }
}

void printMessage()
{
  Serial.print("receivedValues are: ");
  for (int i = 0; i < 7; i++)
  {
    Serial.print(receivedValues[i]);
    Serial.print(",");
  }
  Serial.println();
}

如果消息的标题不是以99开头,它将写入not a good package。值得注意的是,当我在ONCE开头输入99时输入命令时,大多数时候它将两次写入not a good package

c++ stream serial-port arduino-uno
2个回答
1
投票

receivedValues声明为uint8_t receivedValues[7]uint8_t的最大值为255。如果尝试存储更大的数字,它将被截断。

如果要存储更大的数字,则需要为数组选择更大的整数类型,例如

uint32_t receivedValues[7] = {0, 0, 0, 0, 0, 0, 0};

将达到UINT32_MAX,即0xFFFFFFFF4294967295


1
投票

我找到了解决此问题的方法。不能更改uint8_t。

8个二进制位的字节可以表示28 = 256个数字:0-255。 串行连接逐字节发送数据,因此如果要发送 大于255的数字,则必须发送多个字节

链接到源:https://forum.arduino.cc/index.php?topic=492055.0

我最终发送的数字(分钟)少于255,然后在Arduino代码中再次将其乘以(秒)。

© www.soinside.com 2019 - 2024. All rights reserved.