HYP 发表于 2016-12-5 18:13:48

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 )在发送第一个字节时会出现数据丢失;

peter001 发表于 2016-12-5 21:47:00

帮顶,跟踪一下,是不是覆盖了

ts2000 发表于 2016-12-19 08:19:04

      /* 等待接收完成 */
      if(USART_GetFlagStatus(USART1, USART_FLAG_RXNE))
         {
                  UART1_RX_BUF = USART_ReceiveData8(USART1);

                  UART1_SendByte(UART1_RX_BUF );
            }

这里有问题吧?没接收完成就开始发送了?

andrewz 发表于 2016-12-19 08:48:11

试试Tx也拉高.或者,在TC置位之后再写buf?

cldym 发表于 2016-12-19 09:22:56

帮顶,跟踪一下,

党国特派员 发表于 2016-12-19 10:22:26

RX,TX应该都设置为复用推挽+上拉。

斜阳__ 发表于 2016-12-19 11:17:14

帮顶               

无薪税绵 发表于 2016-12-19 13:06:52

在初始化命令
Uart1_Init();   //串口1初始化  

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

johnson_gong 发表于 2016-12-19 14:04:49

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

any012 发表于 2016-12-19 16:17:57

没用过stm8,不过我想,接收改成中断模式更好吧?
页: [1] 2
查看完整版本: STM8L051F3串口发送接收数据丢失