烦请大神帮我看下代码哪里有问题,关于串口不使用中断的代码如下:

2019-07-20 06:47发布

本帖最后由 走投无路的卡卡 于 2018-8-9 09:34 编辑

#include "sys.h"
#include "delay.h"

#define LEIGHT 200

u8  USART_RX_BUF[LEIGHT];
u16 USART_RX_STA=0;                 
UART_HandleTypeDef UART1_Handler;
u8 aRxBuffer[1];

void usart1_init(u32 bound)
{
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_USART1_CLK_ENABLE();
   
   
    UART1_Handler.Instance=USART1;
    UART1_Handler.Init.BaudRate=bound;
    UART1_Handler.Init.Mode=UART_MODE_TX_RX;
    UART1_Handler.Init.WordLength=8;
    UART1_Handler.Init.StopBits=1;
    UART1_Handler.Init.Parity=UART_PARITY_NONE;
    UART1_Handler.Init.HwFlowCtl=UART_HWCONTROL_NONE;
    HAL_UART_Init(&UART1_Handler);
   
    GPIO_InitTypeDef GPIO_Init;
   
    GPIO_Init.Pin=GPIO_PIN_9|GPIO_PIN_10;
    GPIO_Init.Mode=GPIO_MODE_AF_PP;
    GPIO_Init.Pull=GPIO_PULLUP;
    GPIO_Init.Speed=GPIO_SPEED_FAST;
    GPIO_Init.Alternate=GPIO_AF7_USART1;
    HAL_GPIO_Init(GPIOA,&GPIO_Init);
}



int main(void)
{
    HAL_Init();                     
    Stm32_Clock_Init(360,25,2,8);  
    usart1_init(115200);
    delay_init(180);
        
        
        while(1)
        {
            if((USART_RX_STA&0x8000)==0)
            {
                if(USART_RX_STA&0x4000)
                {
                    if(aRxBuffer[0]!=0x0a)
                        USART_RX_STA=0;
                    else

                        USART_RX_STA|=0x8000;   
                        USART_RX_STA=0;
                        printf("输出: ");
                        HAL_UART_Transmit(&UART1_Handler,USART_RX_BUF,USART_RX_STA&0X3FFF,1000);
                        delay_ms(1000);
                }
                else
                {   
                    if(aRxBuffer[0]==0x0d)USART_RX_STA|=0x4000;
                    else
                    {
                        HAL_UART_Receive(&UART1_Handler,aRxBuffer,1,1000);
                        USART_RX_BUF[USART_RX_STA&0X3FFF]=aRxBuffer[0] ;
                        USART_RX_STA++;
                        if(USART_RX_STA>(LEIGHT-1))USART_RX_STA=0;     
                    }         
                }
            }
               
        }


   
  }  
        
   



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
10条回答
DreamWaterPro
2019-07-20 19:06
不用中断的方式可以使用串口收发,判断接收/发送完成标志位就可以了。

楼主的问题是直接将例程中,串口接收中断的内容直接复制到了主循环中,当然是不可能正常工作的。楼主需要进行的修改是,查看STM32F4系列的参考手册,找到串口1接收完成标志位所在的寄存器,然后在主循环中不断地检测这个位是否被置位,如果被置位则说明串口1收到了一个字节数据,此时再进行例程中串口接收中断的操作,完成后把该标志清空即可。

一周热门 更多>