C++ 串行读取更改输入&;不';我看不懂整行
使用Arduino Uno和Arduino IDE无法正确读取通过串行传输的大字符串。当键入的命令太长时,不会返回全部数据,有时甚至是随机数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
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标签,我只是想帮助你提高你的问题的质量,这样它在将来可能会成为一个有用的帖子