arduino查找字符串数组中包尾所在的位置,其中字符串数组包含0x00,协议就是上文的协议
时间: 2023-11-30 07:04:42 浏览: 100
Arduino 分割字符串库,strFenGe.rar
好的,下面是一个完整的例子代码,用于查找 Comm_Head 和 Comm_End 数组在一个包含 0x00 字符的字符串数组 buf 中的位置:
```cpp
unsigned char Comm_Head[6] = {0xAA, 0x6F, 0x00, 0x00, 0x00, 0x24};
unsigned char Comm_End[4] = {0xCC, 0x33, 0xC3, 0x3C};
void setup() {
Serial.begin(9600);
while (!Serial) ; // 等待串口连接
}
void loop() {
// 读取串口数据
if (Serial.available()) {
unsigned char buf[64];
int len = Serial.readBytesUntil(0x00, buf, sizeof(buf)); // 读取到包尾为止
if (len > 0) {
// 查找 Comm_Head 和 Comm_End 的位置
char *head = (char *)memmem(buf, len, Comm_Head, sizeof(Comm_Head));
char *end = (char *)memmem(buf, len, Comm_End, sizeof(Comm_End));
if (head != NULL && end != NULL) {
int headIndex = head - (char *)buf;
int endIndex = end - (char *)buf + sizeof(Comm_End) - 1;
// 进行后续处理,比如打印数据
Serial.write(buf + headIndex, endIndex - headIndex + 1);
}
}
}
}
```
上面的代码使用了 Arduino 的串口函数库,每次从串口读取数据并存储到一个大小为 64 的数组 buf 中,使用 `memmem()` 函数查找 Comm_Head 和 Comm_End 在 buf 数组中的位置。`memmem()` 函数可以查找一个内存区域中是否包含另一个内存区域,函数原型如下:
```cpp
void *memmem(const void *haystack, size_t haystacklen, const void *needle, size_t needlelen);
```
其中,`haystack` 参数是要查找的内存区域,`haystacklen` 参数是 haystack 的长度,`needle` 参数是要查找的另一个内存区域,`needlelen` 参数是 needle 的长度。函数返回值是指向第一个匹配到的内存区域的指针,如果没有匹配到则返回 `NULL`。
在上面的代码中,如果找到了 Comm_Head 和 Comm_End,则计算出它们在 buf 数组中的位置,并进行后续处理,比如将数据通过串口发送出去。注意,这里使用了指针来计算 Comm_Head 和 Comm_End 的位置,因为使用数组下标访问 buf 数组时,如果遇到 0x00 字符则会被认为是字符串的结束符,因此不能正确计算位置。
阅读全文