串口通信-发送和接收数据

这篇具有很好参考价值的文章主要介绍了串口通信-发送和接收数据。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

通信方式

硬件电路

软件部分

USART外设(同步/异步收发器)

波特率

引脚复用

初始化基本流程

发送

接收

语言简述

常用的函数

使用的结构体

引脚模式

打印数据的三种方法

使用printf


在实际的串口中,只能发送二进制数,也就是十六进制的最直接数据。如果想发送字符,就需要一个数据->字符的映射表(如ASCII表)

通信方式

全双工:两根线,数据的发送和接收互不影响。

半双工:一根线,一发一收。

单工:数据只能从一个设备到另一个设备。

举例子->

全双工:打电话。半双工:对讲机。单工:广播

有时钟线,同步通信

无时钟线,异步,甚至需要添加帧头帧尾使数据对齐。

单端信号(电平):它们引脚的高低电平都是对GND的电压差,所以单端通信的双方都必须共地,就是把GND接到一起。

而差分信号则不用。

硬件电路

串口收发,stm32学习笔记,stm32,单片机,学习

TX、RX、GND是必须要接的,而VCC若两个设备都有独立供电,可以不接。 

串口收发,stm32学习笔记,stm32,单片机,学习使用TTL电平。

软件部分

 俩种形式

串口收发,stm32学习笔记,stm32,单片机,学习

 有校验位就是9位数据位,没有就是8位。

串口收发,stm32学习笔记,stm32,单片机,学习

 数据低位先行

预发送数据 0x0f    (H)0000 1111(L)

L->H

检验位采用奇偶校验的方法(如果数据错了可以丢弃或者重传)

        校验3法 : 无校验 奇校验 偶校验

  1. 无校验 如1帧10位 没有校验位
  2. 奇校验 包括校验位会出现奇数个1
  3. 偶校验 包括校验位会出现偶数个1

如 奇校验 0000 1111 总共4个1,于是校验位就会补一个1,保证其是奇数。

奇偶校验只能保证一定程度上的验出率,更高级还是得了解CRC校验。

USART外设(同步/异步收发器)

【注意】USART1是挂在APB2总线上的,而其他是在APB1总线上的。

STM32F103C8T6 USART资源 :USART1(APB2)、USART2、USART3(APB1)

开启时钟的时候需要控制。

波特率

波特率发生器就是分频器,APB时钟进行分频,得到发送和接收移位的时钟。

USART1挂载在APB2【中文参考手册---系统架构】,所以就是PCLK2的时钟,一般是72M。其余的是APB1,也就是36M。

然后进行分频。晶振除以一个USARTDIV的分频系数,分频完之后还要再除以16

串口收发,stm32学习笔记,stm32,单片机,学习

引脚复用

串口收发,stm32学习笔记,stm32,单片机,学习

  串口收发,stm32学习笔记,stm32,单片机,学习 

初始化基本流程

参考中文手册USART部分

串口收发,stm32学习笔记,stm32,单片机,学习

发送

串口收发,stm32学习笔记,stm32,单片机,学习

接收

串口收发,stm32学习笔记,stm32,单片机,学习

语言简述

  1. 开启外设,开启时钟,把需要用的USART和GPIO的时钟打开
  2. GPIO初始化,把TX配置成复用输出,RX配置成输出
  3. 配置USART,直接使用一个结构体
  4. 如果只需要发送功能,直接开启USART初始化就结束了。如果还需要接收还需要开启中断。在开启中断之前,再加上ITConfig和NVIC的代码。

常用的函数

使用的结构体

USART_InitTypeDef、

串口收发,stm32学习笔记,stm32,单片机,学习

USART_ClockInitTypeDef【同步时钟,但是我们一般使用的是异步通信,所以不怎么用】

串口收发,stm32学习笔记,stm32,单片机,学习

串口收发,stm32学习笔记,stm32,单片机,学习

串口收发,stm32学习笔记,stm32,单片机,学习

引脚模式

        TX是USART外设控制输出脚,所以选择复用推挽输出(GPIO_Mode_AF_PP);

        RX是USART外设数据输入脚,所以选择输入模式。输入模式并不分什么普通输入、复用输入,一根线只能有一个输出,但可以有多个输入。所以输入脚外设、GPIO都可以使用。RX一般是浮空输入or上拉输入。因为串口波形空闲状态是高电平,所以不采用下拉输入。

void USART_Config(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	//GPIO配置控制
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;		//TX
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;		//RX
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	//USART配置控制
	USART_InitTypeDef USART_InitStructure;
	USART_InitStructure.USART_BaudRate = 9600;
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
	USART_InitStructure.USART_Parity = USART_Parity_No;
	USART_InitStructure.USART_StopBits = USART_StopBits_1;
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	USART_Init(USART1, &USART_InitStructure);
	
	//接收使能,接受不为空的时候产生中断
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);	
	
	//NVIC配置控制
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
	NVIC_Init(&NVIC_InitStructure);
	
	USART_Cmd(USART1, ENABLE);

}

ctrl+alt +space 开启联想

打印数据的三种方法

        1、printf

        2、sprintf

        3、封装sprintf(进阶学习--->C语言可变参数)

使用printf

串口收发,stm32学习笔记,stm32,单片机,学习

 还要进行重定向导入 stdio.h

printf->单。意思是只有一个串口可以使用。

sprintf->多。可以指定打印位置,不涉及重定向的东西。

串口收发,stm32学习笔记,stm32,单片机,学习

格式+内容。 

 MicroLIB是keil为嵌入式平台优化的精简库,在keil里面使用printf函数要使用这个,然后还需要重定向,将怕printf函数打印的东西输出到串口。先include ->stdio.h,然后重写fputc(这个是printf的底层)文章来源地址https://www.toymoban.com/news/detail-528909.html

到了这里,关于串口通信-发送和接收数据的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32实现三个串口同时开启发送接收数据

            实现STM32开通三个串口,每个串口都可以实现接收和发送数据。          编程时,严禁在中断函数中写入发送串口数据代码,否则会出错,具体原因不清楚(有大佬知道的话帮我指出),可能原因是DR寄存器冲突导致。         RX,TX连接到A9,A10使用串口1,使

    2024年04月13日
    浏览(52)
  • 最详细STM32,cubeMX串口发送,接收数据

    这篇文章将详细介绍 串口 发送数据,接受数据。 实验开发板:STM32F103C8T6。 所需软件:keil5 , cubeMX 。 实验目的:了解 串口的基础知识,掌握串口如何发送,接收数据 。 实验:串口发送数据点亮 led。 如果想了解串口的基础知识可以参考我之前的文章: STM32Cube串口USART发送

    2024年02月04日
    浏览(49)
  • 【STM32】STM32F103C8T6串口通信,实现3个串口收发数据

    串口通信(Serial Communications)实现单片机与电脑或者其它外设进行通信,通信时只需两根线(TX,RX)就可以实现数据传输。STM32f103有三个串口,分别为串口1(RX PA10, TX PA 9),串口2(RX PA3,TX PA2),串口3(RX PB11,TX PB10)。 以下代码是配置三个串口: usart.c usart.h main.c 注意,

    2024年02月12日
    浏览(36)
  • 【江科大】STM32:串口HEX/文本数据接收和发送(代码部分)(下)

    串口收发HEX数据包 2. 将跳线帽置在boot1 按复位键,点击开始编程即可。 由于该单片机只有串口1支持串口烧录。因此连接线连在串口1的所在的引脚上。 程序加载到bootloader完成后,再将跳线帽换到boot0,按复位键 为什么可以使用串口下载? 原理是实现程序的自我更新,即利用

    2024年04月22日
    浏览(41)
  • Stm32f103之串口发送数据,只接收到00的原因

    1、时钟选择的对不对, 2、GPIO口的TX引脚应该设置为“复用推挽输出” 3、中断初始化函数也不可加   4、硬件方面RXT、TXD电路接反。一直出现00的时候就要怀疑是不是线接反了。 总结:大概率是代码的问题一定要仔细检查

    2024年02月11日
    浏览(48)
  • 【STM32笔记】STM32的串口数据收发基础(四)(USART DMA模式)

         在STM32中编写串口通信数据收发有三种方式: 轮询模式 (阻塞方式), 中断模式 (非阻塞方式)以及 DMA模式 。      打开STM32CubeMX,前部分配置流程如串口数据收发基础(三)节里一样。配置好USART1的基本参数,开启定时器中断后,接下来就要开启USART1的DMA。

    2024年02月03日
    浏览(27)
  • STM32使用三种方式(阻塞、中断、DMA)实现串口发送和接收数据

    记录下学习STM32开发板的心得的和遇见的问题。 板卡型号:STM32F405RGT6 软件:STM32CubeMX、IAR STM32串口外设提供了3种接收和发送方式:阻塞、中断、DMA,主要给大家分享中断方式接收不定长数据和DMA使用空闲中断接收不定长数据。 阻塞发送: 阻塞接收: 两个函数需要注意的就

    2024年02月03日
    浏览(35)
  • 极度优雅的用stm32串口接收并分析不定长数据的方法(可用于发送和接收浮点数)

    我准备电赛的时候参加了学校为了准备电赛而举办的的积分赛,队友通过树莓派用给stm32发送执行指令,而我在队里作为写单片机的就需要分析数据包,每一个数据包都比较大也比较复杂,而且不定长,用传统的一个字节一个字节接收数据的方式收串口在代码层面上就显得和

    2024年02月04日
    浏览(45)
  • 嵌入式学习笔记——STM32的USART收发字符串及串口中断

    上一篇中,介绍了串口收发相关的寄存器,通过代码实现了一个字节的收发,本文接着上面的内容,通过功能函数实现字符串的收发,然后引入中断解决收发过程中while()死等的问题。 根据昨天的字符发送函数,只需要稍作修改即可实现发送函数了,一个字符串的结尾会有一

    2024年02月03日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包