zstack 串口使用指南

合集下载

Zstack协议栈对串口进行操作

Zstack协议栈对串口进行操作

Zstack协议栈对串口进行操作Zstack协议栈中如何对串口进行操作想要使用串口功能,首先要进行初始化操作:halUARTCfg_t uartConfig;uartConfig.configured = TRUE; // 2x30 don't care - see uart driver.uartConfig.baudRate = SERIAL_APP_BAUD;uartConfig.flowControl = TRUE;uartConfig.flowControlThreshold = SERIAL_APP_THRESH; // 2x30 don't care - see uart driver.uartConfig.rx.maxBufSize = SERIAL_APP_RX_SZ; // 2x30 don't care - see uart driver.uartConfig.tx.maxBufSize = SERIAL_APP_TX_SZ; // 2x30 don't care - see uart driver.uartConfig.idleTimeout = SERIAL_APP_IDLE; // 2x30don't care - see uart driver.uartConfig.intEnable = TRUE; // 2x30 don't care - see uart driver.uartConfig.callBackFunc = SerialApp_CallBack; HalUARTOpen (SERIAL_APP_PORT, &uartConfig);程序首先定义了halUARTCfg类型的变量uartConfig,用来配置跟串口功能相关的波特率、流控制等等,其中最重要的是uartConfig.callBackFunc=SerialApp_CallBack。

Zstack入门教程

Zstack入门教程

Zstack入门教程第一步:安装Zstack从TI官方网站上下载的Zstack为:swrc072c.zip,我想这个压缩包大家都认识。

解压之后为:ZStack-CC2430-1.4.3.exe文件。

这个安装文件大家都会了。

默认安装路径为:C:\Texas Instruments\ZStack-1.4.3。

安装之后在C:\Texas Instruments\ZStack-1.4.3目录下有各PDF 文档为:Getting Started Guide CC2430.pdf,不用多说,这个肯定是要看的。

既然把它放到这么前面,说明它是入门中的入门文档。

下面就简单介绍下这个文档:1、介绍了安装ZStack-CC2430-1.4.3.exe需要的硬件软件条件:需要电脑、操作系统为Windows 2000或Windows XP。

至于更高或更低版本的本人没有尝试。

2、讲了安装流程。

这个有点多余了,这年月哪个有电脑的没有安装上百上千次的软件啊?但是需要强调的是安装路径----默认就好!3、接下来就是让我们看的第一个文档为:Start->Programs->Texas Instruments->ZStack-1.4.3->Z-Stack User’s Guide,既然让我看我就来看看这个文档!!第二步:Z-Stack 用户指导这个文档的更新时间为:2007年12月21日----应该还是比较新的版本。

由于本人英文的却有限,就不翻译了,浏览一遍,把大概意思说下就可以了:1、介绍1.1、适用范围本文档适用于CC2430ZigBee开发板----CC2430ZDK。

2、产品包描述(TI提供的CC2430ZDK工具包)2.1、安装包内容这个就是上面提到的的ZStack-CC2430-1.4.3.exe安装之后的所有内容了。

说白了就是包含Zstack开发所需要的所有软件和文档资料等。

2.2、开发板介绍两块SmartRF04EB 评估版,每个都可以用于CC2430EM评估模块。

ZStack V3.10.0 日志服务器 使用教程说明书

ZStack V3.10.0 日志服务器 使用教程说明书

3. 验证日志服务器
文档版本:V3.10.0
5
日志服务器 使用教程 / 3 典型场景实践
配置完成后,在日志服务器中输入以下命令,查看是否已正常获取管理节点日志: cat /var/log/test.log
如图 3: 获取管理节点日志所示: 图 3: 获取管理节点日志
如上所述,日志服务器已成功接收到管理节点日志信息,日志服务器配置生效。
云主机(VM Instance)
运行在物理机上的虚拟机实例,具有独立的IP地址,可以访问公共网络,运行应用服务。
镜像(Image)
云主机或云盘使用的镜像模板文件,镜像模板包括系统云盘镜像和数据云盘镜像。
文档版本:V3.10.0
7
日志服务器 使用教程 / 术语表
云盘(Volume)
云主机的数据盘,给云主机提供额外的存储空间,共享云盘可挂载到一个或多个云主机共同使用。
如图 1: 配置syslog server所示: 图 1: 配置syslog server
2. 在云平台创建日志服务器 在ZStack私有云主菜单,点击平台管理 > 日志服务器按钮,进入日志服务器界面,点击添加 日志服务器按钮,参考以下内容进行配置:
• 名称:设置日志服务器名称 • 简介:可选项,可留空不填 • IP地址:输入日志服务器的IP地址
注意事项 • 需要设置日志级别与日志服务器的配置完全一致,才能正常接收日志信息,日志级别支持设 置LOCAL0-9,仅为了匹配日志服务器,无高低之分。 • 需确保云平台管理节点与日志服务器的连通性。 • 配置成功后,管理节点的全部日志均会发送至日志服务器,不区分DEBUG、INFO、ERROR等 输出级别。 • 仅admin/平台管理员支持设置日志服务器。

【无线通信篇Zstack协议栈】CC2530ZigbeeZstack协议栈组网项目及详细讲解篇

【无线通信篇Zstack协议栈】CC2530ZigbeeZstack协议栈组网项目及详细讲解篇

【⽆线通信篇Zstack协议栈】CC2530ZigbeeZstack协议栈组⽹项⽬及详细讲解篇物联⽹⽆线通信技术,ZigBee⽆线传感⽹络CC2530最⼤的特点就是⼀个拥有⽆线收发器(RF)的单⽚机,既能实现单⽚机功能,也能实现⽆线传输Zstack协议栈是ZigBee协议栈⾥的翘楚,是ZigBee组⽹的⾸选协议栈项⽬实现功能:l 总共有三个端点,⼀个协调器和两个终端节点l 终端节点1连接DHT11温湿度传感器,定时上传给协调器l 终端节点2连接LED,可以通过协调器按键控制,定时上报LED开关状态l 协调器连接12864 OLED 屏幕,实时显⽰温湿度和LED状态l 协调器可以通过按键控制终端2的LED开关,控制后将会显⽰控制结果扩展功能(当前未实现,可进⼀步开发实现):l 连接协调器串⼝,将终端节点采集的数据通过串⼝发送,PC写上位机实现数据展⽰l 连接WIFI或者4G模块,WIFI模块如ESP8266,实现数据局域⽹⽆线传输或者上传到OneNET、机智云、阿⾥云、⾃⼰开发云服务器等,实现WEB或⼿机APP显⽰和控制。

⼀、项⽬测试(可想⽽知,⼴州的天⽓有多热,39℃了都)实现功能汇总:l 总共有三个端点,⼀个协调器和两个终端节点l 终端节点1连接DHT11温湿度传感器,定时上传给协调器l 终端节点2连接LED,可以通过协调器按键控制,定时上报LED开关状态l 协调器连接12864 OLED 屏幕,实时显⽰温湿度和LED状态l 协调器可以通过按键控制终端2的LED开关,控制后将会显⽰控制结果(⼀) 环境汇总芯⽚:CC2530F256Zstack协议栈:ZStack-CC2530-2.5.1a编程环境:IAR(⼆) 引脚分配协调器:128*64 OLED 0.96⼨屏幕供电:3.3V通信协议:IIC引脚:SDA P0_6SCL P0_7按键:IO:P0_1下降沿触发中断终端1:DHT11:通信⽅式:单总线协议供电:3.3VIO:P0_6终端2:LEDIO:P1_0说明:⾼电平点亮,低电平熄灭⼆、基础认识(⼀) CC2530单⽚机CC2530最⼤的特点就是⼀个拥有⽆线收发器(RF)的单⽚机,既能实现单⽚机功能,也能实现⽆线传输。

协议栈-Z-Stack协议栈基础和数据传输实验

协议栈-Z-Stack协议栈基础和数据传输实验

「ZigBee模块」协议栈-Z-Stack协议栈基础和数据传输实验花了好久写的...感觉还不错的呢...如果看,请细看...Mua~Z-Stack协议栈基础和数据传输实验一、实验目的终端节点将数据无线发送到协调器,协调器通过串口将数据发送到PC端,并在屏幕上显示出来。

串口优化把有线串口传输改为无线蓝牙传输。

二、实验平台硬件:2个zigbee节点,1个编译器,1根方口转USB数据线,一个蓝牙模块软件:实验基于SampleApp工程进行。

三、实验步骤1.串口初始化代码2.发送部分代码3.接收部分代码四、协议栈基础做实验之前先了解一点关于协议栈的基础知识吧~什么是协议栈?我们知道使用Zigbee一般都要进行组网、传输数据。

可想而知其中的代码数量是非常庞大的,如果我们每次使用zigbee都需要自己写所以代码的话,会非常麻烦。

因此就有了协议栈。

可以说它是一个小型的操作系统,把很多通信、组网之类的代码都封装起来了。

我们要做的只是通过调用函数来实现我们的目的。

来看一下协议栈的工作流程图(图1)。

然后我会对照流程图对协议栈进行简单的分析。

图1我们就从流程图的“开始”开始分析吧~打开工程文件SampleApp,main函数是程序执行的开始,我们要先找到它。

Main函数在ZMAin文件夹的ZMain.c下,打开它,找到main函数。

main();浏览一下main函数可以看到一开始都是各种初始化函数,即对应流程图中的“各种初始化函数”。

初始化中我们需要注意的是“osal_init_system();”初始化操作系统函数。

等一下会对它进行说明。

继续看下去,“osal_start_system();”这是执行操作系统函数,对应流程中的“运行操作系统”。

注意这个函数进去之后是不会再返回的。

总结main函数就是初始化和执行操作系统两个部分。

我们再来分析一下“osal_init_system();”这个函数,它的功能是初始化操作系统。

Z-stack串口的DMA模式简介

Z-stack串口的DMA模式简介

协议栈串口的DMA模式以下修改皆基于ZStack-CC2530-2.3.0-1.4.0版本:1.串口的初始化根据底板的引脚分配,我们用的是串口的UART0的Alt2方式。

需要修改的地方:(1)将option里预编译选项,ZTOOL_P1改成ZTOOL_P2,使#define HAL_UART_DMA 2为真。

(2)_hal_uart_dma.c的HalUARTInitDMA函数是对UART引脚以及寄存器的操作,修改如下:在HAL_UART_DMA == 2情况下的//#define HAL_UART_Px_RTS 0x20 // Peripheral I/O Select for RTS.//#define HAL_UART_Px_CTS 0x10 // Peripheral I/O Select for CTS.//屏蔽上两句,是因为该底板没有分配RTS和CTS的引脚#define HAL_UART_PERCFG_BIT 0x01 // USART0 on P1, Alt-2; so set this bit. //这里是将串口设置为UART0的Alt2方式#define HAL_UART_Px_RX_TX 0x30 // Peripheral I/O Select for Rx/Tx.//此处设置RX,TX引脚为P1_4,P1_5(3)在osal_init_system里osalInitTasks下MT_TaskInit的MT_UartInit(),是对串口的配置但要将uartConfig.flowControl = MT_UART_DEFAULT_OVERFLOW;改为uartConfig.flowControl = FALSE;协议栈默认的流控制是TRUE。

2. 串口的事件处理//系统主循环void osal_start_system( void ){……Hal_ProcessPoll(); // 串口与定时器轮询函数……}//定时器与串口轮询函数void Hal_ProcessPoll (){…….#if (defined HAL_UART) && (HAL_UART == TRUE)HalUARTPoll();#endif……}//串口轮询函数void HalUARTPoll( void ){#if HAL_UART_DMAHalUARTPollDMA();//根据DMA的方式选择DMA的轮询方式#endif……}//DMA串口轮询函数static void HalUARTPollDMA(void){……//以上是检查rxbuf里是否有数据写入,并对uartDMACfg_t dmaCfg结构体赋值if (evt && (dmaCfg.uartCB != NULL)){dmaCfg.uartCB(HAL_UART_DMA-1, evt);}//执行回调函数}注:回调函数dmaCfg.uartCB的初始化在HalUARTOpenDMA的第一句代码:dmaCfg.uartCB = config ->callBackFunc;而halUARTCfg_t uartConfig结构体的初始化在MT包里的MT_UART.c的MT_UartInit ()中1)typedef struct{bool configured;uint8 baudRate;bool flowControl;uint16 flowControlThreshold;uint8 idleTimeout;halUARTBufControl_t rx;halUARTBufControl_t tx;bool intEnable;uint32 rxChRvdTime;halUARTCBack_t callBackFunc;}halUARTCfg_t;该结构体是UART的配置结构体,设置UART的波特率,流控制,回调函数等等。

基于Z-Stack的串口通信.ppt

基于Z-Stack的串口通信.ppt

灯的亮灭与闪烁。
战略性信息产业教育服务提供商
联世界 育未来——创新物联教育


一、实训目的
二、实训内容 三、实训原理 四、实训步骤
战略性信息产业教育服务提供商
联世界 育未来——创新物联教育
实训内容
在用户应用层任务处理函数 SampleApp_ProcessEvent 中实 现每隔5秒向串口发送“Hello NEWLab!”;并增加一个应用层新任 务,实现由PC 端发送字符“1”和“ 2” 控制ZigBee模块的LED2 灯的
实训原理
(1) 第5)行代码HAL_ENTER_CRITICAL_SECTION(intSta te)函数的作用是把原先中断状态EA赋给X,然后关中断;以便后面 可以恢复原先的中断状态。目的是为了在访问共享变量时,保证变 量不被其它任务同时访问。
(2) 第6)行代码HAL_EXIT_CRITICAL_SECTION(intState)
tasksEvents[tasksCnt] SampleApp_ProcessEvent tasksArr[tasksCnt]
. . .
. . .
tasksEvents[2] tasksEvents[1] tasksEv ents tasksEvents[0] 事件表
Hal_ProcessEve nt Nwk_event_loo p macEventLoop tasksArr[ ] 函数表
数组tasksArr[ ]的每个元素都是函数的地址(用函数名表示函数
的地址),即该数组的元素都是事件处理函数的函数名,如第16行, SampleApp_ProcessEvent就是“通用应用任务事件处理函数名”, 该函数在SampleApp.c文件中被定义了。

ZSTACK串口读写的深度分析 DMA操作部分

ZSTACK串口读写的深度分析 DMA操作部分

HAL_ISR_FUNCTION( halUart1RxIsr, URX1_VECTOR ) HAL_ISR_FUNCTION( halUart0TxIsr, UTX0_VECTOR ) HAL_ISR_FUNCTION( halUart1TxIsr,t0 发送 //uart1 发送
U0BAUD = (config->baudRate == HAL_UART_BR_38400) ? 59 : 216; U0GCR = (config->baudRate == HAL_UART_BR_38400) ? 10 : 11; 这两个是真正定义波特率的地方,具体细节的寄存器定义同学们还是要看手册的 uart 部分哦。下图给 出了在 32MHz 频率下手册中的一波特率表:
代码比较多,我不一一列出,请自行比对代码。看代码,首先是 UART0 和 UART0 占用 P0 口的优先 级,UART0 最优先。之后根据是否使用 UART0 或 UART1 来初始化端口配置和 UART 工作模式配置,并 且为了防止片内 ADC 和 UART 抢 P0 口,还要禁止 ADC 用 RX 和 TX 口。实际上,我们做硬件的也不可 能糊涂到这两个口线同时使用。(TI 考虑的还是很全面的,赞一个!)。之后就是如果使用了 DMA 功能为 串口搞数据,就初始化 DMA 的一大套东西,不过值得注意的是这个协议栈只允许每一个时刻只能让 DMA 操作一个 UART。如果你想让两个 UART 都用 DMA 功能,那么恐怕 DMA 的 1,2 两个通道也要被 UART 使用了,如此太不厚道了,一共 5 个通道,被 UART 搞走了 4 个,哈哈。
为什么要这么做一个结构体呢?这个事情还是要从 CC2430 处理器 user guide 中 DMA 控制器操作说明 说起。我们先节选手册上关于 DMA 的几段描述:
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

它到底有什么意义。 cfg->rxHead = cfg->rxTail = 0; 在打开串口中有这么赋值,把它初始化为 0. 其实从上面那个中断函数就已经把这个参数的功能体现的淋漓尽致了: 就是串口接收数据,这个参数始终指向像一个参数被存放到 rxBuf 的位置。因为硬件串口缓 存器 U0DBUF 只能存放一个字节,如果不及时把这个接收到的转移出去,那么就会被下一个到 来的字节覆盖掉,所以 rxHead 变量就指向了这个存放的地址,当然是基于定义的 rxBuf 存储 空间。相当于一个数组赋值,那么必然有个变量会指向该数组的下一个赋值的参数,当然这 个变量的最终值也能在一定程度上体现这个被赋值数组的大小。所以 rxHead 在这里起到了类 似的作用,而 if ( cfg0->rxHead == cfg0->rxMax )这一句判断也说明的很清楚,一旦这个 计数达到了定义的最大接收数量,也就是说已经把 rxBuf 存储空间占满了,那么就不能在继 续存放了,否则存放的位置就未知,而且有可能造成程序中其他变量的损坏,那么这个时候 如果串口还有数据怎么办?那就需要把 rxBuf 清空在接收了,否则就会丢失数据。 3、uint8 rxTail; 这个变量就与上面提到的清空 rxBuf 密切相关了。 while ( (cfg->rxTail != cfg->rxHead) && (cnt < len) ) {
}
/* It is necessary to stop Rx flow in advance of a full Rx buffer because
* bytes can keep coming while sending H/W fifo flushes.
*/
if ( cfg->rxCnt >= (cfg->rxMax - SAFE_RX_MIN) )
还是藏的很隐蔽就是了,呵呵!!!!关于这个 128 我是做个实验的,在串口互发的实验也是定
义的 128.多了就会丢掉!这个下次有机会在说。
5、uint8 rxCnt ;
static void pollISR( uartCfg_t *cfg )
{
uint8 cnt = UART_RX_AVAIL( cfg );
cfg0->rxHead = 0; } else {
cfg0->rxHead++; } } 这个是串口 0 中断函数:其中 cfg0->rxBuf[cfg0->rxHead] = U0DBUF,显然是把 U0DBUF 中 的数据转移到存储区去。 从这个函数中还能看出两个问题: rxHead 是否用作了串口接收计数,而 rxMax 代表最大的接收数据长度。 2、uint8 rxHead 字面理解为接收头,但是上面已经提到了似乎起到了串口接收计数的功能。那下面就来看看
走的数据。首先从字面理解 avail 为“效用”的意思,那么扩展下为 available,那么意思
就是“有用的”“有空的”,呵呵!只有理解其实也很有意思哈。
再从后面的判断语句,cfg->rxHead - cfg->rxTail,由于有上面的讲解,理解这个就很容易 了,有的数据数量-已经取走的数据数量,那么就省还有多少各有用的数据量。 而 cfg->rxMax - cfg->rxTail + cfg->rxHead +1 理解就需要转个弯了,因为此时 cfg->rxHead > cfg->rxTail,那么什么情况下才满足这种条件呢,只有一种情况,rxHead 已经是第二轮 接收计数了,而 rxTail 还在上一轮取数。cfg->rxMax - cfg->rxTail,也就是第一轮把 rxBuf 填满的数据取走 cfg->rxTail,那么就是第一轮剩下又有的数据,那么在+ cfg->rxHead 这个, 就 是 加 上 cfg->rxHead 第 二 轮 接 收 的 数 据 , 至 于 后 面 +1 的 理 解 为 cfg->rxBuf = osal_mem_alloc( cfg->rxMax+1) , 分 配 存 储 空 间 本 来 就 比 rxMax 多 分 了 一 个 。 ------------------------------这里我仍然有疑惑,谁有深刻的理解欢迎交流! 而 if ( cfg->rxCnt >= (cfg->rxMax - SAFE_RX_MIN) )这里理解就更微妙了,表明接收缓 存空间已经满了,所以下面就 RX_STOP_FLOW( cfg ); #define RX_STOP_FLOW( cfg ) { \ if ( !(cfg->flag & UART_CFG_U1F) ) \ {\
{
RX_STOP_FLOW( cfg );
ቤተ መጻሕፍቲ ባይዱ
}
}
}
就这个函数使用这个参数最典型了。
关心的第一句不 if ( cfg->rxCnt != cnt )一开始就与 cnt 变量有关系,而且更加过分的是
在里面直接 cfg->rxCnt = cnt,所以不得不关系下 cnt 了。
uint8 cnt = UART_RX_AVAIL( cfg );这个函数的第一句,而:
if ( !(cfg->flag & UART_CFG_RXF) )
{
// If anything received, reset the Rx idle timer.
if ( cfg->rxCnt != cnt )
{
cfg->rxTick = HAL_UART_RX_IDLE;
cfg->rxCnt = cnt;
zstack 串口使用指南.txt 如果不懂就说出来,如果懂了,就笑笑别说出来。贪婪是最真实 的贫穷,满足是最真实的财富。幽默就是一个人想哭的时候还有笑的兴致。转载 zstack 串 口使用指南 2009-05-04 02:00Z-STACK 问题之串口结构 uartCfg_t 乱说
typedef struct { uint8 *rxBuf;//接收缓存 uint8 rxHead;//头 uint8 rxTail;//尾 uint8 rxMax;//接收最大长度 uint8 rxCnt;//计数 uint8 rxTick;//时间 uint8 rxHigh;//高位 uint8 *txBuf; #if HAL_UART_BIG_TX_BUF uint16 txHead; uint16 txTail; uint16 txMax; uint16 txCnt; #else uint8 txHead; uint8 txTail; uint8 txMax; uint8 txCnt; #endif uint8 txTick; uint8 flag;//标志位 halUARTCBack_t rxCB; } uartCfg_t; 有个朋友问我上面的问题,说句老实话,我可是第一次见这个东东,拿到手之后比我那朋友 还迷糊,那位朋友至少还知道大概是什么功能,仅仅是不清楚每个参数的具体含义和功能。 为了解决这个问题,我可是遍寻名家,最终结果是人家也不是很清楚,因为平常大家只管用, 哪管那么多这些具体细节?没办法,我只有自己解决了,希望我的努力能给大家一点点启示! 首先说说这个结构的应用范畴,它是直接面向串口的应用层,也就是与客户接触的还是比较 紧密的一个结构,一般是在串口接收数据和发送数据的时候使用。而串口有两种方式,一种 是普通的串口,一种是 DMA 方式。这里我只针对普通串口来分析这个结构。 首先来看看这个结构在什么地方用到了? static void pollDMA( uartCfg_t *cfg ) static void pollISR( uartCfg_t *cfg ) 这两个函数直接就用到了这个结构作为参数,应该说是联系最紧密的了,是我们重点剖析的 对象了,但是这里不看 DMA,因为这个俺很外行----------哈哈!!!! uint16 HalUARTRead( uint8 port, uint8 *buf, uint16 len ) uint8 HalUARTOpen( uint8 port, halUARTCfg_t *config )
*buf++ = cfg->rxBuf[cfg->rxTail]; if ( cfg->rxTail == cfg->rxMax ) {
cfg->rxTail = 0; } else {
cfg->rxTail++; } cnt++; } 这里是在 uint16 HalUARTRead( uint8 port, uint8 *buf, uint16 len )函数中调用的,实 际上把 rxBuf 空间的数据读走,然后 rxBuf 可以继续串口数据的接收了。可以看到*buf++ = cfg->rxBuf[cfg->rxTail]这个是在转移数据,而转移多少的计数是以 rxTail 来计数的。一 旦计数达到 rxMax,那么该计数归 0,因为 rxMax 定义了 rxBuf 的最大的数据量。 这里需要强调一点:rxTail 和 rxHead 的区别。 我第一眼看到这个两个变量的反应是:rxHead 为串口数据串接收的头,而 rxTail 为串口数 据串接收的尾(结束),因为这样理解符合我们平常编写串口通信协议习惯,有头有尾。但是 仔细看了只有,虽然也是头与尾的概念,但是却不应该这么理解。 rxTail 和 rxHead 应该是针对 rxBuf 来说的。rxHead 是往 rxBuf 装数据的计数,而 rxTail 是从 rxBuf 取走数据的计数。希望这个一定要注意。所以我们就不难理解:rxHead 是在串口 接收中断的时候强调使用,而 rxTail 是在 HalUARTRead 函数中使用了。这里还需要注意一点 点,HalUARTRead 并不是读取 UxBUF 数据,而是读取 rxBuf 中数据。 其实仔细想想,这两个参数还是与串口的头和尾有关的。头又名开始,串口接收数据开始存 放数据的指向;尾又名结束,是把串口数据取走用作他用的指向。rxHead=0,标示串口接收 数据新的起点,新的开始;而 rxTail=0,标示把串口接收到的数据全部取走用作他用,-----结束。体现了串口数据从接收到被使用的整个过程。
相关文档
最新文档