STM32
直播中

kasdlak

8年用户 1140经验值
擅长:光电显示
私信 关注
[问答]

STM8L051F3串口发送接收数据丢失怎么解决?


牛人请指点下
串口初始化
void Uart1_Init(void)
{
SYSCFG_REMAPPinConfig(REMAP_Pin_USART1TxRxPortA, ENABLE);
          CLK_PeripheralClockConfig(CLK_Peripheral_USART1, ENABLE);
        GPIO_Init(GPIOC, GPIO_Pin_2, GPIO_Mode_Out_PP_High_Fast);//TXD
          GPIO_Init(GPIOC, GPIO_Pin_3, GPIO_Mode_In_PU_No_IT);//RXD
           GPIO_ExternalPullUpConfig(GPIOC, GPIO_Pin_2, ENABLE);
                  GPIO_ExternalPullUpConfig(GPIOC, GPIO_Pin_3, ENABLE);
                 
  //        USART_DeInit(USART1);                //复位UART1
        /*
         * 将UART1配置为:
         * 波特率 = 38400
         * 数据位 = 8
         * 1位停止位
         * 无校验位
         * 使能接收和发送
         */
         
        USART_Init(USART1, (u32)38400, USART_WordLength_8b, USART_StopBits_1,
                                USART_Parity_No, USART_Mode_Tx|USART_Mode_Rx);

}

数据发送
void UART1_SendByte(u8 data)
{
          USART_SendData8(USART1, data);
        /* 等待传输结束 */
        while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
}


main()
{
        u8 UART1_RX_BUF;
                CLK_SYSCLKSourceConfig(CLK_SYSCLKSource_HSI);        
                  CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_8);
                while(CLK_GetFlagStatus(CLK_FLAG_HSIRDY) == RESET);    //2MHZ内部晶振

             Uart1_Init();   //串口1初始化
            while(1)
            {        
        /* 等待接收完成 */
        if(USART_GetFlagStatus(USART1, USART_FLAG_RXNE))
           {
                  UART1_RX_BUF = USART_ReceiveData8(USART1);

                    UART1_SendByte(UART1_RX_BUF );
            }
}
以上就是所有程序,
目前问题是:
1.在用电脑串口助手发送数据时,如果一次只发送一个字节,则UART1_RX_BUF = USART_ReceiveData8(USART1)接收的是错误的数据,
2.只有在一次发送数据在两个字节以上时UART1_RX_BUF = USART_ReceiveData8(USART1)接收的数据从第二个字节开始才是准确的,
3.  UART1_SendByte(UART1_RX_BUF )在发送第一个字节时会出现数据丢失;

回帖(2)

赖文文

2024-5-8 16:37:01
在初始化命令
Uart1_Init();   //串口1初始化  

后面加一句:
USART_GetITStatus(USART1, USART_FLAG_TC); 
举报

张华仁

2024-5-8 16:37:10
在while(1)循环中,在 UART1_RX_BUF = USART_ReceiveData8(USART1);之后再加一句判断是否接收完,接收完才进入发送,没有接收完则继续等待接收完为止才执行下一步
举报

更多回帖

发帖
×
20
完善资料,
赚取积分