Stm32f103Zet6学习之串口通信——串口数据只能发不能收

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

 

文章目录

 


前言

最近拿德飞莱的STM32f103Zet6做毕设,又因为是新手,怕以后会忘记,然后就想着随手记录一些遇到得问题。然后本文章我使用的东西有

软件:德飞莱串口软件调试 助手、sscom5.13.1串口调试助手、keil5、FlyMcu

硬件:德飞莱的STM32f103Zet6、程序下载线。

遇到的问题:再把德飞莱的例程代码(6-(德飞莱)尼莫M3S-串口1收发)下载到STM32f103Zet6里面后,没有实现串口的收发功能。

解决:发现是自己的操作有一些错误。我本来以为要对那个示例代码在keil5里面编译的,但是后面发现直接在FlyMcu里面直接把程序下载就行。

 

一、示例代码

Stm32f103Zet6的示例代码主要有以下部分,在网上也都能查到:

1、maic.c

#include <stdio.h>
#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "key.h"
#include "timer.h"
#include "beep.h"

#ifdef __GNUC__
  /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
     set to 'Yes') calls __io_putchar() */
  #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */

int main(void)
{
      GPIO_InitTypeDef GPIO_InitStructure;
      USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
     
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);    //使能USART1,GPIOA时钟
       USART_DeInit(USART1);  //复位串口1
      //USART1_TX   PA.9
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;    //复用推挽输出
    GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA9
   
    //USART1_RX      PA.10
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
    GPIO_Init(GPIOA, &GPIO_InitStructure);  //初始化PA10     
    
      //Usart1 NVIC 配置

    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
      NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;        //子优先级3
      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            //IRQ通道使能
      NVIC_Init(&NVIC_InitStructure);    //根据指定的参数初始化VIC寄存器
  /* USARTx configured as follow:
        - BaudRate = 9600 baud  波特率
        - Word Length = 8 Bits  数据长度
        - One Stop Bit          停止位
        - No parity             校验方式
        - Hardware flow control disabled (RTS and CTS signals) 硬件控制流
        - Receive and transmit enabled                         使能发送和接收
  */
  USART_InitStructure.USART_BaudRate = 9600;
  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_Init(USART1, &USART_InitStructure);
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启中断
  USART_Cmd(USART1, ENABLE);                    //使能串口 

    LED_Init();//LED初始化
  KEY_Init();//按键初始化
  SysTick_Init();//延时初始化
    BEEP_Init();   //蜂鸣器初始化
    printf("\n\rUSART Printf Example: (德飞莱)尼莫M3S开发板串口测试程序\r输入任何信息发送,接收到同样信息");
  while (1)
  {
    //使用printf函数循环发送固定信息
    Delay_ms(500);          
  LED2_REV;    
  }
}


PUTCHAR_PROTOTYPE
{
  /* Place your implementation of fputc here */
  /* e.g. write a character to the USART */
  USART_SendData(USART1, (uint8_t) ch);

  /* 循环等待直到发送结束*/
  while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
  {}

  return ch;
}

 

2、stm32f10x_it.c

//串口1中断
void USART1_IRQHandler(void)  
  
{  
     if(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == SET)  
      {       
              USART_SendData(USART1, USART_ReceiveData(USART1));             
      }
      
}

二、使用步骤

1.FLYMCU的使用方法:

(1)下载示例代码6-(德飞莱)尼莫M3S-串口1收发到桌面上。如果你想要keil5打开,可以在“6-(德飞莱)尼莫M3S-串口1收发”---“USER”——“test.uvproj”直接打开。

(2)打开FLYMCU。按照以下步骤进行程序的下载,当出现步骤5时程序下载完成。

96cfab6a34454ca180794b373fd5ff44.png

 

2.串口助手的设置:

1、串口助手:德飞莱串口调试软件V2.5.1.4

 

67944ef9d1ea4ce6be2cdb6b7e23c0dc.png

在它正常运行实例代码的情况下,他是按照下面步骤这么显示的(按照例程代码,应该是串口助手发过去什么就收到什么:

20b88be767984698a050a37ecbe95273.png

但是如果你把发送区的”请输入发送消息“那行字删掉,再发送,你就会发现它不显示收到的信息:

如下图:

e1fdb9d9850f4b89949c766c526ff8e3.png

但是你用串口助手sscom5.13.1就会发现他是能正常收发的,如下图:

09e37e24b75048ceac39f73b7b71a9f5.jpeg

具体原因是啥我就不太清楚了。

 


总结

我本来找了很多资料(试了修改波特率,又确认初始化那些,还有中断设置的那些)都解决不了这个看似”串口数据只能发不能收”的问题,但是我换了一个串口助手就发现商家提供给的例程代码是正常收发数据的。

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值