[求助] stm32初学者 求教串口通信的问题

ouguanxiaosilan   2014-10-12 12:05 楼主
#include "stm32f10x.h"
void RCC_Configuration(void);
void GPIO_Configuration(void);
//void NVIC_Configuration(void);
void USART_Config(void);
int main()
{
      RCC_Configuration();
      GPIO_Configuration();
      NVIC_Configuration();
      USART_Config();
          while(1)
          {
              USART_SendData(USART1, 0x0d);
          }

}
void RCC_Configuration()
{
   SystemInit();
   RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO , ENABLE);
   RCC_APB2PeriphClockCmd( RCC_APB2Periph_USART1 , ENABLE);
}

void GPIO_Configuration()
{
      GPIO_InitTypeDef GPIO_InitStructure;
          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;                                     //LED1控制--PB5
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                         //推挽输出
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
          GPIO_Init(GPIOB, &GPIO_InitStructure);                                         
       
          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;                                  //USART1 TX
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                     //复用推挽输出
          GPIO_Init(GPIOA, &GPIO_InitStructure);                                     //A端口
       
          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;                          //USART1 RX
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;            //复用浮空输入
          GPIO_Init(GPIOA, &GPIO_InitStructure);
}

/*void NVIC_Configuration()
{
            //  结构声明
          //NVIC_InitTypeDef NVIC_InitStructure;
       
          /* Configure the NVIC Preemption Priority Bits */  
          /* Configure one bit for preemption priority */
          /* 优先级组 说明了抢占优先级所用的位数,和响应优先级所用的位数   在这里是0, 4
          0组:  抢占优先级占0位, 响应优先级占4位
          1组:  抢占优先级占1位, 响应优先级占3位
          2组:  抢占优先级占2位, 响应优先级占2位
          3组:  抢占优先级占3位, 响应优先级占1位
          4组:  抢占优先级占4位, 响应优先级占0位  
          */                                
         /* NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);            
       
          NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;                                     //设置串口1中断
          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;                     //抢占优先级 0
          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;                                //子优先级为0
          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                        //使能
          NVIC_Init(&NVIC_InitStructure);
}  */

void USART_Config()
{
          USART_InitTypeDef USART_InitStructure;
          USART_InitStructure.USART_BaudRate = 9600;                                                //速率115200bps
          USART_InitStructure.USART_WordLength = USART_WordLength_8b;                //数据位8位
          USART_InitStructure.USART_StopBits = USART_StopBits_1;                        //停止位1位
          USART_InitStructure.USART_Parity = USART_Parity_No;                                //无校验位
          USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;   //无硬件流控
          USART_InitStructure.USART_Mode = USART_Mode_Tx;                                        //收发模式
          USART_Init(USART1, &USART_InitStructure);                                                        //配置串口参数函数
          USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);                    //使能接收中断
          USART_ITConfig(USART1, USART_IT_TXE, ENABLE);                                                //使能发送缓冲空中断
          USART_Cmd(USART1, ENABLE);
       
}

回复评论 (4)

上位机 收不到 发送的数据啊  这个程序就是用来测试串口的
点赞  2014-10-12 12:06
  USART_InitStructure.USART_BaudRate = 9600;                                                //速率115200bps

你上位机的设置,要对,和程序中一样,你这个注释和程序不对应的,不知道是不是这个问题
点赞  2014-10-12 18:48
检查上位机软件串口号,波特率等是否正确。若无误,再看单片机 串口是否有数据发出。
点赞  2014-10-12 20:03
引用: mengyu139 发表于 2014-10-12 18:48
USART_InitStructure.USART_BaudRate = 9600;                                                //速率11 ...

这个注释错了,,不过波特率是对的,经过我的检查,感觉是和USART_SendData()这个函数有关,,我找了个例程
void USART_OUT(USART_TypeDef* USARTx, uint8_t *Data,...){
        const char *s;
    int d;
    char buf[16];
    va_list ap;
    va_start(ap, Data);

        while(*Data!=0){                                                          //判断是否到达字符串结束符
                if(*Data==0x5c){                                                                          //'\'
                        switch (*++Data){
                                case 'r':                                                                  //回车符
                                        USART_SendData(USARTx, 0x0d);          

                                        Data++;
                                        break;
                                case 'n':                                                                  //换行符
                                        USART_SendData(USARTx, 0x0a);       
                                        Data++;
                                        break;
                               
                                default:
                                        Data++;
                                    break;
                        }
                       
                         
                }
                else if(*Data=='%'){                                                                          //
                        switch (*++Data){                               
                                case 's':                                                                                  //字符串
                        s = va_arg(ap, const char *);
                        for ( ; *s; s++) {
                            USART_SendData(USARTx,*s);
                                                while(USART_GetFlagStatus(USARTx, USART_FLAG_TC)==RESET);
                        }
                                        Data++;
                        break;
                    case 'd':                                                                                  //十进制
                        d = va_arg(ap, int);
                        itoa(d, buf, 10);
                        for (s = buf; *s; s++) {
                            USART_SendData(USARTx,*s);
                                                while(USART_GetFlagStatus(USARTx, USART_FLAG_TC)==RESET);
                        }
                                        Data++;
                        break;
                                default:
                                        Data++;
                                    break;
                        }                 
                }
                else USART_SendData(USARTx, *Data++);
                while(USART_GetFlagStatus(USARTx, USART_FLAG_TC)==RESET);
        }
}

/******************************************************
                整形数据转字符串函数
        char *itoa(int value, char *string, int radix)
                radix=10 标示是10进制        非十进制,转换结果为0;  

            例:d=-379;
                执行        itoa(d, buf, 10); 后
               
                buf="-379"                                                                                     
**********************************************************/
char *itoa(int value, char *string, int radix)
{
    int     i, d;
    int     flag = 0;
    char    *ptr = string;

    /* This implementation only works for decimal numbers. */
    if (radix != 10)
    {
        *ptr = 0;
        return string;
    }

    if (!value)
    {
        *ptr++ = 0x30;
        *ptr = 0;
        return string;
    }

    /* if this is a negative value insert the minus sign. */
    if (value < 0)
    {
        *ptr++ = '-';

        /* Make the value positive. */
        value *= -1;
    }

    for (i = 10000; i > 0; i /= 10)
    {
        d = value / i;

        if (d || flag)
        {
            *ptr++ = (char)(d + 0x30);
            value -= (d * i);
            flag = 1;
        }
    }

    /* Null terminate the string. */
    *ptr = 0;

    return string;

使用这个函数可以接收到 但是单独使用USART_SendData时就不行
点赞  2014-10-13 14:29
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复