Files
STM32F4-Base/IEC60870-Slave/104/IEC104.h
T
STF 4c55544f05
CI / L0 静态门禁 (pre-commit) (push) Failing after 45s
CI / L0.5 主机侧单测 (MSVC) (push) Failing after 42s
通信协议代码
2026-10-26 08:31:48 -04:00

73 lines
2.7 KiB
C

/* IEC 60870-5-104旧单路接收入口;包含Codec以兼容原有编解码调用方。 */
#ifndef IEC104_H
#define IEC104_H
#include "IEC104_Codec.h"
#ifdef __cplusplus
extern "C" {
#endif
/* 接收状态机的三个阶段。 */
typedef enum {
RX_SYNC = 0, /* 等待起始字节 0x68 */
RX_LEN, /* 等待长度域 */
RX_BODY /* 按目标长度接收控制域和 ASDU */
} IEC104_RxStage_t;
/* 逐字节接收结果;负值表示已经完成错误分类。 */
typedef enum {
IEC104_RX_INTERNAL_ERROR = -3, /* 接收器内部状态异常 */
IEC104_RX_SEQUENCE_ERROR = -2, /* I/S帧序号非法,应断开当前连接 */
IEC104_RX_FRAME_ERROR = -1, /* 长度或APCI格式非法 */
IEC104_RX_IN_PROGRESS = 0, /* 当前APDU尚未收齐 */
IEC104_RX_FRAME_READY = 1 /* 完整APDU通过APCI检查及适用的I/S序号检查;未校验ASDU内容 */
} IEC104_RxResult_t;
/* 单路字节流接收器的全部解析状态。 */
typedef struct {
uint8_t buf[IEC104_MAX_APDU_LEN]; /* 当前APDU的接收缓冲区 */
uint16_t len; /* 已经收到的字节数 */
uint16_t expected_len; /* 根据长度域计算出的完整APDU长度 */
IEC104_RxStage_t stage; /* 当前状态机阶段 */
} IEC104_RxParser_t;
/**
* 功能:向IEC-104接收状态机递入一个字节。
* 输入参数:byte——当前收到的一个字节。
* 输出参数:无。
* 返回值:返回IEC104_RxResult_t;序号错误要求调用方停止处理并断开当前连接。
* 说明:该旧单路兼容入口只返回接收结果,不向调用方输出完整报文或ASDU内容。
* 不分派STARTDT/STOPDT U帧,因此预设已启动
* 数据传输,只对I/S帧执行序号检查。完整连接应使用独立的
* IEC104_LinkState_t并显式处理启停流程。
*/
extern IEC104_RxResult_t IEC104_Rx_Feed_Byte(uint8_t byte);
/**
* 功能:丢弃当前未完成APDU并复位接收进度。
* 输入参数:无。
* 输出参数:无。
* 返回值:无。
* 说明:只重置内部接收阶段和长度,不清零接收缓冲区,不修改链路序号状态。
*/
extern void IEC104_Rx_Reset(void);
/**
* 功能:复位旧单路兼容入口的I/S序号状态。
* 输入参数:无。
* 输出参数:无。
* 返回值:无。
* 说明:清零I/S序号并恢复兼容路径的STARTED预设,不改变当前
* APDU接收进度;仅应在旧会话已经结束时调用。
* 仅影响IEC104_Rx_Feed_Byte的私有全局状态;外部独立的IEC104_LinkState_t
* 应使用IEC104_Link_State_Reset复位,后者恢复STOPPED。
*/
extern void IEC104_Legacy_Link_Reset(void);
#ifdef __cplusplus
}
#endif
#endif /* IEC104_H */