串口通信 |
您所在的位置:网站首页 › rs232发送和接收代码 › 串口通信 |
串口通信———串口发送和接受
串口通讯协议物理层——三个常用标准软件层串口数据包组成
STM32串口功能框图引脚数据寄存器控制器波特率
代码编写(串口发送和接受数据)初始化串口需要用到的GPIO初始化串口中段配置(接受中断,中断优先级)使能串口编写发送和接受函数编写中断服务函数
最终代码
串口通讯协议
物理层:规定通讯系统中具有机械,电子功能部分的特性,确保原始数据在物理媒体的传输,其实就是硬件部分。 协议层:协议层主要规定通讯协议,统一收发双方的数据打包,解包标准。其实就是软件部分。 物理层——三个常用标准RS232标准 USB转串口(TTL) 原生的串口到串口(TTL-TTL) 软件层 串口数据包组成有起始位,数据,校验位,停止位 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 |