单片机学习小组
直播中

江根磊

7年用户 1047经验值
私信 关注

求大佬分享STM32的USART串口通讯程序

求大佬分享STM32的USART串口通讯程序

回帖(1)

周志光

2022-2-18 10:16:26
一、了解串口通信及准备工作

1.串口通信简介

串行通讯是指设备之间通过少量数据信号线,地线以及控制信号线,按数据位形式一位一位地传输数据的通讯方式。
分类:
(1)单工:数据传输只支持数据在一个方向上传输。
(2)半双工:允许数据在两个方向上传输。但同一时刻只允许数据在一个方向上传输,它实际上是一种能够切换方向的单工通信,不需要独立的接收端和发送端,两者可以合并使用一个端口。
(3)全双工:允许数据同时在两个方向上传输。因此全双工通信是两个单工通信方式的结合,需要独立的接收端和发送端。
2.STM32 的 USART 简介

通用同步异步收发器是一个串行通信设备,可以灵活地与外部设备进行全双工数据交换。有别于 USART 还有一个UART,它是在 USART 基础上裁剪掉了同步通信功能,只有异步通信。简单区分同步和异步就是看通信时需不需要对外提供时钟输
出,我们平时用的串口通信基本都是 UART。
二、USART串口实验

1.实验要求

1)设置波特率为115200,1位停止位,无校验位;
2)STM32系统给上位机(win10)连续发送“hello windows!”。win10采用“串口助手”工具接收。
2.实验原理

串口接收:由于前面已经配置好了stm32的串口1中断,因此当上位机给stm32发送数据时就会触发该中断进入中断处理函数USART1_IRQHandler()接收数据并保存到接受数据缓冲区。
串口发送:当串口接收完数据并存储到接受数据缓冲区后,主程序就将该缓冲区中的数据按位放到发送数据缓冲区中并发送出去,由上位机的串口调试助手显示stm32发送出来的数据。

3.实验代码
对部分程序进行修改
修改stm32f10x_it.c文件的串口中断服务函数:


int i=0;
uint8_t ucTemp[50];
void DEBUG_USART_IRQHandler(void)
{
        if(USART_GetITStatus(DEBUG_USARTx,USART_IT_RXNE)!=RESET)
        {
                ucTemp = USART_ReceiveData(USART1);       
        }
  if(ucTemp == '!')
        {
                if(ucTemp[i-1] == '2'&&ucTemp[i-2] == '3'&&ucTemp[i-3] == 'm'&&ucTemp[i-4] == 't'&&ucTemp[i-5] == 's'&&ucTemp[i-6] == ' ')
                        if(ucTemp[i-7] == 'p'&&ucTemp[i-8] == 'o'&&ucTemp[i-9] == 't'&&ucTemp[i-10] == 's')
                        {
                                printf("收到!");
        while(1);
                        }
        }
        i++;
}


main.c修改如下:


#include "stm32f10x.h"
#include "bsp_usart.h"




void delay(uint32_t count)
{
        while(count--);
}
int main(void)
{       
  USART_Config();
  while(1)
        {       
                printf("hello Windows Cyan!n");
                delay(5000000);
        }       
}
4.程序烧录

使用keil5根据之前实验代码进行修改生成hex文件

选择端口:COM3,并按序操作
5.结果演示

举报

更多回帖

×
20
完善资料,
赚取积分