原子例程485实验 通讯?

2019-10-15 17:39发布

例程是用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);
        }

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
2条回答
寂青山
2019-10-15 21:56
给你一段直接操作寄存器的代码,中断接收,发送使用查询发送,只是用来实验串口操作:

#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 ;
}

一周热门 更多>