发新帖我要提问
12
返回列表
打印

STM32串口通信只能接受第一个字节的数

[复制链接]
楼主: gooout
手机看帖
扫描二维码
随时随地手机跟帖
21
gooout|  楼主 | 2010-10-14 12:04 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
发bc,收到b
代码
    if (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) != RESET)
     {
           static int k = 0;
           RxBuf1[k] = USART_ReceiveData(USART1);   
           USART_ClearFlag(USART1, USART_FLAG_RXNE);
           if (USART_GetFlagStatus(USART1, USART_FLAG_TXE) != RESET)
                USART_SendData(USART1, RxBuf1[k]);
            k++;
            k = k%8;
     }

123.JPG (45.31 KB )

123.JPG

使用特权

评论回复
22
gooout|  楼主 | 2010-10-14 13:05 | 只看该作者
继续等

使用特权

评论回复
23
gooout|  楼主 | 2010-10-14 13:06 | 只看该作者
wait

使用特权

评论回复
24
ST_ARM| | 2010-10-14 14:04 | 只看该作者
你设置的是:USART_StopBits_1
但是你的PC端设置的是2个停止位

使用特权

评论回复
25
gooout|  楼主 | 2010-10-14 14:19 | 只看该作者
本帖最后由 gooout 于 2010-10-14 14:21 编辑

哦,是瞎式的时候改了,没有改回来,与这个也没有关系

22222.JPG (45.45 KB )

22222.JPG

使用特权

评论回复
26
vigia| | 2010-10-14 15:01 | 只看该作者
我用的串口助手,数据位8
gooout 发表于 2010-10-14 11:58



8位数据,1位停止位,应该是USART_WordLength_9b吧。。。。

使用特权

评论回复
27
gooout|  楼主 | 2010-10-14 15:28 | 只看该作者
8位数据,1位停止位,应该是USART_WordLength_9b吧。。。。
vigia 发表于 2010-10-14 15:01


USART_WordLength_9b也不行

使用特权

评论回复
28
gooout|  楼主 | 2010-10-14 16:05 | 只看该作者
终于解决了,是主循环里面有其他的程序导致了接受第二个字节时已经有一个较长的延时,串口溢出了,很菜的问题,耽误大家时间了,谢谢大家

使用特权

评论回复
29
king_sunshine| | 2011-5-4 17:31 | 只看该作者
我也遇到同样问题,可是现在还没调试过来,希望楼主指点迷津,谢谢 28# gooout

使用特权

评论回复
30
king_sunshine| | 2011-5-4 17:34 | 只看该作者
我的程序进入中断服务程序不成功,我把程序放到main函数中调试的,况且老是进入HardFault_Handler()中断

使用特权

评论回复
31
king_sunshine| | 2011-5-4 17:35 | 只看该作者
中断程序如下:

void USART1_IRQHandler(void)
{
  //接受数据
  if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
  {
    USART_ClearITPendingBit(USART1,USART_IT_RXNE);                              //清楚标记位
    //Read one byte from the receive data register
    RxBuffer[RxCounter++] = USART_ReceiveData(USART1);
    RxCounter = RxCounter % 8;
    while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET)
    {
      ;
    }   
   
  //溢出-如果发生溢出需要先读SR,再读DR寄存器则可清除不断入中断的问题
    if(USART_GetFlagStatus(USART1,USART_FLAG_ORE)==SET)
    {
      USART_ClearFlag(USART1,USART_FLAG_ORE);                                   //读SR其实就是清除标志
      USART_ReceiveData(USART1);                                                //读DR
    }

    if(USART_ReceiveData(USART1) == '\0')                                       //判断是否接受完成
    {
      RxBuffer[RxCounter] = '\0';
      // Disable the USART1 Receive interrupt
      USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);
      USART_ITConfig(USART1, USART_IT_TXE, ENABLE);
      GPIO_SetBits(GPIOA,GPIO_Pin_11);                                          //切换到发送模式
      RxCounter = 0;
    }
  }
   
   //发送 数据
  // USART_ITConfig(USART1, USART_IT_TXE, ENABLE);                                        为什么 就 死了
  if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)
  {   
    USART_ClearITPendingBit(USART1,USART_IT_TXE);                              //清楚标记位
    // Write one byte to the transmit data register
   
    TxBuffer1[0] = 'A';
    TxBuffer1[1] = 'C';
    TxBuffer1[2] = 'K';
    TxBuffer1[3] = '\0';
   
    while(TxBuffer1[TxCounter] != '\0')
    {
      USART_SendData(USART1,TxBuffer1[TxCounter]);//发送ACK信息
      while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)
      {
        ;
      }
      
      TxCounter ++;
      RxCounter = RxCounter % 8;
    }
    TxCounter = 0;
    Delay(6000000);
   
    TxBuffer[0] = Charg_Vin;
    TxBuffer[1] = Charg_Vin >> 8;
    TxBuffer[2] = Charg_Voltage;
    TxBuffer[3] = Charg_Voltage >> 8;
    TxBuffer[4] = Charg_Current;
    TxBuffer[5] = Charg_Current >> 8;
    TxBuffer[6] = Charg_Distance;
    TxBuffer[7] = Charg_AutoDoor;
    TxBuffer[8] = Charg_Connect;
    TxBuffer[9] = '\0';
   
    while(TxBuffer[TxCounter] != '\0')
    {
      USART_SendData(USART1, TxBuffer[TxCounter]);
      while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)
      {
        ;
      }
      TxCounter ++;
      RxCounter = RxCounter % 8;
    }

    if(TxBuffer[TxCounter] == '\0')                                             //判断是否发送完成
    {
      //Disable the USART1 Transmit interrupt
      USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
      USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
      GPIO_ResetBits(GPIOA,GPIO_Pin_11);                                        //切换到接受模式
      
      TxCounter = 0;
    }
  }
}


希望楼主以及其余大侠给点建议,谢谢

使用特权

评论回复
32
无风之树| | 2011-11-1 09:46 | 只看该作者
新手路过

使用特权

评论回复
33
wangshi| | 2011-11-23 21:01 | 只看该作者
你查一下RXNE,是怎么变化的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则