我想让串口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]
---------------------------------
这个可能存在这个问题。
建议参考我们战舰V3的RS485电路。
---------------------------------
是多出来的无用数据吧。
---------------------------------
原子老师,确实是最后多出来一个的无用数据00,怎么才能避免呢?(上述程序略有改动)
---------------------------------
485切换模式的时候出来的,你的485电路是什么样的?
一周热门 更多>