串口通信调试
main.c
#include "main.h"
char data[100] ;
//数据缓冲流,用来存储数据
int main()
{
System_Init();
//系统初始化
SysTick_Init(NULL);
//必须有否则会出问题
LED_Init();
//LED灯初始化,用来观察实验现象
USART1_Init();
//串口1初始化
while(1)
{
scanf("%s",data);
//输入函数,可以输入数据到data数组中
//这里的本质是计算机向32发送数据
printf("输入的结果:%s",data);
//输出函数,将数据打印出来
//这里的本质是32向计算机发送数据
USART1_receive();
//串口1接收函数
//本质是通过串口1 使32接收数据(这个函数使用有一些问题后面会提到)
}
}
main.h
这里是各种头文件不再解释
#ifndef __MAIN_H_
#define __MAIN_H_
#include "stm32f1xx.h"
#include "stm32_types.h"
#include "stm32_system.h"
#include "delay.h"
//驱动头文件
#include "Systick.h"
#include "led.h"
#include "usart.h"
#endif
usart.h
#ifndef __USART_H_
#define __USART_H_
#include "stm32f1xx.h"
#include "stm32_types.h"
#include "stm32f1xx_hal.h"
#include "delay.h"
#include "stdio.h"
#include "stdlib.h"
#include <cstring>
//这三个头文件是为了使用printf scanf 重定义和strlen函数
#define UART_LSR_RDR (1<<5) //接收完成标志
#define UART_LSR_THRE (1<<6) //发送完成标志
#define SEND_BUF1 (USART1->DR) //串口1发送缓冲区
#define RECV_BUF1 (USART1->DR) //串口1接收缓冲区
#define USART1_SR (USART1->SR) //串口1状态
#define SEND_BUF2 (USART2->DR)
#define RECV_BUF2 (USART2->DR)
#define USART2_SR (USART2->SR) //和一同理
void USART1_Init(void);
//串口1初始化
void USART1_receive(void);
//串口1接收数据 本质32接收计算机的信息
void USART1_send(char *data);
//串口1发送数据 本质32向计算机发送信息
#endif
usart.c
#include "usart.h"
UART_HandleTypeDef usart1;
//串口结构体句柄语句
u8 test_rxbuf1[200];
//接收缓冲流数组
u8 rx_index1;
//接收长度
void USART1_Init(void)//串口初始化
{
GPIO_InitTypeDef GPIO_InitStruct;
__GPIOA_CLK_ENABLE(); //使能GPIOA时钟
__USART1_CLK_ENABLE(); //使能USART1时钟
GPIO_InitStruct.Pin = GPIO_PIN_9; //UASRT1对应IO口PA9 TX
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; //复用开漏输出模式
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; //高速
GPIO_InitStruct.Pull = GPIO_PULLUP; //上拉
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); //初始化PA9,PA10
GPIO_InitStruct.Pin = GPIO_PIN_10; //UASRT1对应IO口PA10 RX
GPIO_InitStruct.Mode = GPIO_MODE_AF_INPUT; //配置为输入
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); //初始化PA10 RX
usart1.Instance = USART1; //串口1
usart1.Init.BaudRate = 115200; //波特率设置
usart1.Init.WordLength = UART_WORDLENGTH_8B; //8位
usart1.Init.StopBits = UART_STOPBITS_1; //1个停止位
usart1.Init.Parity = UART_PARITY_NONE; //无校验
usart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; //无硬件流
usart1.Init.Mode = UART_MODE_TX_RX; //串口发送,接收使能
usart1.Init.OverSampling = UART_OVERSAMPLING_16; //16倍过采样
HAL_UART_Init(&usart1); //初始化串口
//__HAL_UART_ENABLE_IT(&usart1, UART_IT_RXNE); //使能接收中断
//HAL_NVIC_SetPriority(USART1_IRQn, 0, 1);
//HAL_NVIC_EnableIRQ(USART1_IRQn);
//后面这三个语句重点说一下,当我们使用scanf重定义的时候这三个需要注释才能使用scanf语句,但是void USART1_IRQHandle(void)因为中断函数被注释所以不能使用。
//但当我们把注释取消的时候,scanf函数将出现问题。
}
void USART1_IRQHandler(void)
{
unsigned long temp;
temp = USART1_SR;
if(temp&UART_LSR_RDR)
{
test_rxbuf1[rx_index1++] = RECV_BUF1;
}
HAL_UART_IRQHandler(&usart1);
}
void USART1_send(char *data)
{
uint16_t i,j;
i = strlen(data);
for(j=0; j<i; j++)
{
while((USART1_SR&UART_LSR_THRE)==0);
SEND_BUF1 = data[j];
}
}
void USART1_receive(void)
{
while(rx_index1)
{
uint8_t i;
printf("usart1串口接收到: ");
for(i=0;i<rx_index1;i++)
{
printf("%c",test_rxbuf1[i]);
}
printf("\r\n");
rx_index1 = 0;
}
}
//printf函数重定义
int fputc(int ch, FILE *f)
{
while((USART1_SR&UART_LSR_THRE)==0); //当串口1发送完成且状态为1
SEND_BUF1 = (u8) ch; //发送数据
return ch;
}
//scanf函数重定义
int fgetc(FILE* f)
{
while(!(USART1_SR&UART_LSR_RDR));//当不接受且状态为1的时候
return RECV_BUF1;//返回数据
}