开发者学堂课程【物联网平台开发全栈教程:单片机实现串口收发】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/562/detail/7700
单片机实现串口收发
内容介绍
一、单片机实现串口收发
二、单片机运行日志输出
三、单片机的串口1和串口2以及定时器
一、单片机实现串口收发
1.单片机整体程序简述:
(1)内部时钟22.1184MHZ
(22.1184MHZ 是证明写这个程序的时候单片机运行在22.1184MHZ 这个频率之下的。)
这个频率是可以设置的,在写程序的时候选择22.1184,然后点击打开程序文件,点击下载/编程就可以了。
(2)包含的头文件:
#include·#include·#include
//用来 CLI 交互#include
//用来 WIFI 交互#include
//定时器#include
//用来读取温度#include
// 用来驱动 LED,读取按键等#include"IAP_ EEPROM.h"
//内部 Flash 保存内容#include
//cli 交互逻辑#include
二、单片机运行日志输出
1. 插入一个 usb,串口号就会识别 COM9。
2. 按下复位之后,就有了相关的版本信息。
3. 开始执行 AT 指令,它就会告诉串口的AT指令目前执行到那个状态、执行成功与否。如果出现了发送失败,那就是连接不上 WIFI
三、单片机的串口1和串口2以及定时器
1、代码:
void main (void)
//初始化所有的 Io 口(IO 口的输入输出要配置好)
{
Init_IO();Init_uart1();
//115200用来 cLI 交互Init_Uart2();
115200用来和 WIFI 进行通信(然后初始化 uart1()和 uart1(2))Init_Timer1();
打开定时器110ms 定时器(初始化定时器,定时器的作用就是接受数据的时候要根据时间来断真。比如发一串数据过来,它说了一堆,但中间必须停留一下,Timer 就是用来检测它停顿了多久,以此为标准来判断有没有收到真信息;定时器的第二个作用就是定时发送信号包给服务器)Init_ADC();
初始化 ADC 接口,用来读取温度传感器的数值。
打开单片机全局中断(ADC 的意思就是模拟量、数字量转换器。将电压转换为数字量,因为单片机运行的时候准只能处理数字123456,它不能处理模拟量。但是有了 ADC 就可以解决这个问题。当单片机检测到 ADC 的时候,换算成电压,再计算一下。根据多少幅,还有手册上提供的方式就可以计算出温度是多少摄氏度。)EA=1
//打开单片机全局中断 (定时器是需要中断的)
Delaylms(50);
(开机时候进行了延时,延时的作用就是让内部复位完毕)
串口1出来之后输出的数据:
Send_Strl("\r\n Hello This is LingYao! \r\n") ;
Send_Strl("\r\n ALi-IOT LP Demo Based On 51-MCU. \r\n") ;
SendStrl("\r\n CLI Starting.\r\n") ;
通过串口1输出一些调试信息到 uart,帮助我们了解目前程序运行到什么情况了Init_WIFI();
设置 WIFI 的 SSID,MQTT 参数。(初始化 WIFI,通过串口让 WIFI 进入到 TCP 模式,进入之后,连接一下MQTT_Connect
发动报文,如果发送成功,就会进入死循环,死循环里面的第一条就是执行 CLI 逻辑)MQTT_Connect();
Send Heart();
//定时发送心跳包Analyze_MQTT_Read();
//解析服务器下发的消息
Pub_ Temperature();
//定时上报温度信息
(1)链接 MQTT 服务器
while(1)
{
执行 CLI 逻辑(CLI 逻辑配合小工具使用。
CLI();
比如点击了连接单片机,那 CLI 就会回复,证明连接成功。连接成功之后,读取单片机数据、写入数据到单片机这两个按钮就会起作用。CLI 收到数据之后,就会把里面的内容都扔过来,扔过来之后小工具就会显示目前写的是什么内容。如果里面的内容都有更新,那就会计算参数,计算参数之后就点击写入数据到单片机,然后就可以把数据写到单片机的内部,CLI 就是执行这个逻辑的)
(2)描述:串口初始化程序
void Init Uart1 (void)
{
//定时器2,1T
SCON=0x50;//
AUXR |=0x01;AUXR |=0x04;
//设定定时初值 T2H=0xFE;//设定定时初值115200 22.1184MHZ
T2L0=xD0;AUXR L= 0x10;
//启动定时器2ES=1;
//允许 COM1串行口中断 TI=1;//PS= 1;
//COM1 最高优先级中断
Queue_Init(&CLI_Read_Buf);
}
(3)初始化的时候参数是怎样计算的:
用小工具
然后在串口一和串口二的底层做了先进先出,就是环形队列 Queue_Init(&CLI_Read_Buf);点击右键 go to,在左边circle_queue 里面,队列的长度定义了一个宏,512就是这个单片机串口可以接收512个字节的数据,如果超过了512个字节,而且没有处理,那剩下的数据就收不到了,就可以丢掉。相当于就是一个缓冲区,作用是为了保障数据的完整性。万一某个瞬间数据处理不及时,就可以用512个字节的缓冲区来稍微的缓解。
串口一都有初始化缓冲区的功能,但是这里只是做了接收缓冲区。
(1)定时器(涉及到时间的计算)
官方工具给的定时器计算器:
然后进行复制粘贴
定时器中段可以做串口一和串口二的断真
(1)主要代码:
if (Mess_ Flag_ CLI)
//串口接收中断有变化
{
if(Reading_ CLI2 != Reading CLI)Reading CLI2 = Reading_CLI;
}else
//表示至少有10ms 没有收到串口信息了,认为一帧信息到来
Mess_Count CLI++;
//串口接收中断有变化
Mess_Flag_CLI=0;
if(Mess_Flag_WIFI)
if(Reading_WIFI2 != Reading_ WIFI)
Reading_WIFI2=Reading wiFI;
//表示至少有10ms 没有收到串口信息了,认为一帧信息到来
else
Mess_Count WIFI++;
(6)大概的原理
首先做了一个标志位,如果串口中断能进来,那么这个标志位就清零;然后中断每十秒去++,加几次之后就会以为串口中断没有来,那就是中间停了一下,停一下就会以为来了一真消息,来了一真消息就可以把标志位返回给主程序,主程序一看大于零,就证明没有收到信息,就可以进行处理了。