单片机实现串口收发 | 学习笔记

简介: 快速学习 单片机实现串口收发

开发者学堂课程【物联网平台开发全栈教程单片机实现串口收发学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址: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)
{
Init_IO();
//初始化所有的 Io 口(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)

{
SCON=0x50;//
AUXR |=0x01;
//定时器21T
AUXR |=0x04;
T2L0=xD0;
//设定定时初值 T2H=0xFE;//设定定时初值115200    22.1184MHZ
AUXR L= 0x10;//启动定时器2
ES=1;//允许 COM1串行口中断 TI=1;
//PS= 1;//COM1 最高优先级中断

Queue_Init(&CLI_Read_Buf);

}

(3)初始化的时候参数是怎样计算的:

用小工具

image.png

然后在串口一和串口二的底层做了先进先出,就是环形队列 Queue_Init(&CLI_Read_Buf);点击右键 go to,在左边circle_queue 里面,队列的长度定义了一个宏,512就是这个单片机串口可以接收512个字节的数据,如果超过了512个字节,而且没有处理,那剩下的数据就收不到了,就可以丢掉。相当于就是一个缓冲区,作用是为了保障数据的完整性。万一某个瞬间数据处理不及时,就可以用512个字节的缓冲区来稍微的缓解。

串口一都有初始化缓冲区的功能,但是这里只是做了接收缓冲区。

(1)定时器(涉及到时间的计算)

官方工具给的定时器计算器:

image.png

然后进行复制粘贴

定时器中段可以做串口一和串口二的断真

(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;
else
//表示至少有10ms 没有收到串口信息了,认为一帧信息到来

Mess_Count WIFI++;

6)大概的原理

首先做了一个标志位,如果串口中断能进来,那么这个标志位就清零;然后中断每十秒去++,加几次之后就会以为串口中断没有来,那就是中间停了一下,停一下就会以为来了一真消息,来了一真消息就可以把标志位返回给主程序,主程序一看大于零,就证明没有收到信息,就可以进行处理了。

相关实践学习
RocketMQ一站式入门使用
从源码编译、部署broker、部署namesrv,使用java客户端首发消息等一站式入门RocketMQ。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
7月前
|
内存技术
单片机(MCU)如何才能不死机之串口Overrun
单片机(MCU)如何才能不死机之串口Overrun
|
3月前
|
网络协议 Linux
嵌入式单片机开源的串口示波器实现方法
嵌入式单片机开源的串口示波器实现方法
23 0
|
7月前
STM32F0单片机快速入门七 串口(UART)操作从轮询到中断
STM32F0单片机快速入门七 串口(UART)操作从轮询到中断
STM32F0单片机快速入门七 串口(UART)操作从轮询到中断
|
7月前
|
芯片
STM32F0单片机快速入门六 用库操作串口(UART)原来如此简单
STM32F0单片机快速入门六 用库操作串口(UART)原来如此简单
|
7月前
|
C语言
简单的C语言宏定义结合全局变量的方法实现单片机串口实现透传模式
简单的C语言宏定义结合全局变量的方法实现单片机串口实现透传模式
61 0
|
8月前
【单片机期中测试】13.串口通信的应用(2)—— 超声波通过串口返回数据
【单片机期中测试】13.串口通信的应用(2)—— 超声波通过串口返回数据
78 0
|
9月前
|
存储
如何编写一个可变参数函数?如何让所有单片机的所有串口实现printf函数?
如何编写一个可变参数函数?如何让所有单片机的所有串口实现printf函数?
118 0
|
10月前
|
存储 芯片 内存技术
STM32单片机串口一键下载电路与操作方法详解
STM32单片机串口一键下载电路与操作方法详解
486 0
|
10月前
QT上位机串口+STM32单片机项目(二)
QT上位机串口+STM32单片机项目
164 0
|
10月前
QT上位机串口+STM32单片机项目(一)
QT上位机串口+STM32单片机项目
449 0