⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 recv.h

📁 freescale crc模块驱动 经调试
💻 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 + -