/* * 软艺电机EF_A协议 */ #ifndef _EF_A_H_ #define _EF_A_H_ #include "config.h" #include "serial.h" typedef struct { int idx; u8 addr; u16 wrdat; u16 rddat; }EFCmd; #ifndef MAX_EF_CMD #define MAX_EF_CMD 50 #endif typedef void (*ResvEFProc)(EFCmd * pcmd); // 收到数据处理函数 typedef struct { EFCmd cmdbuf[MAX_EF_CMD]; // 收发控制 int working; // 正在读写中; = 1, 工作中,不能收发新命令 int bufCmdNum; // 命令个数; != 0, 有新命令 int bufHead; int bufTail; int steps; u32 stepTime; ResvEFProc resvefproc; // 收到数据处理函数 int efrsvTimout; // 读取超时时间 }AsyncEFCtrl; typedef void (*CommOutFunc)(void); typedef struct { u32 efSendWait; // 通讯延时, 单位us,发送一个字节所需时间 // 通讯函数指针 UsartSendData EFCommSend; // 发送数据 UsartGetData EFCommReceive; // 接收数据 UsartCleanRsBuf EFCommCleanRsBuf; // 清空接收缓冲区 IsUsartSendOver IsEFCommSendOver; // 判断发送缓冲区是否为空 CommOutFunc CommOutEn; // 数据发送允许 CommOutFunc CommOutDis; // 数据发送禁止 }EFCommCtrl; void InitEF(int idx, int usart, BAUD_TypeDef baud, char dat, char parity, char stop); int EFTx(int idx, u8 addr, u16 data, int steps); int EFRx(int idx, u16 * pData, int steps); int EFComm(int idx, u8 addr, u16 wrDat, u16 * pRdBuf); void InitAsyncEFCtrl(int idx, int rsvtimout); void RegEFCmdProc(int idx, ResvEFProc proc); int AddEFCmd(EFCmd * pCmd); int GetEFCmdBufLen(int idx); int AsyncEFTask(int idx); #endif /* _EF_A_H_ */