gpt4 book ai didi

c - 协议(protocol)帧解码策略

转载 作者:太空宇宙 更新时间:2023-11-04 03:56:36 29 4
gpt4 key购买 nike

我有以下问题:我正在用 C 编写微 Controller (ATmega 8 位、8051 等...)并通过 UART 接口(interface)接收自定义总线协议(protocol)。我将接收到的字节放入缓冲区并稍后处理它们。

现在的问题是:是否有任何设计模式或策略来解码接收到的帧?最好的方法是如何做到这一点?有没有书籍/教程?

这是我的第一个问题,如果问题格式不正确,请不要打我:)

最佳答案

由于所有此类协议(protocol)都是自定义的,因此没有标准的方法来处理它们。唯一类似于 ADT(或“设计模式”,如果你愿意的话)的是数据的实际接收,这通常是通过 ring buffer 完成的。 .

您通常为解析实际协议(protocol)所做的事情并不奇怪,但总是以相同的方式完成。你最终会得到这样的结果:

(我在下面的代码中使用前缀 XYZ 来表示该代码旨在解码虚构的“XYZ”协议(protocol)。将其替换为自定义协议(protocol)的名称。)

// xyz.h
#ifndef XYZ_H
#define XYZ_H

typedef enum
{
XYZ_OK,
XYZ_ERR_SYNC, // various error codes for things that can go wrong
XYZ_ERR_LENGTH,
XYZ_ERR_CHECKSUM,
...

} xyz_result_t;


xyz_result_t xyz_decode (const uint8_t* buf, size_t n);

#endif /* XYZ_H */



// xyz.c
#include "xyz.h"

xyz_result_t xyz_decode (const uint8_t* buf, size_t n)
{
// various protocol-specific checks:

if(buf[0] != SOME_SYNC_CHARACTER)
{
return XYZ_ERR_SYNC;
}

if(buf[something] < expected_min_length ||
buf[something] > expected_max_length)
{
return XYZ_ERR_LENGTH;
}

...

return XYZ_OK;
}

关于c - 协议(protocol)帧解码策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15964833/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com