一、串口通信原理

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串口通信相关推荐

  1. 关于arduino和zigbee串口16进制通信问题

    2019独角兽企业重金招聘Python工程师标准>>> 这几天我做毕业设计遇到的问题.这个问题就是我的uno板子怎样和zigbee通信起来.先说说我的思路,把uno做成一个网关,从而 ...

  2. zigbee基础应用(五)uart串口通信

    zigbee基础应用(五)uart串口通信 1.硬件篇 P0.2为RX P0.3为TX 2.芯片篇 用到的芯片的概况 3.计算篇 波特率的计算公式,通过对UxBAUD.BAUD_M和UxGCR.BAU ...

  3. [python] 3 、基于串口通信的嵌入式设备上位机自动测试程序框架(简陋框架)...

    星期一, 20. 八月 2018 01:53上午 - beautifulzzzz 1.前言 做类似zigbee.ble mesh...无线网络节点性能测试的时候,手动操作然后看表象往往很难找出真正的原 ...

  4. python串口通信_python 读取串口数据的示例

    python3 读取串口数据 demo 最近在写一个demo,zigbee串口连接树莓派,树莓派使用串口通信接受zigbee穿过来得值.其中我是用的树莓派是3代B+,zigbee每隔三秒钟从串口输出数 ...

  5. 【STC单片机学习】第十三课:串口通信和RS485

    [朱老师课程总结 侵删] 第一部分.章节目录 1.13.1.通信有关的常见概念 1.13.2.什么是串行通信 1.13.3.51单片机的串行通信 1.13.4.STC51的串行通信相关寄存器1 1.1 ...

  6. ZStack通信(Zigbee协议栈通信)

    ZStack通信-Zigbee协议栈通信 一.注册端点 二.发送数据函数 三.接收数据 一.注册端点 应用都是建立在端点ZDO(Zigbee Device Object)之上的, 所以要实现通信首先要 ...

  7. python做上位机读usb数据_使用python实现win10系统和arduino usb串口通信

    前言 arduino有很多可以直接使用的传感器,可以很方便的获取大量的环境数据. 常见的有:温度(室温,冰箱,水箱等场景) 湿度(房间空气湿度,花盆土壤湿度等场景) 声(声控灯,噪音检测,深海测量,医 ...

  8. python第三方库之学习pyserial库--串口通信

    pyserial串口通信库 1.安装pyserial库 2.填写串口参数的注意事项 3.简单封装一下 4.碰到的bug 1.安装pyserial库 pip install pyserial versi ...

  9. VC串口通信编程-2

    VC串口通信编程 (2009-07-08 13:48:40) 转载▼ Win32串口编程(转:韩耀旭) 在工业控制中,工控机(一般都基于Windows平台)经常需要与智能仪表通过串口进行通信.串口通信 ...

最新文章

  1. java面试题,将String字符串转换成数字
  2. 理解AngularJS中的依赖注入
  3. E: Unable to locate package ros-kinetic-usb-cam
  4. 简单使用URLConnection、HttpURLConnection和HttpClient访问网络资源
  5. 2021-10-11 ! AVL树 及其平衡调整 四种情况 恋上数据结构笔记 (考过)
  6. 触发器三(行级DML触发器)(学习笔记)
  7. python自动化是什么意思_python appium自动化是什么?
  8. Java学习之文件操作
  9. 自考--运筹学--计算题总结
  10. 荣耀Magic4 Pro延迟上市:全新一代LTPO超级四曲面屏加持
  11. 【sklearn第六讲】特征提取(下)
  12. NYOJ 819奶牛 水
  13. 开集识别(Open Set Recognition)
  14. 时间复杂度和空间复杂度详解
  15. 工具-常识-证件照使用底色的RGB,红白蓝底色,护眼色
  16. 使用SpringBoot的优势
  17. EBS开发_应收发票接口导入
  18. VisionPro如何引用VPP?
  19. 刷脸支付免费领取保险全额赔付保安全
  20. [附源码]Python计算机毕业设计SSM基于Internet快递柜管理系统(程序+LW)

热门文章

  1. 十种最令人讨厌的编程语言,你使用的语言上榜了吗?
  2. 【内网安全】WinLinux内存离线读取Hashcat破解RDPSSH存储提取
  3. Word表格快速、完美转换成Excel
  4. Day 06 | 242.有效的字母异位词 349. 两个数组的交集 202.快乐数 1. 两数之和
  5. C++基础知识—— 基本输入输出
  6. 网络游戏——强联网游戏
  7. 进图形界面黑屏的解决办法
  8. 多亏了这几款软件,我才能坚持写博客这么多年!
  9. 聊聊路径规划算法—快速搜寻随机树算法
  10. 郴州职高哪个学计算机好,2021湖南郴州有什么职高学校