📄 recv.h
字号:
/******************************************************************************
* 头文件名: recv.h *
******************************************************************************/
# ifndef __RECV_H__
# define __RECV_H__
/* 加载头文件 */
# include "mcubas.h"
# include "lowlevel.h"
# define CMSioLeadLenMin 2 // 有效包至少有2个字节的引导字(丢1个FF)
# define CMSioLeadLen 3 // 正常情况下每个有效包有3个字节的引导字
# define CMSioLeadLenMax 4 // 有效包最多有4个字节的引导字(CRC2=FF)
/* 工作包类型 */
# define CMSioTypeUrgencyStop 0x01 // 接收包的类型为"紧急停车",未用!
# define CMSioTypeEmpty 0x00 // 接收包的类型为"空包"
# define CMSioTypeCtrlData 0x05 // 接收包的类型为"普通级控制数据"
# define CMSioTypeSetCurrent 0x06 // 接收包的类型为"阀电流设置"
# define CMSioTypeSetOilFlow 0x07 // 接收包的类型为"油泵排量电压设置"
/* 调试包类型 */
# define CMSioTypeDebug 0x0D // 接收包的类型为"调试"
# define CMSioTypeDebugNoCRC 0xDC // 接收包的类型为"无CRC调试"
/* 接收包的第4个字节:类型+序列 */
typedef union {
unsigned char sort;
struct {
unsigned char sern :4; // 低4位:序列
unsigned char type :4; // 高4位:类型
} types;
} SioPackHeadType;
/* 接收包的第17-18个字节:CRC1+CRC2 */
typedef unsigned int SioPackCRC;
/* 接收包的第1-6个字节 */
typedef struct {
unsigned char lead[CMSioLeadLen]; // 3个字节的包头
SioPackHeadType type; // 1个字节的包类型+序列
unsigned int addr; // 2个字节的地址码
} SioPackHead;
/* 接收包包头部分的长度 */
# define SioPackHeadLen sizeof(SioPackHead)
/* 接收到的数据控制包中的开关量控制信息,1有效 */
typedef union {
unsigned char byte;
struct {
unsigned char PumpBac :1; // bit0:反泵
unsigned char VSpeed :1; // bit1:快慢速
unsigned char EngOff :1; // bit2:发动机熄火
unsigned char PumpRun :1; // bit3:泵送启动
unsigned char RPMInc :1; // bit4:RPM+
unsigned char RPMDec :1; // bit5:RPM-
unsigned char EFlute :1; // bit6:电笛
unsigned char PumpFor :1; // bit7:正泵
} sw;
} PackCtrlDatSwMSG;
/* 接收到的数据控制包中的控制信息 */
typedef struct {
// <b7> -- -- arm5 arm4 arm3 arm2 arm1 turn <b0>
unsigned char dirUp; // 标志6路阀向上扳动的状态,1有效
// <b7> -- -- arm5 arm4 arm3 arm2 arm1 turn <b0>
unsigned char dirDn; // 标志6路阀向下扳动的状态,1有效
// [0] turn arm1 arm2 arm3 arm4 arm5 flow [6]
unsigned char val[7]; // 7路模拟量的A/D转换数值
PackCtrlDatSwMSG sw; // 标志各开关量的状态
} PackCtrlDatMSG;
/* 接收到的数据控制包 */
typedef struct {
SioPackHead head; // 包头部分
PackCtrlDatMSG dat; // 控制数据部分
SioPackCRC crc; // CRC校验码
} SioPackCtrlDat;
/* 接收到的阀电流设置包 */
typedef struct {
SioPackHead head; // 包头部分
unsigned char cmd; // 指令:增大or减小or保存
unsigned char arm; // 臂号:旋转or1臂or2臂or3臂or4臂or5臂
unsigned char dir; // 方向:向上or向下
unsigned char lim; // 范围:(设置)上限or下限
unsigned char res[6]; // 保留字节
SioPackCRC crc; // CRC校验码
} SioPackSetCurrent;
/* 接收到的油泵排量电压设置包 */
typedef struct {
SioPackHead head; // 包头部分
unsigned char cmd; // 指令:增大or减小or保存
unsigned char lim; // 范围:(设置)上限or下限
unsigned char res[8]; // 保留字节
SioPackCRC crc; // CRC校验码
} SioPackSetOilFlow;
/* 半双工通信时向发射机发送的包 */
typedef struct {
SioPackHead head; // 包头部分
unsigned char dat[4]; // 数据部分(待定)
SioPackCRC crc; // CRC校验码
} SioPackAck;
# define CMSioHeadLen sizeof(SioPackHead) // 包头部分的长度
# define CMSioCRCLen sizeof(SioPackCRC) // CRC校验码的长度
# define CMSioRecvPackLenMax CMUART0RxBufLenMax // 包最大长度:接收缓冲区的最大长度
# define CMSioRecvPackLenMin (CMSioHeadLen+CMSioCRCLen) // 包最小长度:包头部分长度+CRC校验码长度
/* 各种类型接收包的联合 */
typedef union {
unsigned char buf[CMSioRecvPackLenMax];
SioPackHead head;
SioPackCtrlDat ctrldat;
SioPackSetCurrent setcurrent;
SioPackSetOilFlow setoilflow;
SioPackAck ack;
} SioPackRecvBuf;
# ifdef TestCommDebug
# define CommDatRightTime 2000 // 10ms
# define CommDatRightTime0 1000 // 10ms
# else // TestCommDebug
# define CommDatRightTime 2000 // 10ms
# define CommDatRightTime0 1000 // 10ms
# endif // TestCommDebug
# define ConsecutiveRightPack 2
# define NoMachineAddr 0xFFFF // 未设置遥控器ID号
# define UniversalMachineAddr 0x0001 // 通用的遥控器ID号
/* 子函数声明 */
void InitDataRecv(void);
void RecvMOnTime (void);
void UrgencyStop (void);
# endif // __RECV_H__
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -