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