完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
stm32串口通信实验实验器材:F103开发板 在F103环境下进行UART通信实验和RS232通信实验 UART通信实验(通用异步收发器) UART串口通信原理: 什么是串行通信?什么是异步通信?什么是全双工?什么是异步通信? 同步通信相比较与异步通信多了时钟总线,时钟总线的作用就是保证收发双方的时间同步,什么是全双工通信? 单工通信:数据只能发送,不能接受 半双工:数据可以发送,可以接受,但是发送和接受不能同时进行(一般只有一条线数据传输) 全双工:数据可以发送,可以接收,并且可以同时进行(一般是有两条线来传输,TX,RX) UART的通信过程 如图:起始位: 先发出一个逻辑”0”的信号,表示传输字符的开始。 数据位: 数据位在起始位之后,它的个数可以是5-8位(先发低位后发高位)如:10101010,构成一个字符。通常采用ASCII码。从最低位开始传送,靠时钟定位。 奇偶校验位: 数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验数据传送的正确性(可有可无,只能校验,不能纠错) 停止位: 它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。 由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。 空闲位: 处于逻辑“1”状态,表示当前线路上没有数据传输。 波特率: 是衡量资料传送速率的指标。表示每秒钟传送的符号数(symbol)。一个符号代表的信息量(比特数)与符号的阶数有关。例如传输使用256阶符号,每8bit代表一个符号,资料传送速率为120字符/秒,则波特率就是120baud,比特率是120*8=960bit/s。这两者的概念很容易搞错。 实验功能: 如图所示:当我们连接好硬件后,打开串口通信软件设置好波特率等等,复位开发板 串口打印出请输入您的指令:……………… 当我们输入0的时候开发板上的LED右移,LCD显示为LED右移颜色高亮,并且串口返回数据LED右移已打开……………… 其他功能: 使用中断按键key1,key2,key3,key4操作LCD,并且如串口指令执行功能 key1,key3 菜单下滑 key2,key4菜单上滑 软件设计: 原理图: uart.c文件 void USART2_Init(unsigned long ulBaud) { GPIO_InitTypeDef GPIO_InitStruct;//定义结构体(GPIO,USART,NVIC) USART_InitTypeDef USART_InitStruct; NVIC_InitTypeDef NVIC_InitStruct; // 允许GPIOA和USART2时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); // PA2-TX2复用推挽输出(端口配置) GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_InitStruct); /* PA3-TX2浮空输入(复位状态,可以省略) GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStruct); */ // 初始化USART2(波特率ulBaud,允许Rx和Tx,默认8个数据位,1个停止位,无校验) USART_InitStruct.USART_BaudRate = ulBaud;//波特率 USART_InitStruct.USART_WordLength = USART_WordLength_8b;//数据位 USART_InitStruct.USART_StopBits = USART_StopBits_1;//停止位 USART_InitStruct.USART_Parity = USART_Parity_No;//(校验位:无) USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//设置收发模式 USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//硬件流控制:无 USART_Init(USART2, &USART_InitStruct);//串口2初始化 USART_Cmd(USART2, ENABLE);//使能USART2 USART_ClearFlag(USART2,USART_FLAG_TC);//清除发送完成标志 USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);//开启USART2接受中断 NVIC_InitStruct.NVIC_IRQChannel = USART2_IRQn; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;//主优先级 NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;//子优先级 NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;//中断使能 NVIC_Init(&NVIC_InitStruct);//中断初始化 } // 发送字符 unsigned char USART_SendChar(USART_TypeDef* USARTx, unsigned char ucChar) { while(!USART_GetFlagStatus(USARTx, USART_FLAG_TXE)); USART_SendData(USARTx, ucChar); return ucChar; } // 发送字符串 void USART_SendString(USART_TypeDef* USARTx, unsigned char* pucStr) { while(*pucStr != ' |