2868|4

9

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

stm32初学者 求教串口通信的问题 [复制链接]

#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);
       
}
此帖出自stm32/stm8论坛

最新回复

检查上位机软件串口号,波特率等是否正确。若无误,再看单片机 串口是否有数据发出。  详情 回复 发表于 2014-10-12 20:03
点赞 关注
 

回复
举报

9

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
上位机 收不到 发送的数据啊  这个程序就是用来测试串口的
此帖出自stm32/stm8论坛
 
 

回复

154

帖子

3

TA的资源

一粒金砂(中级)

板凳
 
  USART_InitStructure.USART_BaudRate = 9600;                                                //速率115200bps

你上位机的设置,要对,和程序中一样,你这个注释和程序不对应的,不知道是不是这个问题
此帖出自stm32/stm8论坛

点评

这个注释错了,,不过波特率是对的,经过我的检查,感觉是和USART_SendData()这个函数有关,,我找了个例程 void USART_OUT(USART_TypeDef* USARTx, uint8_t *Data,...){ const char *s; int d; char  详情 回复 发表于 2014-10-13 14:29
 
 

回复

3471

帖子

13

TA的资源

五彩晶圆(高级)

4
 
检查上位机软件串口号,波特率等是否正确。若无误,再看单片机 串口是否有数据发出。
此帖出自stm32/stm8论坛
 
 
 

回复

9

帖子

0

TA的资源

一粒金砂(初级)

5
 
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时就不行
此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表