C语言是面向过程的,而C++是面向对象的
C和C++的区别:
C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制)。
C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事务)控制。 所以C与C++的最大区别在于它们的用于解决问题的思想方法不一样。之所以说C++比C更先进,是因为“ 设计这个概念已经被融入到C++之中 ”。
C与C++的最大区别:在于它们的用于解决问题的思想方法不一样。之所以说C++比C更先进,是因为“ 设计这个概念已经被融入到C++之中 ”,而就语言本身而言,在C中更多的是算法的概念。那么是不是C就不重要了,错!算法是程序设计的基础,好的设计如果没有好的算法,一样不行。而且,“C加上好的设计”也能写出非常好的东西。
“串口”作为C语言嵌入式中的重要的通信方式,一直是面试官考察C语言软件工程师能力重要标志。小编我当时就被问懵逼了。
串口
“串口通信”是指串行通信,它的优点是“使用的资源少(占用的引脚少)”,它的缺点是“传输速度慢(每次传输一个bit位)”;
小编推荐一个学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++的学习裙【 六九九,四七零,五九六 】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!
接收函数:
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++的学习裙【 六九九,四七零,五九六 】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!
这些是C/C++能做的
服务器开发工程师、人工智能、云计算工程师、信息安全(黑客反黑客)、大数据 、数据平台、嵌入式工程师、流媒体服务器、数据控解、图像处理、音频视频开发工程师、游戏服务器、分布式系统、游戏辅助等