打印

STM32串口遇到一个奇怪问题

[复制链接]
1555|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
huangfeng33|  楼主 | 2013-6-5 22:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include "stm32f10x.h"

u16 sheng[]={1,2,3,4,5,6,7,8,9};
int i=0;

void GPIO_Configuration()
    {
        GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;//设置管脚模式为模拟输入

    GPIO_Init(GPIOC,&GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
       GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
       GPIO_Init(GPIOA, &GPIO_InitStructure);
   
   
       GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  
       GPIO_Init(GPIOA, &GPIO_InitStructure);
    }

   void RCC_Configuration()
    {
      
       RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC|RCC_APB2Periph_USART1,ENABLE);//使能时钟

    }


void USART_Configuration()
    {
       USART_InitTypeDef USART_InitStructure;
       USART_InitStructure.USART_BaudRate=115200;//设置波特率
       USART_InitStructure.USART_WordLength=USART_WordLength_8b;//设置数据位长度
       USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
       USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
       USART_InitStructure.USART_Parity=USART_Parity_No;
       USART_InitStructure.USART_StopBits=USART_StopBits_1;
       USART_Init( USART1, &USART_InitStructure);

    }
int main()
   {
   
     RCC_Configuration();
     GPIO_Configuration();
     USART_Configuration();
     USART_Cmd( USART1, ENABLE);
     USART_ClearFlag(USART1,USART_FLAG_TC);
     delay(10);
     while(i<9)
       {  
    while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
  USART_ClearFlag(USART1,USART_IT_TC);  
          USART_SendData(USART1,sheng[i]);
    i++;
        }
     }

这个程序运行后PC机上串口小助手不显示接收数据 但奇怪的是只要把while(i<9)改成while(1)就接收数据,希望朋友们能帮忙看看问题出在哪里 ?谢谢了
沙发
jamsan| | 2013-6-6 09:01 | 只看该作者
你DEBUG一下,DEBUG的时候打开汇编,看看是不是编绎出的汇编语句有问题。

使用特权

评论回复
板凳
wang_zuowei| | 2013-6-6 15:33 | 只看该作者
是不是程序执行的太快了 没等通信准备好了就结束了,改成这样试试呢?
int main()
   {
   
     RCC_Configuration();
     GPIO_Configuration();
     USART_Configuration();
     USART_Cmd( USART1, ENABLE);
     USART_ClearFlag(USART1,USART_FLAG_TC);
     delay(10);
     while(1)
     {
           while(i<9)
           {  
                while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
                USART_ClearFlag(USART1,USART_IT_TC);  
                USART_SendData(USART1,sheng[i]);
                i++;
            }
      if(i>=9)  i=0x00;
     }
   }

使用特权

评论回复
地板
香水城| | 2013-6-6 17:30 | 只看该作者
单步调试一下

使用特权

评论回复
5
uet_cache| | 2013-6-6 17:34 | 只看该作者
你的程序i<9时运行数据发送语句,可i>=9的时候,运行什么?
程序大循环什么时候都是必须的。而且,如果你连续运行,如何保证你在看结果的时候,i还在小于9.。。。,

使用特权

评论回复
6
huangfeng33|  楼主 | 2013-6-6 19:43 | 只看该作者
先谢谢楼上的各位朋友了,我想要的结果是只显示一组数据 而不是循环显示,有什么好的建议吗?

使用特权

评论回复
7
拿起书本| | 2013-6-11 15:41 | 只看该作者


int main()
    {
     
      RCC_Configuration();
      GPIO_Configuration();
      USART_Configuration();
      USART_Cmd( USART1, ENABLE);
      USART_ClearFlag(USART1,USART_FLAG_TC);
      delay(10);
      while(i<9)
        {  
     while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
   USART_ClearFlag(USART1,USART_IT_TC);  
           USART_SendData(USART1,sheng[i]);
     i++;
         }

while(1);     
}


楼主还没明白问题在哪,一定要有一个死循环!

使用特权

评论回复
8
trumpxp| | 2013-6-11 20:00 | 只看该作者
找找程序中的循环语句  可能是哪里出现了   死循环   

使用特权

评论回复
9
huangfeng33|  楼主 | 2013-6-12 14:25 | 只看该作者

int main()
    {
     
      RCC_Configuration();
      GPIO_Configuration();
      USART_Configuration();
      USART_Cmd( USART1, ENABLE);
      USART_ClearFlag(USART1,USART_FLAG_TC);
      delay(10);
      while(i<9)
        {  
     while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
   USART_ClearFlag(USART1,USART_IT_TC);  
           USART_SendData(USART1,sheng[i]);
     i++;
         }

while(1);     
}

谢谢楼上的,刚才我按这个方法去做了,还是收不到数据啊?

使用特权

评论回复
10
拿起书本| | 2013-6-12 14:26 | 只看该作者
while(i<9)
时候你是否打开串口工具的HEX显示,确认下是否一点数据都没?

使用特权

评论回复
11
杨爱林林| | 2013-6-13 08:06 | 只看该作者
接收一组数据后 break不就行了吗

使用特权

评论回复
12
sun1238898| | 2013-6-13 10:20 | 只看该作者
你仿真调试吗,你用i<9,本来单片机速度就很快,你这样很难实现的。你可以选择先打开串口调试助手,然后进行仿真,这样子,应该就有数据了。

使用特权

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

本版积分规则

506

主题

2446

帖子

8

粉丝