C++ 串行读取更改输入&;不';我看不懂整行

C++ 串行读取更改输入&;不';我看不懂整行,c++,stream,serial-port,arduino-uno,C++,Stream,Serial Port,Arduino Uno,使用Arduino Uno和Arduino IDE无法正确读取通过串行传输的大字符串。当键入的命令太长时,不会返回全部数据,有时甚至是随机数 99,3,0,1,0,0,0结果正确(不确定为什么会有结尾,tho): 接收值为:99,3,0,1,0,0,0, 99,3,0,0,0,0,0结果正确:received值为:99,3,0,0,0,0, 哪里开始出问题: 99,3,010020300400结果:接收的值为:99,3,01002000,44144, 99123456789结果:received

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

99,3,0,1,0,0,0
结果正确(不确定为什么会有结尾
tho):
接收值为:99,3,0,1,0,0,0,

99,3,0,0,0,0,0
结果正确:
received值为:99,3,0,0,0,0,

哪里开始出问题:

99,3,010020300400
结果:
接收的值为:99,3,01002000,44144,

99123456789
结果:
receivedValue为:99,21,0,1200244,

99,3,0,12002000
结果:
接收的值为:99,3,0,1200200208,

以下是我的代码中与此相关的部分:

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();
}
uint8\u t receivedValue[7]={0,0,0,0,0};
#定义头0//99
#定义CMD 1//LICHT(2)| | GEUR(3)
#定义数据0 2//KLEUR索引| | GEUR索引
#定义数据1 3//H | |开/关
#定义数据2 4//S
#定义数据3 5//V
#定义数据4 6//BlendTime
#定义检查99
#在1上定义
#定义0
bool messageReceived=false;
bool startBlending=false;
无效设置()
{
Serial.begin(9600);
}
void循环()
{
ParseSerial();
if(messageReceived)
{
printMessage();
//CheckCommand();
messageReceived=false;
}
}
void ParseSerial()
{
int serialIndex=0;
如果(Serial.available()>8)
{
而(0

如果消息的标题不是以
99
开头,它将写入
不是一个好的包
。值得注意的是,当我输入一个开头带有
99
的命令时,它将在大多数情况下写入
不是一个好的包
两次。

receivedValues
被声明为
uint8\t receivedValues[7]
uint8\u t
的最大值为255。如果您试图存储一个较大的数字,它将被截断

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

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

将工作到
UINT32\u MAX
,即
0xffffff
4294967295

receivedValues
声明为
uint8\u t receivedValues[7]
uint8\u t
的最大值为255。如果您试图存储一个较大的数字,它将被截断

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

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

它将工作到
UINT32_MAX
,即
0xffffff
4294967295

我找到了这个问题的解决方案。改变uint8并不是答案

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

链接到来源:


最后我发送了一个比255小的数字(分钟),然后在Arduino代码中再次乘以它(到秒)

我找到了这个问题的解决办法。改变uint8并不是答案

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

链接到来源:


最后我发送了一个比255小的数字(分钟),然后在Arduino代码中再次乘以它(到秒)

这看起来像是一个逻辑修复,但问题仍然存在(即使使用uint32\u t):输入
99,3,11001001000
输出像:
received值是:99,3,110010000,0,0,
,看起来像是一个逻辑修复,但问题仍然存在(即使使用uint32\u t):输入
99,3,11001001000
输出,如:
received值为:99,3,110010000,0,0,
消息格式到底是什么?数据是以ASCII文本还是二进制值传输的?发送方和接收方是否具有相同的体系结构?因此,这可能是一个终端仿真器,意味着传输为ASCII文本?请发一封电子邮件。我不知道在这个上下文中,
字符串是什么,也不知道
串行
是如何定义的,也没有异步串行代码来评估您是如何读取/写入串行端口的(或者您是否正在轮询?)。
Serial.readStringUntil(',')
将逗号保留在缓冲区中,读取并扔掉,或者将其附加到
缓冲字符串
?这段代码看起来不像C代码。这是一种C++,所以这是C++代码,不是C。你使用的是类,它不能是C和C++不是同一种语言。你在帖子上贴了一个C标签,它不是C代码。从技术上讲,它不是一个有效的C++程序,它没有一个<代码>主< /C>函数。头文件没有include语句来声明您正在使用的类接口。我不是因为Arduino标签才出现在这个帖子上的,我之所以出现在这个帖子上是因为C标签,我只是想帮助你提高你的问题的质量,这样它在将来可能会成为一个有用的帖子