打印

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

[复制链接]
8921|32
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gooout|  楼主 | 2010-10-13 16:36 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 gooout 于 2010-10-14 09:00 编辑

用EM-STM3210E开发板,写了一个简单的串口通信代码,STM32不能正常接收数据,只能接收到第一个字节的数,就是说我上位机发“fa010203”,单片机收到数返回给PC机的数是“fafafa”
代码如下:

  while (1)
  {   

     if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
     {
       static int k = 0;   
       RxBuf1[k]=USART_ReceiveData(USART1);  //USART1->DR;
       TxBuf1[k]=RxBuf1[k];
       USART_SendData(USART1,TxBuf1[k]);
       k++;
        k = k%8;
     }
   }
沙发
gooout|  楼主 | 2010-10-13 16:45 | 只看该作者
可以看到RXNE始终为0

untitled.JPG (64.46 KB )

untitled.JPG

使用特权

评论回复
板凳
sjnh| | 2010-10-13 16:55 | 只看该作者
前面代码一堆,就是没贴串口初始化代码,没法判断

使用特权

评论回复
地板
gooout|  楼主 | 2010-10-13 17:25 | 只看该作者
void USART_Configuration(void)
{
  USART_InitTypeDef USART_InitStructure;

/* USART1 configuration ------------------------------------------------------*/
  /* USART1 configured as follow:
        - BaudRate = 115200 baud  
        - Word Length = 8 Bits
        - One Stop Bit
        - No parity
        - Hardware flow control disabled (RTS and CTS signals)
        - Receive and transmit enabled
        - USART Clock disabled
        - USART CPOL: Clock is active low
        - USART CPHA: Data is captured on the middle
        - USART LastBit: The clock pulse of the last data bit is not output to
                         the SCLK pin
  */
  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_InitStructure.USART_Clock = USART_Clock_Disable;
  //USART_InitStructure.USART_CPOL = USART_CPOL_Low;
  //USART_InitStructure.USART_CPHA = USART_CPHA_2Edge;
  //USART_InitStructure.USART_LastBit = USART_LastBit_Disable;

  USART_Init(USART1, &USART_InitStructure);
   
  /* Enable USART1 */
  USART_Cmd(USART1, ENABLE);
}

多谢sjnh兄弟,上面是串口初始化代码

使用特权

评论回复
5
gooout|  楼主 | 2010-10-13 18:23 | 只看该作者
各位高手帮忙看看哈,实在搞不定了:(

使用特权

评论回复
6
gooout|  楼主 | 2010-10-13 18:46 | 只看该作者
在线等,希望高手早点出现

使用特权

评论回复
7
土憋ㄘ`| | 2010-10-13 18:47 | 只看该作者
高手来了!

使用特权

评论回复
8
gooout|  楼主 | 2010-10-13 18:49 | 只看该作者
高手来了!
土憋ㄘ` 发表于 2010-10-13 18:47

那就帮忙解答一下哈,谢了

使用特权

评论回复
9
zhangdinggang| | 2010-10-13 22:27 | 只看该作者
/* Enable USART1 Receive and Transmit interrupt */
  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
  USART_ITConfig(USART1, USART_IT_TXE, DISABLE);

使用特权

评论回复
10
gooout|  楼主 | 2010-10-14 09:06 | 只看该作者
本帖最后由 gooout 于 2010-10-14 09:10 编辑
/* Enable USART1 Receive and Transmit interrupt */
  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
  USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
zhangdinggang 发表于 2010-10-13 22:27


非常感谢“zhangdinggang ”兄弟,按照你的设置后,现在能够进入If语句,但每次读到的数都是第一个字节,后面字节的数读不到。
串口助手发“aabbcc”,下位机收到然后返回来的是“aaaaaa”

使用特权

评论回复
11
静默| | 2010-10-14 09:21 | 只看该作者
主程循环中试一下以下代码:
  while (1)
  {   
     if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
     {
       RxBuf1[0] = USART_ReceiveData(USART1);  //USART1->DR;
       USART_ClearITPendingBit(USART1, USART_IT_RXNE);
       USART_SendData(USART1, RxBuf1[0]);
     }
   }

使用特权

评论回复
12
gooout|  楼主 | 2010-10-14 09:30 | 只看该作者
主程循环中试一下以下代码:
  while (1)
  {   
     if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
     {
       RxBuf1[0] = USART_ReceiveData(USART1);  //USART1->DR;
       USART_ClearITPendi ...
静默 发表于 2010-10-14 09:21


试过了,还是不行,发“bc”,只能收到“b”

使用特权

评论回复
13
gooout|  楼主 | 2010-10-14 09:35 | 只看该作者
if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
        {
                static int k = 0;                       
                RxBuf1[k]=USART_ReceiveData(USART1);
                Delay(100);
                RxBuf1[k]=USART_ReceiveData(USART1);        
                TxBuf1[k]=RxBuf1[k];
                USART_ClearITPendingBit(USART1, USART_IT_RXNE);
                USART_SendData(USART1,TxBuf1[k]);
                k++;
                k = k%8;
        }

我改了一下程序,读一次DR寄存器后,延时1S,然后再读,读到的还是第一个字节的,不是DR寄存器被读走以后,应该自动清除,放下一个字节么?

使用特权

评论回复
14
gooout|  楼主 | 2010-10-14 10:33 | 只看该作者
在线等哦

使用特权

评论回复
15
ST_ARM| | 2010-10-14 11:04 | 只看该作者
试一下下面的代码:(另外,注意你的PC机的串口配置与STM32的配置是否一致)
while (1)
  {   
     if (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) != RESET)
     {
           static int k = 0;
           RxBuf1[0] = USART_ReceiveData(USART1);  //USART1->DR;
           USART_ClearFlag(USART1, USART_FLAG_RXNE);
           if (USART_GetFlagStatus(USART1, USART_FLAG_TXE) != RESET)
                 USART_SendData(USART1, RxBuf1[0]);

            k++;
            k = k%8;
     }
}

使用特权

评论回复
16
zhangdinggang| | 2010-10-14 11:12 | 只看该作者
不要 Delay(100); 这样就溢出了。
你可能是每次发aabbcc 下位只收到a 剩下的溢出了。

使用特权

评论回复
17
gooout|  楼主 | 2010-10-14 11:45 | 只看该作者
试一下下面的代码:(另外,注意你的PC机的串口配置与STM32的配置是否一致)
while (1)
  {   
     if (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) != RESET)
     {
           static int k = 0;
           ...
ST_ARM 发表于 2010-10-14 11:04


pc跟stm32的配置是一样的,而且能够收发一个字节,也能说明配置没有问题了吧?
上面这段代码试过了,还是只能收一个字节,发“bc”收到“b”

使用特权

评论回复
18
gooout|  楼主 | 2010-10-14 11:46 | 只看该作者
不要 Delay(100); 这样就溢出了。
你可能是每次发aabbcc 下位只收到a 剩下的溢出了。
zhangdinggang 发表于 2010-10-14 11:12

没有延时也不行的

使用特权

评论回复
19
ST_ARM| | 2010-10-14 11:54 | 只看该作者
USART_WordLength_8b;---对应的PC,你使用的是什么?

使用特权

评论回复
20
gooout|  楼主 | 2010-10-14 11:58 | 只看该作者
USART_WordLength_8b;---对应的PC,你使用的是什么?
ST_ARM 发表于 2010-10-14 11:54


我用的串口助手,数据位8

使用特权

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

本版积分规则

0

主题

20

帖子

1

粉丝