#ifndef MODBUS_ASCII_H #define MODBUS_ASCII_H
#define BAUD (57600) #define FRAME_START ('(') #define FRAME_END (')')
/****************************************************************/ // // 接收模块 // /****************************************************************/
//#define RxdBufLen (1024*4) //#define FrameBufLen (256) #define RxdBufLen (64) #define FrameBufLen (32)
typedef struct { char * volatile Start; char * volatile End; volatile int FrameLen; } FRAMEPT;
typedef struct { volatile char Buf[RxdBufLen]; //字节数组 char *volatile pWr; volatile int ByteCnt; //接收Byte计数器 volatile FRAMEPT FramePt[FrameBufLen]; //帧指针数组 volatile int FrameCnt; FRAMEPT *volatile pFrameWr; //指向帧指针数组的写指针 FRAMEPT *volatile pFrameRd; //指向帧指针数组的读指针 } RXDBUF;
int Modbus_GetFrame(char *pBuf); void Modbus_Uart1_Init(int mclk,int baud);
/****************************************************************/ // // 发送模块 // /****************************************************************/ #define TxdBufLen (256)
typedef struct { volatile char Buf[TxdBufLen]; char *volatile pWr; char *volatile pRd; volatile int ByteCnt; } TXDBUF;
int Modbus_WrFrame(const volatile char *pBuf);
以上为Modbus_ASCII.h文件
#include "Modbus_ASCII.h" #include <string.h>
/****************************************************************/ // // 接收模块 // /****************************************************************/
static volatile RXDBUF RxdBuf;
//********************************************************************** //功 能: 帧读指针加1 //********************************************************************** static void pFrameRd_Inc(void) { if(RxdBuf.FrameCnt>0) { if(RxdBuf.pFrameRd == (FRAMEPT *volatile)&RxdBuf.FramePt[FrameBufLen-1]) { RxdBuf.pFrameRd = (FRAMEPT *volatile)&RxdBuf.FramePt[0]; } else { RxdBuf.pFrameRd++; } } }
//********************************************************************** //功 能: 以帧的Start指针为指针向接收缓冲区读一字节 //读1字节->清0->Start指针加1 //********************************************************************** static volatile char FrameState_RdByte(void) { volatile char ch; if(RxdBuf.ByteCnt>0) { ch = (volatile char)*RxdBuf.pFrameRd->Start; *RxdBuf.pFrameRd->Start = (volatile char)0; if(RxdBuf.pFrameRd->Start == (char *volatile)&RxdBuf.Buf[(RxdBufLen-1)]) { RxdBuf.pFrameRd->Start = (char *volatile)&RxdBuf.Buf[0]; } else { RxdBuf.pFrameRd->Start++; } return (ch); } else { return (0); } }
//********************************************************************** //功 能: 读一帧数据 //********************************************************************** int Modbus_GetFrame(char *pBuf) { int i; int Len; if(RxdBuf.FrameCnt>0) { Len = RxdBuf.pFrameRd->FrameLen; if(*RxdBuf.pFrameRd->Start==FRAME_START && *RxdBuf.pFrameRd->End==FRAME_END) { for(i=0;i<Len;i++) { *pBuf++ = FrameState_RdByte(); } RxdBuf.pFrameRd->Start = (char *volatile)0; RxdBuf.pFrameRd->End = (char *volatile)0; RxdBuf.pFrameRd->FrameLen = (volatile int)0; pFrameRd_Inc(); rINTMSK |= BIT_URXD1; RxdBuf.ByteCnt -= Len; RxdBuf.FrameCnt--; rINTMSK &= ~BIT_URXD1; return (1); } else { for(i=0;i<Len;i++) { FrameState_RdByte(); } RxdBuf.pFrameRd->Start = (char *volatile)0; RxdBuf.pFrameRd->End = (char *volatile)0; RxdBuf.pFrameRd->FrameLen = (volatile int)0; pFrameRd_Inc(); rINTMSK |= BIT_URXD1; RxdBuf.ByteCnt -= Len; RxdBuf.FrameCnt--; rINTMSK &= ~BIT_URXD1; return (0); } } else { return (0); } }
//********************************************************************** //功 能: 删除接收缓冲区一字节数据 //删除数据->地址&计数器减1 //********************************************************************** static void RxdBuf_DelByte(void) { if(RxdBuf.ByteCnt>0) { *RxdBuf.pWr = (volatile char)0; if(RxdBuf.pWr == (char *volatile)&RxdBuf.Buf[0]) { RxdBuf.pWr = (char *volatile)&RxdBuf.Buf[(RxdBufLen-1)]; } else { RxdBuf.pWr--; } RxdBuf.ByteCnt--; } }
//********************************************************************** //功 能: 向接收缓冲区写一字节数据 //地址加1->写数据->计数器加1 //********************************************************************** static int RxdBuf_WrByte(const volatile char ch) { if(RxdBuf.ByteCnt<RxdBufLen-1) { if(RxdBuf.pWr == (char *volatile)&RxdBuf.Buf[(RxdBufLen-1)]) { RxdBuf.pWr = (char *volatile)&RxdBuf.Buf[0]; } else { RxdBuf.pWr++; } *RxdBuf.pWr = (volatile char)ch; RxdBuf.ByteCnt++; return (1); } else { return (0); } }
//********************************************************************** //功 能: 帧写指针加1 //********************************************************************** static void pFrameWr_Inc(void) { if(RxdBuf.FrameCnt<FrameBufLen-1) { if(RxdBuf.pFrameWr == (FRAMEPT *volatile)&RxdBuf.FramePt[(FrameBufLen-1)]) { RxdBuf.pFrameWr = (FRAMEPT *volatile)&RxdBuf.FramePt[0]; } else { RxdBuf.pFrameWr++; } } }
//********************************************************************** //功 能: 串口接收中断处理 //********************************************************************** static void __irq UART1_ISR_Rxd(void) { int i; char ch; do { ch = RdURXH1(); switch(ch) { case FRAME_START: if( RxdBuf.pFrameWr->Start == (char *volatile)0 ) { RxdBuf.pFrameWr->End = (char *volatile)0; RxdBuf.pFrameWr->FrameLen = (volatile int)0; if(RxdBuf_WrByte((volatile char)ch)) { RxdBuf.pFrameWr->FrameLen = (volatile int)1; RxdBuf.pFrameWr->Start = (char *volatile)RxdBuf.pWr; } } else { for(i=0;i<RxdBuf.pFrameWr->FrameLen;i++) { RxdBuf_DelByte(); } RxdBuf.pFrameWr->Start = (char *volatile)0; RxdBuf.pFrameWr->End = (char *volatile)0; RxdBuf.pFrameWr->FrameLen = (volatile int)0; if(RxdBuf_WrByte((volatile char)ch)) { RxdBuf.pFrameWr->FrameLen = (volatile int)1; RxdBuf.pFrameWr->Start = (char *volatile)RxdBuf.pWr; } } break; case FRAME_END: if( RxdBuf.pFrameWr->Start != (char *volatile)0 ) { if(RxdBuf.FrameCnt<FrameBufLen-1 && RxdBuf.ByteCnt<RxdBufLen-1) { RxdBuf_WrByte((volatile char)ch); RxdBuf.pFrameWr->FrameLen++; RxdBuf.pFrameWr->End = (char *volatile)RxdBuf.pWr; pFrameWr_Inc(); RxdBuf.FrameCnt++; } else { for(i=0;i<RxdBuf.pFrameWr->FrameLen;i++) { RxdBuf_DelByte(); } RxdBuf.pFrameWr->Start = (char *volatile)0; RxdBuf.pFrameWr->End = (char *volatile)0; RxdBuf.pFrameWr->FrameLen = (volatile int)0; } } else { for(i=0;i<RxdBuf.pFrameWr->FrameLen;i++) { RxdBuf_DelByte(); } RxdBuf.pFrameWr->Start = (char *volatile)0; RxdBuf.pFrameWr->End = (char *volatile)0; RxdBuf.pFrameWr->FrameLen = (volatile int)0; } break; default: if(RxdBuf.ByteCnt<RxdBufLen-1) { if(RxdBuf.pFrameWr->Start != (char *volatile)0) { if(RxdBuf_WrByte((volatile char)ch)) { RxdBuf.pFrameWr->FrameLen++; } } } else { for(i=0;i<RxdBuf.pFrameWr->FrameLen;i++) { RxdBuf_DelByte(); } RxdBuf.pFrameWr->Start = (char *volatile)0; RxdBuf.pFrameWr->End = (char *volatile)0; RxdBuf.pFrameWr->FrameLen = (volatile int)0; } break; } }while( (rUFSTAT1&0xf) >0 ); //若RxD_FIFO计数器为0退出 rI_ISPC = BIT_URXD1; //清除中断标志 }
//********************************************************************** //功 能: Modbus数据接收缓冲区初始化 //********************************************************************** static void Modbus_RxdBuf_Init(void) { memset((char *)&RxdBuf,0,sizeof(RxdBuf)); RxdBuf.pWr = (char *volatile)&RxdBuf.Buf[0]; RxdBuf.pFrameWr = (FRAMEPT *volatile)&RxdBuf.FramePt[0]; RxdBuf.pFrameRd = (FRAMEPT *volatile)&RxdBuf.FramePt[0]; RxdBuf.ByteCnt = (volatile int)0; RxdBuf.FrameCnt = (volatile int)0; RxdBuf.pFrameWr->FrameLen = (volatile int)0; }
大家帮我看一下串口数据存到那个数组了乍么在WATCH里面查找接收到的数据
|