串口通信

您所在的位置:网站首页 rs232发送和接收代码 串口通信

串口通信

2024-07-17 16:37| 来源: 网络整理| 查看: 265

串口通信———串口发送和接受 串口通讯协议物理层——三个常用标准软件层串口数据包组成 STM32串口功能框图引脚数据寄存器控制器波特率 代码编写(串口发送和接受数据)初始化串口需要用到的GPIO初始化串口中段配置(接受中断,中断优先级)使能串口编写发送和接受函数编写中断服务函数 最终代码

串口通讯协议

物理层:规定通讯系统中具有机械,电子功能部分的特性,确保原始数据在物理媒体的传输,其实就是硬件部分。 协议层:协议层主要规定通讯协议,统一收发双方的数据打包,解包标准。其实就是软件部分。

物理层——三个常用标准

RS232标准 USB转串口(TTL) 原生的串口到串口(TTL-TTL)

软件层 串口数据包组成

有起始位,数据,校验位,停止位 在这里插入图片描述 起始位:由一个逻辑0的数据位表示 结束位:由0.5,1,1.5,或2个逻辑1的数据位表示 有效数据:在起始位后紧接的就是有效数据,有效数据的长度常被约定为5,6,7,或8位长 校验位:为的是数据的抗干扰性,校验方法分为奇校验,偶检验,0校验,1校验,无校验

STM32串口功能框图

在这里插入图片描述

引脚

TX:数据发送 RX:数据接收 SCLK:时钟,仅同步通信时使用 nRTS:数据发送 nCTS:允许发送 在这里插入图片描述

数据寄存器

USART_DR:9位有效,包含一个发送数据寄存器TDR和一个接受数据寄存器RDR。一个地址对应两个物理内存

有关寄存器:

USART_CR1:M 0:8bit 1:9bit USART_CR2:STOP

USART_CR1:PCE,RS,PEIE USART_SR:PE

控制器

有关寄存器:

USART_CR1,CR2,CR3

波特率

有关寄存器:

每秒钟要发送多少数据 USART_BRR:波特率寄存器

代码编写(串口发送和接受数据) 初始化串口需要用到的GPIO

由引脚部分可知串口一所用到的所有引脚 所有宏定义如下,它可以帮我们移植程序,更快的实现其他串口

#define DEBUG_USARTx USART1 #define DEBUG_USART_CLK RCC_APB2Periph_USART1 #define DEBUG_USART_APBxClkCmd RCC_APB2PeriphClockCmd #define DEBUG_USART_BAUDRATE 115200 // USART GPIO 引脚宏定义 #define DEBUG_USART_GPIO_CLK (RCC_APB2Periph_GPIOA) #define DEBUG_USART_GPIO_APBxClkCmd RCC_APB2PeriphClockCmd #define DEBUG_USART_TX_GPIO_PORT GPIOA #define DEBUG_USART_TX_GPIO_PIN GPIO_Pin_9 #define DEBUG_USART_RX_GPIO_PORT GPIOA #define DEBUG_USART_RX_GPIO_PIN GPIO_Pin_10 #define DEBUG_USART_IRQ USART1_IRQn #define DEBUG_USART_IRQHandler USART1_IRQHandler

初始化GPIO代码如下 注意将 将USART Tx的GPIO配置为推挽复用模式 将USART Rx的GPIO配置为浮空输入模式

GPIO_InitTypeDef GPIO_InitStructure; // 打开串口GPIO的时钟 DEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK, ENABLE); // 打开串口外设的时钟 DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK, ENABLE); // 将USART Tx的GPIO配置为推挽复用模式 GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure); // 将USART Rx的GPIO配置为浮空输入模式 GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure); 初始化串口

可用USART_InitTypeDef 结构体实现 依次配置结构体各个成员即可

// 配置串口的工作参数 // 配置波特率 USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE; // 配置 针数据字长 USART_InitStructure.USART_WordLength = USART_WordLength_8b; // 配置停止位 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(DEBUG_USARTx, &USART_InitStructure); 中段配置(接受中断,中断优先级)

同外部中断一样,需要配置中断优先级,方法也相同

优先级配置 因只开启一个串口,中断优先级可随意配置 static void NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; /* 嵌套向量中断控制器组选择 */ /* 提示 NVIC_PriorityGroupConfig() 在整个工程只需要调用一次来配置优先级分组*/ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); /* 配置USART为中断源 */ NVIC_InitStructure.NVIC_IRQChannel = DEBUG_USART_IRQ; /* 抢断优先级*/ NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; /* 子优先级 */ NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; /* 使能中断 */ NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; /* 初始化配置NVIC */ NVIC_Init(&NVIC_InitStructure); }

使能串口接收中断

// 使能串口接收中断 USART_ITConfig(DEBUG_USARTx, USART_IT_RXNE, ENABLE); 使能串口 // 使能串口 USART_Cmd(DEBUG_USARTx, ENABLE); 编写发送和接受函数

运用固件库函数,并检测发送数据位为空

//发送一个字节 void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t date) { USART_SendData(pUSARTx,date); while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET); }

发送两个字节也是同理 分两次发送即可

//发送两个字节的数据 void Usart_SendHalfWord(USART_TypeDef * pUSARTx, uint16_t date) { uint8_t temp_h,temp_l; temp_h=(date&0xFF00)>>8; temp_l=(date&0xFF); USART_SendData(pUSARTx,temp_h); while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET); USART_SendData(pUSARTx,temp_l); while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET); }

发送数组时 每发送一个字节,i加一,发送下一个字节 注意检测标志位不同,发送一个字节与一串数据用到的数据位不同

//发送8位数据的数组 void Usart_SendArray( USART_TypeDef * pUSARTx, uint8_t *array,uint8_t num) { uint8_t i; for(i=0;i>8; temp_l=(date&0xFF); USART_SendData(pUSARTx,temp_h); while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET); USART_SendData(pUSARTx,temp_l); while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET); } //发送8位数据的数组 void Usart_SendArray( USART_TypeDef * pUSARTx, uint8_t *array,uint8_t num) { uint8_t i; for(i=0;i


【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3