optical/NxFuncs/modbus/ef_a.h
2025-09-04 09:45:08 +08:00

74 lines
1.4 KiB
C

/*
* 软艺电机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_ */