Untitled
unknown
c_cpp
a year ago
2.0 kB
5
Indexable
#include <stdio.h>
#include <string.h>
// 测试函数
// 模拟从serial缓冲区中拷贝数据的过程
int read(char* dst, int max)
{
static int _run = -1;
_run += 1;
switch(_run)
{
case 0:{
const char Data[] = "1,23,4";
memcpy(dst, Data, sizeof(Data)-1);
return sizeof(Data)-1;
}
case 1:{
const char Data[] = ",5,6,7,100,";
memcpy(dst, Data, sizeof(Data)-1);
return sizeof(Data)-1;
}
case 2:{
const char Data[] = "1,2,";
memcpy(dst, Data, sizeof(Data)-1);
return sizeof(Data)-1;
}
default: return 0;
}
}
int main()
{
// 测试sscanf特性
if (false)
{
int num, pos;
char space[2];
int ret = sscanf("12,,", "%d%1[,]%n", &num, space, &pos);
printf("ret:%d, pos:%d", ret, pos);
return 0;
}
char buf[20]{};
char* end = buf;
int len = 0;
while(len = read(end, sizeof(buf)-(end-buf)), len > 0)
{
// 更新end
end += len;
*end = '\0';
// 尝试吃掉输入流中的 \d+,
// 并使用未处理数据向前覆盖已处理数据
int num, pos; // pos代表已处理的数据
char space[2]; // 强制捕获1个字节宽的分割符号, 否则无法判断sscanf是否完整的捕获了表达式
while (sscanf(buf, "%d%1[,]%n", &num, space, &pos) == 2)
{
// 对捕获的数字进行处理
// ...
printf("get %d\n", num);
// 缓冲区中的数据总数
int total_len = end - buf;
// 计算未处理的数据长
int unused_len = total_len - pos;
// 使用未处理数据覆盖已处理数据
memmove(buf, buf+pos, unused_len);
// 更新end
end = buf + unused_len;
*end = '\0';
}
// 10ms的接收时间, 或是更换为协程的wait
// 在这段时间内等待串口缓冲区被另一线程的task填充
// 否则表示流传输停止, 跳出循环
// delay(10);
}
return 1;
}Editor is loading...
Leave a Comment