#include "pbdata.h"
 
uint8_t TxBuffer1[] = "USART Interrupt Example: This isUSART1 DEMO";  
uint8_t RxBuffer1[],rec_f,tx_flag;
volatile uint8_t TxCounter1 = 0x00;
volatile uint8_t RxCounter1 = 0x00;
 
uint32_t Rec_Len;
int main(void)
{
   u8 a=0;
   RCC_Configuration();   
       NVIC_Configuration();   
      GPIO_Configuration();           
      USART_Config(USART1);        
           while(1)
           {
                 
                      if(rec_f==1)
                            {                                                                    
                            rec_f=0;
 
                            USART_OUT(USART1,&TxBuffer1[0]);
                            if(a==0){GPIO_SetBits(GPIOA, GPIO_Pin_2); a=1;}                    
                            else{GPIO_ResetBits(GPIOA, GPIO_Pin_2);a=0; }
 
                        }
           }
}
这是主函数部分,在主函数中只有几个函数的初始化,还有就是定义的数组和标志位。
在一般的串口历程中大家会看到的就是定义一个缓冲区,将接收到的串口数据通过串口中断存放到缓冲区中然后在发送到串口中,但是在接收字符串的时候就要用到逐位发送,新手自己有些不了程序,所以只能一直处于蒙着的状态。其实个人感觉整点原子的程序写的真的挺好的,建议新手开始学习的时候看他的程序,有的人就是不喜欢他写程序的风格,这个因人而异,在这里只是建议一下。原子的串口就给出了字符串就收的历程,但是用这个历程的时候结尾必须要是0d   0a结尾的也就是空格和回车。
在这了给出一个自己定义的头和尾的串口程序。
  串口接收字符串的原理和接收单字符的差不多,只是在接收的时候定义的缓冲区是一个数组,将接受到的数据存放到数组中,在从数组中读出想要的十六进制数在主程序中调用。
以上的主函数中定义个几个数组
uint8_t TxBuffer1[] = "USART Interrupt Example: This isUSART1 DEMO";  
uint8_t RxBuffer1[],rec_f,tx_flag;
volatile uint8_t TxCounter1 = 0x00;
volatile uint8_t RxCounter1 = 0x00;
第一个是发送的缓冲区数组,将接受的数据放到这里发送到串口。
第二个是接收缓冲区的数组,将接受回来的数据放到这里面。
下面两个是定义的变量,因为接收的时候是逐个位就收的所以接收以为就要将地址加一位存放到数组中,否则就会出现发送的数据直接受到一位的现象,应为由于地址没有加1所以导致数据被覆盖掉了。
在主函数中有几个调用的函数,就是串口初始化的函数,
          RCC_Configuration();   
       NVIC_Configuration();   
      GPIO_Configuration();           
      USART_Config(USART1);   
首先是   RCC_Configuration();函数
由于是我自己写的模板所以喜欢讲所有的时钟都放到一个函数中。这个根据个人喜好而定。
voidRCC_Configuration(void)
{
   SystemInit();
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
       RCC_APB2PeriphClockCmd( RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB
                           |RCC_APB2Periph_GPIOD|RCC_APB2Periph_AFIO , ENABLE);  
}
NVIC_Configuration();中断向量配置,如果没有需要串口抢占的直接默认优先级就好
voidNVIC_Configuration(void)
{
 
  NVIC_InitTypeDef NVIC_InitStructure;
/* Configure the NVIC Preemption Priority Bits*/  
  /* Configure one bit for preemption priority*/ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);         
NVIC_InitStructure.NVIC_IRQChannel= USART1_IRQn;                        
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;         
  NVIC_InitStructure.NVIC_IRQChannelSubPriority= 0;                     
  NVIC_InitStructure.NVIC_IRQChannelCmd =ENABLE;                     
  NVIC_Init(&NVIC_InitStructure);
}
GPIO_Configuration();这个是一个led灯的配置,功能是发送数据时单片机成功接收后会出现电平反转,也就是亮灭变化。同时串口的IO口初始化也在这里。
voidGPIO_Configuration(void)
{
 
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;                           
  GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_PP;              
  GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);                           
 
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;                 
  GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AF_PP;            
  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);               
 
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;                     
  GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOD, &GPIO_InitStructure);
  GPIO_ResetBits(GPIOD, GPIO_Pin_13);                          
}
USART_Config(USART1);   最后就是串口配置了。
voidUSART_Config(USART_TypeDef* USARTx)
{
      
  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;   
 
  /* Configure USART1 */
  USART_Init(USARTx, &USART_InitStructure);                           
   /* Enable USART1 Receive and Transmitinterrupts */
  USART_ITConfig(USART1, USART_IT_RXNE,ENABLE);                    
  USART_ITConfig(USART1, USART_IT_TXE, ENABLE);                           
 
  /* Enable the USART1 */
  USART_Cmd(USART1, ENABLE);     
}
这些都是固定的东西按照手册配置就行,不过多废话了,主要的部分是在中断函数中
extern uint8_tTxBuffer1[];
extern uint8_tTxBuffer2[];
extern uint8_tRxBuffer1[];
extern uint8_tRxBuffer2[];
extern volatileuint8_t RxCounter1;
extern volatileuint8_t RxCounter2;
 
extern uint8_trec_f,tx_flag;
以上用到的是extern的定义,目的是在外部函数中可以调用。下面是串口函数的编写。
我直接将注释打到语句的后面,在最后又源程序,可下载调试。
voidUSART1_IRQHandler(void)
{
    unsigned int i;//定义一个变量,在后面以为用
  if(USART_GetITStatus(USART1, USART_IT_RXNE)!= RESET)        
  { //如果产生串口中断
   
    RxBuffer1[RxCounter1++] =USART_ReceiveData(USART1);   //将中断的数据存放在定义的缓冲区中同时数组的地址自加。
      
   if(RxBuffer1[0]==0xEE&&RxBuffer1[1]==0xB1&&RxBuffer1[2]==0x11
                 &&RxBuffer1[RxCounter1-4]==0xff&&RxBuffer1[RxCounter1-3]==0xfc
                 &&RxBuffer1[RxCounter1-2]==0xff&&RxBuffer1[RxCounter1-1]==0xff)   //这里判断接收数据的头和尾,可自己定义。  RxBuffer1[0]代表数字的第一个数。
    {
                 if(RxBuffer1[6]==0x04)
                 {
                      for(i=0; i< RxCounter1;i++)
                            TxBuffer1 = RxBuffer1;      
                      rec_f=1;//这个是定义的标志位在主函数中判断。如果置位说明接到数据了。                                                                                    
                      TxBuffer1[RxCounter1]=0;                                               
                      RxCounter1=0;
                 }
    }
  }
以上就是全部程序,程序的主要功能就是在串口发送一串定义好的头和尾时单片机接收到数据发送给串口,同时led亮灭一次。

 

stm32的串口接收字符串以十六进制数的更多相关文章

  1. STM32 ucosii 串口接收数据 遇到的问题及解决思路

    写一个程序,用到了ucos ii ,串口在中断中接收数据(一包数据 8个字节 包含: 1byte包头 5byte数据 1byte校验和 1byte 包尾 ) ,数据由上位机每隔500ms发送一次,在串 ...

  2. STM32串口接收不定长数据原理与源程序(转)

    今天说一下STM32单片机的接收不定长度字节数据的方法.由于STM32单片机带IDLE中断,所以利用这个中断,可以接收不定长字节的数据,由于STM32属于ARM单片机,所以这篇文章的方法也适合其他的A ...

  3. STM32使用串口1配合DMA接收不定长数据,减轻CPU载荷

    STM32使用串口1配合DMA接收不定长数据,减轻CPU载荷 http://www.openedv.com/thread-63849-1-1.html 实现思路:采 用STM32F103的串口1,并配 ...

  4. STM32之串口DMA接收不定长数据

    STM32之串口DMA接收不定长数据 引言 在使用stm32或者其他单片机的时候,会经常使用到串口通讯,那么如何有效地接收数据呢?假如这段数据是不定长的有如何高效接收呢? 同学A:数据来了就会进入串口 ...

  5. Stm32使用串口空闲中断,基于队列来接收不定长、不定时数据

    串口持续地接收不定长.不定时的数据,把每一帧数据缓存下来且灵活地利用内存空间,下面提供一种方式供参考.原理是利用串口空闲中断和DMA,每当对方发来一帧完整的数据后,串口接收开始空闲,触发中断,在中断处 ...

  6. STM32 HAL库使用中断实现串口接收不定长数据

    以前用DMA实现接收不定长数据,DMA的方法接收串口助手的数据,全部没问题,不过如果接收模块返回的数据,而这些数据如果包含回车换行的话就会停止接收,例如接收:AT\r\nOK\r\n,就只能接收到AT ...

  7. 【Arduino】Arduino接收字符串

    [Arduino]Arduino接收字符串 相关文章 [Arduino]开发入门[十]Arduino蓝牙模块与Android实现通信 在[Arduino]开发入门[十]Arduino蓝牙模块与Andr ...

  8. STM32 硬件UART接收超时检测设置

    STM32 硬件UART接收超时检测设置 -----------------本文作者"智御电子",期待与电子爱好者交流学习.---------------- 应用场景 在uart应 ...

  9. 2018最新mfc作为上位机接收硬件端USB或串口数据显示成图片 解决串口接收数据丢字节丢包问题

    原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/9490616.html 本文用的是VS2013MFC写串口数据接收: 第一步:首先建立一个MFC ...

随机推荐

  1. js setTimeout 与 setInterval 以及 for 循环 刷新UI

    1. setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式:执行一次: 如果需要执行多次,自身再次调用 setTimeout(): 示例:无穷循环并带停止按钮的 <html&g ...

  2. 抓包工具Fidder设置(移动端抓包)

    1.下载安装fiddler,下载链接:http://fiddler2.com/get-fiddler(我用的是免安装的fiddler2) 2.设置fiddler 打开Fiddler,     Tool ...

  3. linux笔记:shell基础和bash的基本功能

    shell的优势:可以直接调用linux系统命令 shell脚本的基本写法:脚本名以.sh结尾程序的第一行为#!/bin/bash,告诉系统这是一个shell脚本以#作为注释shell脚本的执行方式: ...

  4. robotframework笔记24

    侦听器接口 机器人框架有一个侦听器接口,可以用于接收 对测试执行通知. 示例用法包括 外部测试监控,测试失败时发送邮件消息, 与其他系统进行通信. 侦听器API版本3也使得 它可以修改测试在测试执行和 ...

  5. SVG格式

    SVG格式 编辑 目 录 概述 简介 优势 实例 展现 1概述 SVG格式 SVG是一种用XML定义的语言,用来描述二维矢量及矢量/栅格图形.SVG提供了3种类型的图形对象:矢量图形(vectorgr ...

  6. Generic泛型

    1.问题 未使用泛型时,元素的类型不安全:操作麻烦,可能需要强制转换import java.util.ArrayList;import java.util.List;import org.junit. ...

  7. 137. Single Number II——问题是查找,本质是hash查找,只是记录的是32 bit中各个位出现次数而已

    Given an array of integers, every element appears three times except for one. Find that single one. ...

  8. 216. Combination Sum III——本质DFS

    Find all possible combinations of k numbers that add up to a number n, given that only numbers from ...

  9. 在现有 SharePoint 服务器上安装 PowerPivot for SharePoint

    步骤1: 检查 SQL Server 2008 R2 Analysis Services 实例的“程序”文件夹.如果您找到了现有安装或之前安装的证据,则执行剩余步骤.否则,直接执行步骤 2:安装 Po ...

  10. GL10控制图形旋转

    GL10提供了glRotatef(float  angle , float  x ,  float  y , float  z)方法,该方法用于控制旋转,该方法种angle控制旋转角度:而x.y.z参 ...