完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
一、关于串口通信 1.串口通信 串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式,因为它简单便捷,因此大部分电子设备都支持该通讯方式,电子工程师在调试设备时也经常使用该通讯方式输出调试信息。 串行接口是一种可以将接收来自CPU的并行数据字符转换为连续的串行数据流发送出去,同时可将接收的串行数据流转换为并行的数据字符供给CPU的器件。 2.USART 通用同步异步收发器(Universal Synchronous Asynchronous Receiver and Transmitter)是一个串行通信设备,可以灵活地与外部设备进行全双工数据交换。有别于 USART 还有一个UART(Universal Asynchronous Receiver and Transmitter),它是在 USART 基础上裁剪掉了同步通信功能,只有异步通信。简单区分同步和异步就是看通信时需不需要对外提供时钟输出,我们平时用的串口通信基本都是 UART。 二、USART串口通信程序 1.准备工作 在进行实验前,我们需要一个USB转串口的驱动。 将stm32核心板和USB串口转接线在面包板上进行连接,其中连接线的RXD连接到A9引脚,TXD连接到A10引脚,GND和3V3于核心板上的引脚对应连接。 连接好以后将USB插入电脑,就可以在电脑的设备管理器中查看对应驱动了 如果没有就需要在网上去下载一个驱动进行安装 2.实验要求
4.实验过程 本次实验所使用的代码是基于STM32串口通信USART学习笔记来实现的 为满足本次实验的要求,需要在源代码的基础上进行修改。 首先,为了使stm32系统给上位机连续发送“hello windows”,我在主函数中设置了一个while循环用来实现此功能,同时设置了一个延迟函数来控制发送的速率(如果不设置,串口调试程序可能在打开串口后卡死)。 #include "NVIC.h" #include "User_USART.h" #include "stm32f10x.h" void delay(u16 num) { u16 i,j; for(i=0;i } int main(void) { User_USART_GPIO_Config(); User_NVIC_Config(); User_USART_Config(); User_UART_Send_String(USART1, "test!n"); while(1) { User_UART_Send_String(USART1, "hello windows!n"); delay(500); } } 为了使上位机给stm32发送“stop,stm32”后,stm32停止发送,需要将中断函数进行修改。 原始代码中,他定义了一个8bit变量temp,然后通过 if语句和USART_GetFlagStatus来检查数据是否发送完成。如果为真,则将接收的数据存入temp中,然后又将其发送出去。 为了使stm32能接收到指定内容后中断,我这里通过设置一个数组来判断发送的数据,修改后的代码如下 int i=0; void USART1_IRQHandler(void) { uint8_t a[50]; if(USART_GetFlagStatus(USART1, USART_IT_RXNE) != RESET) { a[i++]=USART_ReceiveData(USART1); } if(a[0]=='s'&&a[1]=='t'&&a[2]=='o'&&a[3]=='p'&&a[4]==','&&a[5]=='s'&&a[6]=='t'&&a[7]=='m'&&a[8]=='3'&&a[9]=='2') while(1); } 在完成上面两步后,我尝试将代码烧录进stm32芯片,看能否运行。通过串口调试程序发现,接收到的数据出现问题,但与此同时同时中断可以实现。因此我判断,问题应该是出在发送上面。 在浏览野火的《零死角玩转STM32F103—指南者》后,用书中193页中提到的以下代码替换了原始代码中有关发送字符串的代码。 //向串口发送一个字符串数据,即可以发送包含多个字节的数据,char类型为8bit,其字符串中的每个字符都可用一个int数表示,即ASCII标准 void User_UART_Send_String( USART_TypeDef * pUSARTx, char *str) { unsigned int k=0; do { User_USART_Send_Byte( pUSARTx, *(str + k) ); k++; } while (*(str + k)!=' |