一、关于串口通信
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.实验要求
- 设置波特率为115200,1位停止位,无校验位。
- STM32系统给上位机(win10)连续发送“hello windows!”。
- 当上位机给stm32发送“stop,stm32”后,stm32停止发送。
3.实验器材
- stm32核心板
- 面包板
- USB转TTL转接线
- 野火串口调试程序
- 普通的程序烧录软件
- 杜邦线若干
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
for(j=0;j<0x800;j++);
}
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)!='