STM32F417ZG的串口5发送不正常

2019-07-21 02:10发布

我想让串口5接受一个字节,再通过串口5发送出去,但是发送总是多个00,然后我通过发送多个字节发现,最后还是多发送个字节00,不知道为什么(如主程序所示,应该发送01 02 03 buffer接收的数据 04 05,可是发送的确是01 02 03 buffer接收的数据 04 05 00)

485的程序

主函数: [mw_shl_code=c,true] [mw_shl_code=c,true]#include "sys.h" #include "delay.h" #include "UART5.h" u8 buffer,flag; void main() { Stm32_Clock_Initial(336,26,2,7); delay_initial(168); UART5_Initial(42,9600); RS485_DE=0; //RS485接收模式 RS485_RE=0; while(1) { //如果串口5接收到数据,再将此数据由串口5发送回去 if(flag) { flag=0; RS485_DE=1; //RS485发送模式 RS485_RE=1; UART5_Send_Data(0x01); RS485_DE=0; //RS485接收模式 RS485_RE=0; RS485_DE=1; //RS485发送模式 RS485_RE=1; UART5_Send_Data(0x02); RS485_DE=0; //RS485接收模式 RS485_RE=0; RS485_DE=1; //RS485发送模式 RS485_RE=1; UART5_Send_Data(0x03); RS485_DE=0; //RS485接收模式 RS485_RE=0; RS485_DE=1; //RS485发送模式 RS485_RE=1; UART5_Send_Data(buffer); RS485_DE=0; //RS485接收模式 RS485_RE=0; RS485_DE=1; //RS485发送模式 RS485_RE=1; UART5_Send_Data(0x04); RS485_DE=0; //RS485接收模式 RS485_RE=0; RS485_DE=1; //RS485发送模式 RS485_RE=1; UART5_Send_Data(0x05); RS485_DE=0; //RS485接收模式 RS485_RE=0; } } }[/mw_shl_code] [/mw_shl_code] 串口函数:
[mw_shl_code=c,true]#include "sys.h" #include "UART5.h" /*初始化串口5*/ void UART5_Initial(u32 pclk1,u32 baudrate) { float temp; u16 mantissa,fraction; temp=(float)(pclk1*1000000)/(baudrate*16); //计算USARTDIV mantissa=temp; //计算整数部分 fraction=(temp-mantissa)*16; //计算小数部分 mantissa<<=4; mantissa+=fraction; RCC->AHB1ENR|=1<<2; //端口C时钟使能 RCC->AHB1ENR|=1<<3; //端口D时钟使能 GPIO_Set(GPIOD,PIN0|PIN1,GPIO_MODE_OUT,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU); //PD0-RS485_DE,PD1-RS485_RE GPIO_Set(GPIOC,PIN12,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_50M,GPIO_PUPD_PU); //PC12-UART5_TX GPIO_AF_Set(GPIOC,12,8); GPIO_Set(GPIOD,PIN2,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_50M,GPIO_PUPD_PU); //PD2-UART5_RX GPIO_AF_Set(GPIOD,2,8); RCC->APB1ENR|=1<<20; //串口5时钟使能 RCC->APB1RSTR|=1<<20; //复位串口5 RCC->APB1RSTR&=~(1<<20); //停止复位 UART5->BRR=mantissa; //波特率设置 UART5->CR1&=~(1<<15); //16倍过采样 UART5->CR1|=1<<3; //使能发送器 #if UART5_RECEIVE //使能接收 UART5->CR1|=1<<2; //使能接收器 UART5->CR1|=1<<5; //使能接收中断 MY_NVIC_Initial(3,3,UART5_IRQn,2);//组2,最低优先级 #endif UART5->CR1|=1<<13; //使能UART5 } /*串口5发送单字节数据*/ void UART5_Send_Data(u8 c) { UART5->CR1&=~(1<<5); //禁止接收中断 UART5->DR=c; while(!(UART5->SR&(1<<6))); //等待发送结束 #if UART5_RECEIVE //使能接收 UART5->CR1|=1<<5; //使能接收中断 #endif } #if UART5_RECEIVE //使能接收 /*串口5中断响应函数,接收单字节数据*/ void UART5_IRQHandler() { if(UART5->SR&(1<<5)) //已准备好读取接收到的数据 { buffer=UART5->DR; //将接收的数据存入缓冲数组 flag=1; } } #endif [/mw_shl_code] 串口函数头文件:
[mw_shl_code=c,true]#ifndef __UART5_H #define __UART5_H #include "sys.h" /*串口5相关引脚定义*/ #define RS485_DE PDout(0) //0-接收,1-发送 #define RS485_RE PDout(1) //0-接收,1-发送 /*串口5相关函数声明*/ void UART5_Initial(u32 pclk1,u32 baudrate); void UART5_Send_Data(u8 c); /*串口5中断接收控制*/ #define UART5_RECEIVE 1 //0-禁止,1-使能 /*串口5相关全局变量声明*/ extern u8 buffer,flag; #endif [/mw_shl_code]

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。