当前位置:首页 > 单片机经验总结4--几个重要模块
#define TIMER_FLASHLED P1_0
则当时钟中断发生256次之后,改变发光管的状态。
通讯模块
串口资源做为单片机与外界通信的常用手段,通讯模块提供了完全缓冲的串口通讯底层机制,适用于长度不大的数据包的发送及接收。如果处理关键数据,需要用户自己提供纠错协议。
通讯模块由声明文件SComm.h及实现文件SComm.c组成。
初始化:调用函数InitSCommModule()来初始化通讯模块:
void InitSCommModule(BYTE byTimerReload, BIT bitTurbo) 参数说明:
byTimerReload: 定时器1的重装载初始值。 bitTurob: 当此参数为TRUE时,串行通讯在定时器1的溢出速率基础上加倍。为
FALSE时,串行通讯速率为定时器1的溢出速率。
缓冲区:模块使用了由宏
SCOMM_SENDBUFSIZE、SCOMM_RECEBUFSIZE及SCOMM_PKGBUFSIZE所指定长度的三个缓冲区,分别为发送、接收及数据包(用于处理接收到的数据)缓冲区(如果没有使用异步接收功能,则不需要使用数据包缓冲区)。 在缺省时,这三个宏都被定义为10,但用户可以自已按照系统的RAM资源占用情况在Config.h中重定义缓冲区的大小。需要注意的是,如果缓冲的长度不够,当发送或接收长数据包的时候可能会发生问题,关于数据缓冲区的最小值的设置可以参考下面的说明。 注意:需要尽快取出接收缓冲区中的数据,否则当缓冲区满之后,新的数据将被简单的丢掉。
字节级服务函数: 在Config.h文件中定义了宏SCOMM_DriverInterface(如:
#define SCOMM_DriverInterface),则可以使用字节级服务函数,即通讯模块的底层函数。
共有两个函数可以使用:
void SendByte(BYTE byData);
发送一个字节,如果当前缓冲区满,则等待。参数byData为要发送的数据。 BYTE ReceByte();
接收一个字节,如果当前缓冲区中没有数据,则此函数阻塞,直到接收到数据为止。接收到数据通过返回值返回。 可以通过调用IsSendBufEmpty() IsSendBufFull() IsReceBufEmpty() IsReceBufFull() 宏来判断缓冲区的空或满,以防系统阻塞。
不推荐直接使用这一级的服务函数,应该使用高层次上的服务函数或者在这一级服务函数的基础上构造自己的通讯函数。
数据包级服务函数:在Config.h文件中定义宏SCOMM_PackageInterface(如:
#define SCOMM_PackageInterface)则可以使用数据包级服务函数。
共有两个函数可以使用:
void SendPackage(BYTE* pbyData, BYTE byLen);
发送数据包,参数pbyData为将要发送的数据包缓冲区(数组)的指针,byLen为将要发送的数据包的长度。
当没有定义SCOMM_DriverInterface时,数据被完全缓冲。即不能够发送长度超过发送缓冲区长度的数据包。当定义了
SCOMM_DriverInterface时,采用单字节发送,这时不限制需要发送的数据的长度。
BYTE RecePackage(BYTE* pbyData, BYTE byLen);
接收数据包,参数pbyData为存放将要接收的数据的缓冲区,byLen为缓冲区长度。返回值为接收到的字节数,当模块的接收缓冲区为空时,函数非阻塞,立即返回,返回值为零。
共分享92篇相关文档