/* 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 */