C语言新手入门基础学习之“编程超简单系列”:C语言面试的常客——“串口通信”

C语言是面向过程的,而C++是面向对象的

C和C++的区别:

C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制)。

C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事务)控制。 所以C与C++的最大区别在于它们的用于解决问题的思想方法不一样。之所以说C++比C更先进,是因为“ 设计这个概念已经被融入到C++之中 ”。

C与C++的最大区别:在于它们的用于解决问题的思想方法不一样。之所以说C++比C更先进,是因为“ 设计这个概念已经被融入到C++之中 ”,而就语言本身而言,在C中更多的是算法的概念。那么是不是C就不重要了,错!算法是程序设计的基础,好的设计如果没有好的算法,一样不行。而且,“C加上好的设计”也能写出非常好的东西。

C语言新手入门基础学习之“编程超简单系列”:C语言面试的常客——“串口通信”_第1张图片

“串口”作为C语言嵌入式中的重要的通信方式,一直是面试官考察C语言软件工程师能力重要标志。小编我当时就被问懵逼了。

C语言新手入门基础学习之“编程超简单系列”:C语言面试的常客——“串口通信”_第2张图片

串口

“串口通信”是指串行通信,它的优点是“使用的资源少(占用的引脚少)”,它的缺点是“传输速度慢(每次传输一个bit位)”;

C语言新手入门基础学习之“编程超简单系列”:C语言面试的常客——“串口通信”_第3张图片

小编推荐一个学C语言/C++的学习裙【 六九九,四七零,五九六 】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!

串口通信

从上图可以看到串口通信是由两根线控制的,一根是TX(以主机为视角)也就是发送线,还有一根RX也就是接收线;发送的数据通过发送线发送给从机,接收的数据通过接收线从从机处接收,所以发送和接收是分开的,相互之间不影响。所以“串口RS232”可以实现“全双工”通信,“全双工”通信就是在同一时间进行发送和接收数据。但是“串口RS232”在工程中使用的很少,因为它的传输距离很短,不适合在工程中使用;所以就有了“串口RS485”,它可以实现长距离的数据传输,但是它是“半双工”通信,所谓的“半双工通信”就是同一时间只能发送数据或者只能接收数据,这就是他们的不同点,面试官常常会问到这个,其他的使用起来都一样。给大家总结一下:

“串口RS232”:传输距离短,“全双工通信”;

“串口RS485”:传输距离唱,“半双工通信”,通过一个控制端,控制当前处于发送还是接收状态;

所以今天给大家重点讲解“串口RS485”,其实和大家讲,串口使用特别特别简单,只要将串口初始化OK了,接下来只要把数据赋值到“发送寄存器”中就可以了,怎么传送数据是“串口”自己做的事情,还有接收数据,你只要从“接收寄存器”中将数据读取出来就可以了,超级简单,就像你打电话,你只要把电话号码拨通,接下来用嘴说话,用耳朵去听就好了,没人要求你掌握你说的话到底是怎样传输的。要知道我们的任务是使用好这些功能而不是去创造这些功能,每一层的工程师做好自己的工作就OK了,至于“电话”那不是有人给你做出来了吗?你只要“会用”就可以了。

好了接下来就和大家去了解如何初始化串口。还是那句话,初始化什么设备就先创建那个设备的结构体,但是上面和大家说了,“串口通信”需要使用两个引脚,所以我们要先初始化对应的引脚,之后再初始化串口设备。

初始化引脚:很简单就不和大家多说了

GPIO_InitTypeDef GPIO_InitStructure;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //使能GPIOA时钟

//串口1对应引脚复用映射(引脚要配置为串口功能,和大家讲过引脚对应很多功能使用前要先选择好)

GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); //GPIOA9复用为USART1

GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1); //GPIOA10复用为USART1

//USART1端口配置

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; //GPIOA9与GPIOA10

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz

GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出

GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉

GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA9,PA10

配置串口:

USART_InitTypeDef USART_InitStructure; //创建设备结构体

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能USART1时钟

USART_InitStructure.USART_BaudRate = bound;//波特率设置,每秒传输多少个bit位

USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式,每次传输的数据为1个字节

USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位 传输数据最后添加一个停止位用来表明传输结束

USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位

USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制

USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//收发模式

USART_Init(USART1, &USART_InitStructure); //初始化串口1

USART_Cmd(USART1, ENABLE); //使能串口1 ,串口初始化结束之后就要开启串口功能

另外一般接收数据我们采用中断方式,有数据过来了,数据放在接收缓冲区中,我们通过中断将数据读取出来,避免数据被下一个数据覆盖造成丢失数据的情况。所以要配置中断和中断触发函数。

配置中断:

NVIC_InitTypeDef NVIC_InitStructure; //创建中断结构体

USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启相关中断

//Usart1 NVIC 配置

NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口1中断通道

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//抢占优先级3

NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;//子优先级3

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//IRQ通道使能

NVIC_Init(&NVIC_InitStructure);//根据指定的参数初始化VIC寄存器

发送数据函数:

#define Int08U unsigned char

void UART1PutChar(Int08U ch)

{

(RS485这需要使能发送,因为RS485是单双工,默认状态是接收状态,所以这里需要改变控制发送和接收状态的端口的电平例如:将引脚PF8置为低电平,RS232则不需要这一步)

while(!USART_GetFlagStatus(USART1,USART_FLAG_TC));//判断前一个数据是否发送完成,若未完成在等待完成

USART_SendData(USART1,ch); //发送数据的函数,只要将数据放到这里就OK了

(RS485数据发送结束后还要将状态改为接收状态,例如:将引脚PF8置为高电平,RS232则不需要这一步)

}

C语言新手入门基础学习之“编程超简单系列”:C语言面试的常客——“串口通信”_第4张图片

小编推荐一个学C语言/C++的学习裙【 六九九,四七零,五九六 】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!

接收函数:

Int08U UART1GetChar(void)

{

return USART_ReceiveData(USART1);//返回接收寄存器中的数据就OK啦

}

中断函数:

void USART1_IRQHandler(void) //这个函数的名称是固定的,用的串口几就是USART几,上面发送和接收函数名自己定义

{

Int08U rev;

if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)//判断中断标志位如果寄存器中有数据

{

rev = UART1GetChar();

UART1PutChar(Rev);

USART_ClearITPendingBit(USART1, USART_IT_RXNE);//处理结束之后清除中断标志位

}

}

这个函数就是是想将接受到的数据再发送出来。

看完上面的我们梳理一下使用串口的步骤:

1、配置管脚为串口输入输出模式

2、配置串口参数如:波特率、字长、停止位、校验位、数据控制流和收发模式,之后初始化并开始串口功能

3、配置中断

4、封装发送和接收函数

5、封装中断函数

就上面5个步骤,简明扼要,只要配置好,你就可以实现通信了。还是那句话学习C语言和嵌入式并不难,我们只要将结构捋一捋,条理很很明白,写程序之前一定要先思考,将步骤全都写出来。

你要实现什么功能?

这些功能都需要哪些设备?

这些设备该如何使用和配置?

从大到小,从外到内,从总功能到细节功能!只有这样一步一步,你就会发现使用C语言实现嵌入式功能很简单,都是模块化的事情,你要做的就是思考思考再思考。

好了谢谢大家今天的陪伴,如果大家喜欢话点个赞或评论两句吧,小编需要大家的支持。当然如果小编哪里写错了还希望大家批评指正,再次谢谢大家了。

C语言新手入门基础学习之“编程超简单系列”:C语言面试的常客——“串口通信”_第5张图片

小编推荐一个学C语言/C++的学习裙【 六九九,四七零,五九六 】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!

这些是C/C++能做的

服务器开发工程师、人工智能、云计算工程师、信息安全(黑客反黑客)、大数据 、数据平台、嵌入式工程师、流媒体服务器、数据控解、图像处理、音频视频开发工程师、游戏服务器、分布式系统、游戏辅助等


C语言新手入门基础学习之“编程超简单系列”:C语言面试的常客——“串口通信”_第6张图片
C语言新手入门基础学习之“编程超简单系列”:C语言面试的常客——“串口通信”_第7张图片
C语言新手入门基础学习之“编程超简单系列”:C语言面试的常客——“串口通信”_第8张图片

你可能感兴趣的:(C语言新手入门基础学习之“编程超简单系列”:C语言面试的常客——“串口通信”)