解析C++中设备文件的 ASCII 输出

Parse ASCII Output of a Device-File in C++

本文关键字:ASCII 输出 文件 C++ 解析      更新时间:2023-10-16

我为USB设备编写了一个内核空间驱动程序。例如,如果它已连接,它将挂载到/dev/myusbdev0。通过带有 echo -en "command">/dev/myusbdev0 的命令行,我可以向设备发送命令并使用 cat/dev/myusbdev0 读取结果。

好的,现在我必须编写一个C++程序。起初,我会打开设备文件进行读/写:

int fd = open("/dev/echo", O_RDRW);

之后,将发送一个cmd以使设备正常工作:

char cmd[] = { "x02sEN LMDscandata 1x03" };
write(fd, cmd, sizeof(cmd));

现在我到了我现在还不知道如何处理的部分。 我现在需要从设备读取,因为它不断向我发送数据。 我现在需要读取和解析这些数据...

char buf[512];
read(fd, buf,  sizeof(buf);
数据

如下所示,每个数据都以 \x02 开头,以 \x03 结尾,它们的大小并不总是相同的:

sRA LMDscandata 1 1 89A27F 0 0 343 347 27477BA9 2747813B 0 0 7 0 0 1388 168 0 1 DIST1 3F800000 00000000 186A0 1388 15 8A1 8A5 8AB 8AC 8A6 8AC 8B6 8C8 8C2 8C9 8CB 8C4 8E4 8E1 8EB 8E0 8F5 908 8FC 907 906 0 0 0 0 0 0 所有值都用 20hex {SPC} 分隔

它认为我需要某种 while 循环来连续读取 \x02 中的数据,直到我读取 \x03。如果我有一个完整的扫描,我需要解析这个ASCII消息的单独部分(一些变量uint_16,uint_8,enum_16,...

知道如何将完整的扫描读取到 buf[] 中,然后解析其组件吗?

正如您所说,设备正在连续发送,我建议添加一个队列来容纳传入的块,并添加一些调度来取出部分队列,即 x02 到 x03,将完成的工作与接收块分离。

此外,您可以让单个对象处理从 x02 到 x03 的一个完整块,也许是线程化的(对给定的信息有意义)。

设备 => 块读取器 => 输入

队列 => 输入读取器 =>

数据处理

希望这有帮助