stm32之串口通信

 

目录

一、数据的传送方式

1.串行通信

2.并行通信

 

 

二、数据的通信方式

1、单工通信 iic,spi

2、半双工通信 spi

3、全双工通信 usart,spi

 

 

三、数据的同步方式

1、同步通信

2、异步通信

比较  有无时钟SCLK的约束

 

 

四、数据的通信速率

1、比特率(在IIC,SPI中使用)

2、波特率(在串口中使用)

五、串口通信

1、串口数据包的基本组成

六、串口的结构体

1、串口通信

2、异步收发器的结构体的配置

3、同步收发器的结构体配置

4、常用函数

 

七、配置串口的发送与接收

1、串口接收字符

2、主函数


一、数据的传送方式

1.串行通信

速度慢,但占用资源少,按顺序传输、逐个位传输,(使用一个数据线就能解决传输问题,即一个I/O口就可以解决问题)

2.并行通信

速度快,但占用资源多,各个位同时传输、多位传输,(多少位数据就需要多少根数据线)

适用于:USART,IIC,SPI

 

二、数据的通信方式

1、单工通信 iic,spi

A发--单向通道--B收

2、半双工通信 spi

A发--双向通道--B收 / B发--双向通道--A收

(同一时刻时,一个设备发送时,另一个就不能同时进行发送)

3、全双工通信 usart,spi

A发、B发--双向通道--B收、A收

(两个设备在同一时刻都可以进行收发数据,传输)

三、数据的同步方式

【同步 & 异步】

1、同步通信

①数据传送以数据块(多个字符组成的)的形式的;在数据块内,字符与字符间无间隔

②接收与发送时钟严格同步,有同步时钟SCLK

③通信双方的各自的两个时钟SCLK是连在一起的,提供同步时钟;接受与发送是同步的

2、异步通信

①没有时钟线SCLK的约束,因此有了②

②在发送数据之前发送一个起始位, 发送奇偶检验位+想要发送的字符,最后发送停止位

 

比较  有无时钟SCLK的约束

 

 

四、数据的通信速率

1、比特率(在IIC,SPI中使用)Bitrate

每秒传输的二进制位,bit/s

2、波特率(在串口中使用)Baudrate

每秒传输的码元个数

一个二进制位表示一个码元

 

 

五、串口通信

TTL电平:数字芯片的电平,单片机使用,0-5V

232电平:电脑串口的电平,工业电平,-3-15V

原生串口通信:直接设备与传感器连接  (eg. GPS模块,WiFi模块...)

1、串口数据包的基本组成

起始位:逻辑0  (第一个低电平)

停止位:逻辑0.5/1/1.5  (高电平)  可以达到校准同步时钟的目的

有效数据位:

校验位:

            校验方法有:

                                  奇校验:有效数据+校验位中的“1”个数为奇数;   即如:10010110,有四个1了,校验位加上一个1,凑5个,为奇校验 (九个位传输)

                                  偶校验:有效数据+校验位中的“1”个数为偶数;   即如:10010110,有四个1了,校验位加上一个0,不加1保持4个1不变,为偶校验  (九个位传输)

                                  0校验:校验位总为0

                                  1校验:校验位总为1

                                  无校验:数据不包含校验位

 

六、串口的结构体

1、串口通信

TX 发送(配置输出模式)   RX 接收(配置输入模式,浮空输入)

USART:同步异步收发器

UART  :异步收发器

↓ 在“中文参考手册” ↓

可以看出 USART1APB2总线下,其余在APB1总线下

APB2的频率与AHB系统总线的频率一样 (72*10的6次方 hz )

APB1  (32*10 6)

2、异步收发器的结构体的配置

  • uint32_t USART_BaudRate;     //波特率
    

          

 波特率设置: (在APB2中是)使用固件库时直接设置  =115200 =72 *10(6次方)/16*USATDIV

 

  • uint16_t USART_WordLength;   //配置数据位的字长

          

有 8位 与 9位

 

  • uint16_t USART_StopBits;   //停止位
    

        

正常情况下使用 1 停止位

 

  • uint16_t USART_Parity;    //校验位的配置

          

 

  • uint16_t USART_Mode;    //模式的设置
    

         

USART_Mode_Rx | USART_Mode_Tx      即可 表示Rx输入Tx输出都可行

  • uint16_t USART_HardwareFlowControl;    //配置硬件流模式
    

          

一般情况下,不做选择

 

3、同步收发器的结构体配置

uint16_t USART_Clock;    //时钟配置

 

uint16_t USART_CPOL;    //极性  配置串口空闲为什么电平
uint16_t USART_CPHA;    //相位  配置选择边沿

1Edge 第一边沿 ≈ 上升沿

2Edge 第二边沿 ≈ 下降沿

 uint16_t USART_LastBit;   //配置最后一位时钟,使能开关

 

4、常用函数

 

 

七、配置串口的发送与接收

  1. 配置时钟:GPIO口的时钟,串口的时钟,引脚复用的时钟 
  2. 配置GPIO口+串口结构体
  3. 串口的发送

1、串口接收字符

1、打开APB2下的GPIOA的时钟信号;因为UART1在APB2总线下

2、同时使能引脚复用时钟

3、打开UART1的时钟信号

4、【配置APB2下的GPIOA的结构体】 配置PA9串口---TX线---输出引脚

      Mode:推挽输出   

5、【配置APB2下的GPIOA的结构体】 配置PA10串口---RX线---输入引脚(接收)

     Mode:浮空输入 

记得初始化结构体       stm32f10x_gpio.h

6、【配置串口的结构体】

BaudRate=115200;

Mode=USART_Mode_Rx | USART_Mode_Tx;

记得初始化结构体 + 使能串口 USART_Cmd()      stm32f10x_uart.h

#include "stm32f10x.h"
#include "usart.h"

void usart_demo(void)
{
	GPIO_InitTypeDef  GPIOinitStruct;
	USART_InitTypeDef USARTinitStruct;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

	//PA9 
	GPIOinitStruct.GPIO_Mode=GPIO_Mode_AF_PP;
	GPIOinitStruct.GPIO_Pin=GPIO_Pin_9;
	GPIOinitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIOinitStruct);

	//PA10 
	GPIOinitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;
	GPIOinitStruct.GPIO_Pin=GPIO_Pin_10;
	GPIO_Init(GPIOA, &GPIOinitStruct);
	
	//串口配置
	USARTinitStruct.USART_BaudRate=115200;
	USARTinitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
	USARTinitStruct.USART_Mode=USART_Mode_Rx | USART_Mode_Tx;
	USARTinitStruct.USART_Parity=USART_Parity_No;
	USARTinitStruct.USART_StopBits=USART_StopBits_1;
	USARTinitStruct.USART_WordLength=USART_WordLength_8b;
	USART_Init(USART1, &USARTinitStruct);
	USART_Cmd(USART1,ENABLE);	
}

 

2、主函数

int main()
{
	USART_SendData(USART1, 'X');//发送字符函数
	while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//判断串口状态函数
	USART_SendData(USART1, 'Y');
	while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
	USART_SendData(USART1, '\n');
	while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
    delay(1000);
}

USART_FLAG_TXE  发送空标志位定义;判断当串口的状态是空的时候,即字符发送完毕的时候;执行下一个字符的发送

 

3、串口接收字符串

在接收字符的基础上,封装2个函数,实现达到字符串输出的目的

 

封装一个输出单个字符的函数

void USART_SendByte(USART_TypeDef* USARTx, uint16_t data)
{
	USART_SendData(USARTx, data);
	while(USART_GetFlagStatus(USARTx,USART_FLAG_TXE)==RESET);
}

封装一个输出字符串的函数

void USART_SendStr(USART_TypeDef* USARTx, char *str)//字符串以指针的形成存入
{
	uint16_t i=0;
	do
	{
		USART_SendByte(USARTx, *(str + i));       //利用i++逐个通过字符函数进行输出
		i++;
	}
	while(*(str + i) != '\0');                   //字符串的最后一个字符是‘\0’,以此为结束标志
	
	while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)==RESET);  //检查发送完成标志位
	
	
}

 

   在使用串口接收字符串时,字符串函数不能直接调用 库里面的输出字符函数USART_SendData ;

   否则只会发送字符串的最后一个字符;

   所以只能通过封装一个发送字符串的函数,调用USART_SendData,对字符串里面的字符一个一个的进行调用

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: LabVIEW与STM32之间可以进行串口通信串口通信是指通过串口将数据从一个设备传输到另一个设备。在LabVIEW与STM32的通信中,可以通过串口将数据从LabVIEW发送到STM32,或者从STM32发送到LabVIEW。串口通信通常使用异步通信,即发送和接收的数据是以可变的速率进行的,并且每个字符都带有起始位、数据位、校验位和停止位。 在串口通信中,LabVIEW可以作为主设备(Master)通过串口发送指令或数据到STM32,而STM32则作为从设备(Slave)接收并处理这些指令或数据。反之,STM32也可以向LabVIEW发送指令或数据,LabVIEW作为从设备进行接收与处理。 为了实现LabVIEW与STM32之间的串口通信,首先需要在STM32的代码中配置串口接口,以确定串口的参数(如波特率、数据位数、校验位等),并设置接收和发送的中断。然后,通过在LabVIEW中使用串口通信的相关模块和函数,可以与STM32进行通信,包括发送和接收数据。 总而言之,LabVIEW与STM32之间是通过串口进行通信的,通过串口通信可以实现数据的传输和交互。 ### 回答2: LabVIEW和STM32都支持串口通信,但它们实现串口通信的方式略有不同。 LabVIEW是一种基于图形化编程的开发环境,可以用于控制、测量和测试等应用。LabVIEW可以通过VISA(Virtual Instrument Software Architecture)来与外部设备进行通信,包括串口通信。在LabVIEW中,串口通信通常通过使用VISA函数库来实现。VISA提供了一组函数来控制串口的配置、发送和接收数据。 STM32是一系列由意法半导体(STMicroelectronics)推出的32位单片机,具有强大的处理能力和丰富的外设接口。STM32可以通过其内置的UART(Universal Asynchronous Receiver Transmitter)外设来实现串口通信。UART是一种异步串行通信接口,可以实现数据的传输和接收。STM32的UART外设提供了相应的寄存器和配置选项,以方便开发者进行串口通信的设置和控制。 因此,LabVIEW和STM32都可以通过串口实现通信,但它们的具体实现方式不同。LabVIEW通过VISA函数库来控制串口通信,而STM32通过内置的UART外设来实现串口通信。 ### 回答3: LabVIEW与STM32是通过串口进行通信的。 串口通信是一种通过串行方式进行数据传输的通信方式。在串口通信中,数据按照一位一位的顺序进行传输,通过一条线路同时传递数据和控制信号。串口通信相对于并行通信更经济、更简单,适用于较短距离和较低速率的通信。 LabVIEW是一种图形化编程语言和开发环境,广泛用于建立数据采集、控制、仿真和分析系统。通过串口通信,LabVIEW可以与其他设备或硬件进行数据交换,如传感器、执行器等。在串口通信中,LabVIEW可以通过串行端口读取或发送数据,实现与STM32之间的数据交互和通信。 STM32是一系列32位的ARM Cortex-M单片机,具有强大的性能和丰富的外设接口。STM32通过串口与其他设备进行通信,可以使用UART、USART等串行通信接口,通过发送和接收数据来完成与LabVIEW之间的数据交互。 因此,LabVIEW与STM32是通过串口通信进行数据传输和通信的。通过串口通信,LabVIEW可以与STM32进行双向数据传输,实现数据的读取、控制和交互,使两者能够进行有效的协作和信息交换。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值