例程是用LCD来实现的,现在我将LCD部分注释掉,然后是直接用串口助手给485发信息,然后让485又返回到串口助手显示,但是不行?
#include "usart1.h"
#include <stdarg.h>
#include "delay.h"
#include "timer.h"
//接收缓存区
u8 RS485_RX_BUF[64]; //接收缓冲
u8 buf_rx[64]; //接收缓冲
//接收到的数据长度
u8 RS485_RX_CNT=0;
u8 rx_len=0;
/// 配置USART1接收中断
static void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
/* Configure the NVIC Preemption Priority Bits */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
/* Enable the USARTy Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/*
* 函数名:USART1_Config
* 描述 :USART1 GPIO 配置,工作模式配置
* 输入 :无
* 输出 : 无
* 调用 :外部调用
*/
void USART1_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
/* config USART1 clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
RCC_APB2PeriphClockCmd((RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO), ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
/* Configure USART1 Tx (PA.9) as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* Configure USART1 Rx (PA.10) as input floating */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 485 接收发送使能 GPIO
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);
/* USART1 mode config */
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No ;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);
/* 配置中断优先级 */
NVIC_Configuration();
/* 使能串口1接收中断 */
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
USART_Cmd(USART1, ENABLE);
USART_ClearFlag(USART1, USART_FLAG_TC);
}
void USART1_IRQHandler(void)
{
u8 res;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
res =USART_ReceiveData(USART1); //读取接收到的数据
// TIM_SetCounter(TIM3,0);
// if(RS485_RX_CNT<64)
// {
// RS485_RX_BUF[RS485_RX_CNT]=res; //记录接收到的值
// USART1_RX(buf_rx, rx_len);
// RS485_RX_CNT++; //接收数据增加1
// }
if(RS485_RX_CNT<64)
{
RS485_RX_BUF[RS485_RX_CNT]=res; //记录接收到的值
// USART1_RX(buf_rx, rx_len);
RS485_RX_CNT++;
}
}
}
void USART1_RX(u8 *buf,u8 len)
{
buf[len]=RS485_RX_BUF[RS485_RX_CNT];
}
//RS485发送len个字节.
//buf:发送区首地址
//len:发送的字节数(为了和本代码的接收匹配,这里建议不要超过256个字节)
void RS485_Send_Data(u8 *buf,u8 len)
{
u8 t;
RS485_TX_EN=1; //设置为发送模式
delay_us(10);
for(t=0;t<len;t++) //循环发送数据
{
delay_us(10);
// while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
USART_SendData(USART1,buf[t]);
while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
}
// while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
RS485_RX_CNT=0;
RS485_TX_EN=0; //设置为接收模式
delay_us(100);
}
//RS485查询接收到的数据
//buf:接收缓存首地址
//len:读到的数据长度
void RS485_Receive_Data(u8 *buf,u8 *len)
{
u8 rxlen=RS485_RX_CNT;
u8 i=0;
*len=0;
delay_ms(10); //等待10ms,连续超过10ms没有接收到一个数据,则认为接收结束
if(rxlen==RS485_RX_CNT&&rxlen)
for(i=0;i<rxlen;i++)
{
buf[i]=RS485_RX_BUF[i];
}
*len=RS485_RX_BUF[i];
RS485_RX_CNT=0; //清零
}
主函数里面
while(1)
{
RS485_Receive_Data(RecvCom1,&rx);
delay_ms(3);
RS485_Send_Data(RecvCom1,rx);
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
#include <USART.H>
un8 SBUFF[20]={0} , i=0 , j=0 , l=0 ;
void USART1_Config( void )
{
RCC -> RCC_APB2ENR |= 0x4004 ;
GPIOA -> GPIO_CRH &= 0xFFFFF00F ;
GPIOA -> GPIO_CRH |= 0x000008B0 ;
GPIOA -> GPIO_ODR = 0x0400 ;
RCC -> RCC_APB2RSTR |= 0x4000 ;
RCC -> RCC_APB2RSTR &= 0xBFFF ;
USART1 -> USART_BRR &= 0xFFFF0000 ;
USART1 -> USART_BRR |= 0x00001D4C ;
USART1 -> USART_CR[0] |= 0x202C ;
SCB -> AIRCR &= AIRCR_KEY | 0x0000F8FF ;
SCB -> AIRCR |= AIRCR_KEY | 0x00000500 ;
NVIC -> ISER[1] |= 0x00000020 ;
while( 1 )
{
while( l )
{
if( USART1 -> USART_SR & 0x0080 )
{
USART1 -> USART_DR = SBUFF[j] ;
l-- ;
j = ( j<20 && l>0 )? j++ : 0 ;
}
}
}
}
void USART1_IRQHandler( void )
{
SBUFF[i] = USART1 -> USART_DR ;
l++ ;
i = ( i<20 )? i++ : 0 ;
}
一周热门 更多>