【问题标题】:Parse ASCII Output of a Device-File in C++在 C++ 中解析设备文件的 ASCII 输出
【发布时间】:2012-06-09 11:11:06
【问题描述】:

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

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

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

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

char cmd[] = { "\x02sEN LMDscandata 1\x03" };
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[],然后解析其组件吗?

【问题讨论】:

    标签: c++ parsing ascii device


    【解决方案1】:

    正如您所说的设备正在连续发送,我建议添加一个队列来保存传入的块,并进行一些分派来取出部分队列,即 x02 到 x03,从而将完成的工作与接收块分离.

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

    设备 => 块读取器 => 输入队列 => 输入器读取器 => 数据处理

    希望对你有帮助

    【讨论】:

    • 听起来很有趣,但我不知道如何在 C++ 中进行设置 :(
    • 这并不像听起来那么难。为这些项目中的每一个考虑一个类,它们在定义的接口上交互。对于队列,我建议调查此处已经描述的 ACE 消息队列stackoverflow.com/questions/7781747/…,但每个 std::queue 都会做得很好
    • 好的,对于应用程序,我总是需要最新的数据。所以我想到了至少两个队列/缓冲区?!我需要两个线程,一个是填充缓冲区,另一个是读取它们。为了始终获取最新数据并覆盖旧数据,我可以在第一个线程中切换缓冲区。嗯将看看这个tought,现在不知道如何编码:D c++ 不是我的世界 :(
    • 因为我相信您仍然只需要一个队列来存储所有内容,即设备提供的内容。但是您应该有某种模型,将数据写入其中(上面的数据处理)。含义:如果您获得某个数据的较新版本,它将在模型中被覆盖(模型已更新),从那以后,您可以引发一个事件来更新您的视图等。
    猜你喜欢
    • 1970-01-01
    • 2019-11-28
    • 1970-01-01
    • 1970-01-01
    • 2015-10-05
    • 1970-01-01
    • 2016-04-17
    • 2018-05-13
    • 2012-02-25
    相关资源
    最近更新 更多