单片机之串口数据处理
时间:11-10
来源:互联网
点击:
随着硬件系统的模块化发展,很多电子产品都做出模块并采用串口进行数据通信。例如:GPRS模块、GPS模块、语音模块、热敏微型打印机、串口摄像头等等。在与这些模块进行数据通信都离不开串口,而对于串口的操作,由于串口本身没有标准的通信协议,所以很难做到非常统一的操作过程。一般来说,不同的模块其有着特殊的通信协议,我们只能根据其协议进行数据解码。
虽然说串口没有标准协议,但是我们却可以把它们的相似部分提取出来,做成模块化的程序,方便代码的移植和理解。下面我们简单谈到串口数据的处理方法。。。。。
本函数用于把串口中断接收的数据放入数据缓冲区中,并且接收计数器加1.
本函数用于从接收缓冲区中读取未处理的一字节数据,读计数器加1.
本函数用于读取串口缓冲区中还未处理的数据的大小。
虽然说串口没有标准协议,但是我们却可以把它们的相似部分提取出来,做成模块化的程序,方便代码的移植和理解。下面我们简单谈到串口数据的处理方法。。。。。
串口数据处理流程:
一般来说,串口数据的接收都是采用中断方式,中断中只复制把串口发送的数据放入数据缓冲区中。而发送一般都是采用查询方式比较方便。不管是与什么设备通信,这一点完全是一致的。所以,我们完全可以把这部分代码独立起来。
定义数据结构如下:
- typedef struct
- {
- u16 WtCnt; // 写指针
- u16 RdCnt;// 读指针
- u16 BufLen;缓冲尺寸
- u8*RwBuf;// 读写缓冲
- } DF_RCV;
实现函数:
1. 初始化函数
本函数用于对串口结构体中的各种数据进行初始化。
- /**************************************************************************************
- * FunctionName : DFInit()
- * Description : 初始化
- * EntryParameter : None
- * ReturnValue : None
- **************************************************************************************/
- void DFInit(DF_RCV *pRcv)
- {
- u16 i;
- pRcv->WtCnt = 0x0000;
- pRcv->RdCnt = 0x0000;
- for (i=0; i
BufLen; i++) - {
- pRcv->RwBuf[i] = 0x00;
- }
- }
本函数用于把串口中断接收的数据放入数据缓冲区中,并且接收计数器加1.
- /**************************************************************************************
- * FunctionName : DFWriteByte()
- * Description : 数据接收(接收中断调用)
- * EntryParameter : None
- * ReturnValue : None
- **************************************************************************************/
- void DFWriteByte(u8 dat, DF_RCV *pRcv)
- {
- pRcv->RwBuf[pRcv->WtCnt] = dat; // 数据存入
- if (++(pRcv->WtCnt) >= pRcv->BufLen) // 缓冲判断
- {
- pRcv->WtCnt = 0;
- }
- }
本函数用于从接收缓冲区中读取未处理的一字节数据,读计数器加1.
- /**************************************************************************************
- * FunctionName : DFReadByte()
- * Description : 从接受缓冲中读取一字节数据
- * EntryParameter : None
- * ReturnValue : 返回读取数据
- **************************************************************************************/
- u8 DFReadByte(DF_RCV *pRcv)
- {
- u8 val = 0x00;
- val = pRcv->RwBuf[pRcv->RdCnt]; // 读取一字节
- if (++(pRcv->RdCnt) >= pRcv->BufLen)
- {
- pRcv->RdCnt = 0; // 清零
- }
- return val; // 返回数据
- }
本函数用于读取串口缓冲区中还未处理的数据的大小。
- /**************************************************************************************
- * FunctionName : DFGetLen()
- * Description : 获取缓冲区中未读数据长度
- * EntryParameter : None
- * ReturnValue : 返回数据长度
- **************************************************************************************/
- u16 DFGetLen(DF_RCV *pRcv)
- {
- return ((pRcv->WtCnt >= pRcv->RdCnt) ? ((pRcv->WtCnt - pRcv->RdCnt)) :
- ((pRcv->WtCnt + pRcv->BufLen) - pRcv->RdCnt));
- }
这部分代码为应用代码
为了保证数据的相对独立和模块化,下面代码将写入应用代码中,和上面的程序不能放在相同的文件中。
1. 数据定义
首先需要定义一个缓冲区,这个缓冲区的大小根据实际应用定义,其大小一般为数据帧的最大值的2倍。之后需要定义一个DF_RCV数据,在这个数据中需要初始化这个结构图的参数。特别需要注意,缓冲的大小,和缓冲区指针赋值。
单片机串口数据处 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)