ZigBee串口通信
一、串口通信原理
1.什么是UART
UART : Universal Asynchronous Receiver/Transmitter 通用异步收发器
一种常用也是最简单的串行数据传输协议。数据线只需要两根就可以实现全双工。
Tx:发送数据线
Rx:接收数据线
A B
Tx <-----------> Rx
Rx <-----------> Tx
GND<-----------> GND
2.上位机与下位机
模块之间的通信,根据其在系统中的功能与作用可分为上位机 与 下位机。
上位机:
把处理性能强的计算机称为上位机。数据的统一处理都在上位机完成。
下位机:
把数据采集和发送的终端,处理性能单一的计算机,称为下位机。
一般一个上位机会对应多个下位机,这种模式可以使数据处理的更加全面,同时也大大降低成本。
3.UART数据帧
UART protocol 串口协议
串口发送和接收数据是以帧为单位,Frame
1帧(Frame) = 1start bit(起始位) + 5~9bits数据位 + 0/1bit校验位 + stop bits(0.5,1,1.5)停止位
起始位:一个周期的低电平
数据位:5~9bits数据位,具体是多少bits,需要双方协商,并且传送先传送最低位(LSB)
校验位:0bit:没有校验1bit:有校验奇校验:数据位+校验位的这一段数据里的1的个数是奇数。偶校验:数据位+校验位的这一段数据里的1的个数是偶数。
停止位:高电平1个停止位Baudrate(波特率):传输速率,即没一个秒传输了多少个bit位48009600115200bps: bits per second
二、串口配置
1. 串口初始化相关的结构体halUARTCfg_t
typedef struct
{bool configured;//是否设置串口uint8 baudRate; //波特率设置bool flowControl;//控制流设置uint16 flowControlThreshold;//RX缓存安全字节数(了解)uint8 idleTimeout;//RX来数据超时时间(了解)halUARTBufControl_t rx;//接收数据长度halUARTBufControl_t tx;//发送数据长度bool intEnable;//中断使能uint32 rxChRvdTime;//接收数据时间halUARTCBack_t callBackFunc;//回调函数
}halUARTCfg_t;
2. 串口初始化示例
static void InitUart(void)
{halUARTCfg_t uartConfig;uartConfig.configured = TRUE; //uartConfig.baudRate = HAL_UART_BR_38400;uartConfig.flowControl = FALSE;uartConfig.flowControlThreshold = 64; uartConfig.rx.maxBufSize = 128; uartConfig.tx.maxBufSize = 128; uartConfig.idleTimeout = 6; uartConfig.intEnable = TRUE; uartConfig.callBackFunc = SerialApp_CallBack; HalUARTOpen (SERIAL_APP_PORT, &uartConfig);
}
3.串口实现
串口的读操作函数为HalUARTRead(),主要功能是读取上位机通过串口发送至设备节点的数据。
uint16 HalUARTRead(uint8 port, uint8 *buf, uint16 len)
@port:串口端口的设置,可以设置为串口0或串口1;
@buf:数据缓冲区;
@len:数据长度。
返回值:实际成功读取的字节数
串口的读操作函数为HalUARTRead(),主要功能是读取上位机通过串口发送至设备节点的数据。
uint16 HalUARTRead(uint8 port, uint8 *buf, uint16 len)
{#if (HAL_UART_DMA == 1)if (port == HAL_UART_PORT_0) return HalUARTReadDMA(buf, len);
#endif
#if (HAL_UART_DMA == 2)if (port == HAL_UART_PORT_1) return HalUARTReadDMA(buf, len);
#endif
#if (HAL_UART_ISR == 1)if (port == HAL_UART_PORT_0) return HalUARTReadISR(buf, len);
#endif
#if (HAL_UART_ISR == 2)if (port == HAL_UART_PORT_1) return HalUARTReadISR(buf, len);
#endif#if HAL_UART_USBreturn HalUARTRx(buf, len);
#elsereturn 0;
#endif
}
串口的写操作函数为HalUARTWrite(),主要功能是实现向上位机或其他设备通过串口发送数据。
uint16 HalUARTWrite(uint8 port, uint8 *buf, uint16 len)
@port:串口端口的设置,可以设置为串口0或串口1;
@buf:数据缓冲区;
@len:数据长度。
返回值:实际成功发送的字节数
uint16 HalUARTWrite(uint8 port, uint8 *buf, uint16 len)
{
#if (HAL_UART_DMA == 1)if (port == HAL_UART_PORT_0) return HalUARTWriteDMA(buf, len);
#endif
#if (HAL_UART_DMA == 2)if (port == HAL_UART_PORT_1) return HalUARTWriteDMA(buf, len);
#endif
#if (HAL_UART_ISR == 1)if (port == HAL_UART_PORT_0) return HalUARTWriteISR(buf, len);
#endif
#if (HAL_UART_ISR == 2)if (port == HAL_UART_PORT_1) return HalUARTWriteISR(buf, len);
#endif#if HAL_UART_USBHalUARTTx(buf, len);return len;
#elsereturn 0;
#endif
}
三、程序设计
void SerialApp_CallBack(uint8 port, uint8 event) //接收数据会触发
{unsigned char buf[32]={0};HalUARTRead(HAL_UART_PORT_0,buf,32);if(strcmp((char*)buf,"hello") == 0){led_ctrl(LED0,LED_ON);led_ctrl(LED1,LED_ON);}else if(strcmp((char*)buf,"byebye") == 0){led_ctrl(LED0,LED_OFF);led_ctrl(LED1,LED_OFF);}}static void InitUart(void)
{halUARTCfg_t uartConfig;uartConfig.configured = TRUE; uartConfig.baudRate = HAL_UART_BR_9600; //设置波特率uartConfig.flowControl = FALSE;uartConfig.flowControlThreshold = 64; uartConfig.rx.maxBufSize = 128; uartConfig.tx.maxBufSize = 128; uartConfig.idleTimeout = 6; uartConfig.intEnable = TRUE; uartConfig.callBackFunc = SerialApp_CallBack; //设置回调函数 HalUARTOpen (HAL_UART_PORT_0, &uartConfig);
}if ( events & GENERICAPP_MY_EVT1 ) //事件{//事件要做的事P1_0 = !P1_0;P1_1 = !P1_1;unsigned char str[32]={"hello,are you ok?\r\n"};HalUARTWrite(HAL_UART_PORT_0,str,strlen((char *)str));unsigned char temp[32];if(Start_DHT11() == 1) //读取dht11数据{sprintf(temp,"temperature:%d,humidity:%d\r\n",temperature,humidity);HalUARTWrite(HAL_UART_PORT_0,temp,strlen((char *)temp));}else{HalUARTWrite(HAL_UART_PORT_0,"error\r\n",strlen("error\r\n"));}return (events ^ GENERICAPP_MY_EVT1);}
ZigBee串口通信相关推荐
- 关于arduino和zigbee串口16进制通信问题
2019独角兽企业重金招聘Python工程师标准>>> 这几天我做毕业设计遇到的问题.这个问题就是我的uno板子怎样和zigbee通信起来.先说说我的思路,把uno做成一个网关,从而 ...
- zigbee基础应用(五)uart串口通信
zigbee基础应用(五)uart串口通信 1.硬件篇 P0.2为RX P0.3为TX 2.芯片篇 用到的芯片的概况 3.计算篇 波特率的计算公式,通过对UxBAUD.BAUD_M和UxGCR.BAU ...
- [python] 3 、基于串口通信的嵌入式设备上位机自动测试程序框架(简陋框架)...
星期一, 20. 八月 2018 01:53上午 - beautifulzzzz 1.前言 做类似zigbee.ble mesh...无线网络节点性能测试的时候,手动操作然后看表象往往很难找出真正的原 ...
- python串口通信_python 读取串口数据的示例
python3 读取串口数据 demo 最近在写一个demo,zigbee串口连接树莓派,树莓派使用串口通信接受zigbee穿过来得值.其中我是用的树莓派是3代B+,zigbee每隔三秒钟从串口输出数 ...
- 【STC单片机学习】第十三课:串口通信和RS485
[朱老师课程总结 侵删] 第一部分.章节目录 1.13.1.通信有关的常见概念 1.13.2.什么是串行通信 1.13.3.51单片机的串行通信 1.13.4.STC51的串行通信相关寄存器1 1.1 ...
- ZStack通信(Zigbee协议栈通信)
ZStack通信-Zigbee协议栈通信 一.注册端点 二.发送数据函数 三.接收数据 一.注册端点 应用都是建立在端点ZDO(Zigbee Device Object)之上的, 所以要实现通信首先要 ...
- python做上位机读usb数据_使用python实现win10系统和arduino usb串口通信
前言 arduino有很多可以直接使用的传感器,可以很方便的获取大量的环境数据. 常见的有:温度(室温,冰箱,水箱等场景) 湿度(房间空气湿度,花盆土壤湿度等场景) 声(声控灯,噪音检测,深海测量,医 ...
- python第三方库之学习pyserial库--串口通信
pyserial串口通信库 1.安装pyserial库 2.填写串口参数的注意事项 3.简单封装一下 4.碰到的bug 1.安装pyserial库 pip install pyserial versi ...
- VC串口通信编程-2
VC串口通信编程 (2009-07-08 13:48:40) 转载▼ Win32串口编程(转:韩耀旭) 在工业控制中,工控机(一般都基于Windows平台)经常需要与智能仪表通过串口进行通信.串口通信 ...
最新文章
- java面试题,将String字符串转换成数字
- 理解AngularJS中的依赖注入
- E: Unable to locate package ros-kinetic-usb-cam
- 简单使用URLConnection、HttpURLConnection和HttpClient访问网络资源
- 2021-10-11 ! AVL树 及其平衡调整 四种情况 恋上数据结构笔记 (考过)
- 触发器三(行级DML触发器)(学习笔记)
- python自动化是什么意思_python appium自动化是什么?
- Java学习之文件操作
- 自考--运筹学--计算题总结
- 荣耀Magic4 Pro延迟上市:全新一代LTPO超级四曲面屏加持
- 【sklearn第六讲】特征提取(下)
- NYOJ 819奶牛 水
- 开集识别(Open Set Recognition)
- 时间复杂度和空间复杂度详解
- 工具-常识-证件照使用底色的RGB,红白蓝底色,护眼色
- 使用SpringBoot的优势
- EBS开发_应收发票接口导入
- VisionPro如何引用VPP?
- 刷脸支付免费领取保险全额赔付保安全
- [附源码]Python计算机毕业设计SSM基于Internet快递柜管理系统(程序+LW)