嵌入式单片机学习之串口接收数据实例

  //通过判断接收连续2个字符之间的时间差不大于10ms来决定是不是一次连续的数据.

  //如果2个字符接收间隔超过10ms,则认为不是1次连续数据.也就是超过10ms没有接收到

  //任何数据,则表示此次接收完毕.

  //接收到的数据状态

  //[15]:0,没有接收到数据;1,接收到了一批数据.

  //[14:0]:接收到的数据长度

  vu16 USART3_RX_STA=0;

  一。uart3.c中的函数

  1. 初始化串口3

  //初始化IO 串口3

  //pclk1:PCLK1时钟频率(Mhz)

  //bound:波特率

  void usart3_init(u32 bound)

  {

  NVIC_InitTypeDef NVIC_InitStructure;

  GPIO_InitTypeDef GPIO_InitStructure;

  USART_InitTypeDef USART_InitStructure;

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // GPIOB时钟

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE); //串口3时钟使能

  USART_DeInit(USART3); //复位串口3

  //USART3_TX PB10

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB10

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出

  GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化PB10

  //USART3_RX PB11

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入

  GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化PB11

  USART_InitStructure.USART_BaudRate = bound;//波特率一般设置为9600;

  USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式

  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(USART3, &USART_InitStructure); //初始化串口3

  USART_Cmd(USART3, ENABLE); //使能串口

  //使能接收中断

  USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//开启中断

  //设置中断优先级

  NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//抢占优先级3

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能

  NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器

  ////////////////////////////////////////////////////////////////////////////////////////////////////////

  //定时器7定为10ms中断,检测如果10ms内接收到的数据为同一个数据包中的数据,如果超过10ms

  就算这次接收完成。

  TIM7_Int_Init(1000-1,7200-1); //10ms中断

  USART3_RX_STA=0; //清零

  TIM_Cmd(TIM7,DISABLE); //关闭定时器7

  }

  2.串口3中断函数

  void USART3_IRQHandler(void)

  {

  u8 res;

  if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)//接收到数据

  {

  res =USART_ReceiveData(USART3);

  if((USART3_RX_STA&(1<<15))==0)//接收完的一批数据,还没有被处理,则不再接收其他数据

  {

  if(USART3_RX_STA //还可以接收数据

  {

  TIM_SetCounter(TIM7,0); //计数器清空,定时器7开始下一次定时

  if(USART3_RX_STA==0) //使能定时器7的中断

  {

  TIM_Cmd(TIM7,ENABLE);//使能定时器7

  }

  USART3_RX_BUF[USART3_RX_STA++]=res; //记录接收到的值

  }else

  {

  USART3_RX_STA|=1<<15; //强制标记接收完成

  }

  }

  }

  }

  3. 串口2的printf函数

  //串口3,printf 函数

  //确保一次发送数据不超过USART3_MAX_SEND_LEN字节

  void u3_printf(char* fmt,...)

  {

  u16 i,j;

  va_list ap;

  va_start(ap,fmt);

  vsprintf((char*)USART3_TX_BUF,fmt,ap);

  va_end(ap);

  i=strlen((const char*)USART3_TX_BUF); //此次发送数据的长度

  for(j=0;j //循环发送数据

  {

  while(USART_GetFlagStatus(USART3,USART_FLAG_TC)==RESET); //循环发送,直到发送完毕

  USART_SendData(USART3,USART3_TX_BUF[j]);

  }

  }

  4.串口3printf函数的引用

  u3_printf("%s",p); //发送该数据到WIFI模块

  u3_printf("%s\r\n",cmd); //发送命令

  二。timer.c中定时器7的设置

  1. 初始化

  //通用定时器7中断初始化

  //这里时钟选择为APB1的2倍,而APB1为42M

  //arr:自动重装值。

  //psc:时钟预分频数

  //定时器溢出时间计算方法:Tout=((arr+1)*(psc+1))/Ft us.

  //Ft=定时器工作频率,单位:Mhz

  //通用定时器中断初始化

  //这里始终选择为APB1的2倍,而APB1为36M

  //arr:自动重装值。

  //psc:时钟预分频数

  void TIM7_Int_Init(u16 arr,u16 psc)

  {

  NVIC_InitTypeDef NVIC_InitStructure;

  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM7, ENABLE);//TIM7时钟使能

  //定时器TIM7初始化

  TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的 值

  TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值

  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS =

Tck_tim

  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式

  TIM_TimeBaseInit(TIM7, &TIM_TimeBaseStructure);

//根据指定的参数初始化TIMx的时间基数单位

  TIM_ITConfig(TIM7,TIM_IT_Update,ENABLE ); //使能指定的TIM7中断,允许更新中断

  TIM_Cmd(TIM7,ENABLE);//开启定时器7

  NVIC_InitStructure.NVIC_IRQChannel = TIM7_IRQn;

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0 ;//抢占优先级0

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //子优先级2

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能

  NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器

  }

  二。定时器7的中断函数

  //定时器7中断服务程序

  void TIM7_IRQHandler(void)

  {

  if (TIM_GetITStatus(TIM7, TIM_IT_Update) != RESET)//是更新中断

  {

  USART3_RX_STA|=1<<15; //标记接收完成

  TIM_ClearITPendingBit(TIM7, TIM_IT_Update ); //清除TIM7更新中断标志

  TIM_Cmd(TIM7, DISABLE); //关闭TIM7

  }

  }

分享些资料便于后期的学习参考

(stm32串口应用)

http://www.makeru.com.cn/live/1392_1164.html?s=45051

PWM脉宽调制技术

http://www.makeru.com.cn/live/4034_2146.html?s=45051

基于STM32讲解串口操作

http://www.makeru.com.cn/live/1758_490.html?s=45051

通过Z-stack协议栈实现串口透传

http://www.makeru.com.cn/live/1758_330.html?s=45051

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容

  • 有一次做一个东西,为了尽量不占用CPU的处理数据时间,所以就使用DMA接收串口的数据,但是呢问题来了.,,,,,怎...
    杨奉武阅读 3,123评论 0 1
  • # STM32之串口DMA接收不定长数据 ## 引言 在使用stm32或者其他单片机的时候,会经常使用到串口通讯,...
    杰杰T_T阅读 529评论 0 0
  • 姓名:周崇杰 学号:16140120059 专业:机械设计制造及其自动化 转载自:http://blog.csd...
    CJbaby阅读 3,472评论 0 3
  • 我的二十到三十岁是荒废的,甚至可以说前三十年我都浑浑噩噩,自己浪费的时间,也不要可惜了,昨日之日不可追,我仍...
    无敌风火轮向前冲鸭阅读 120评论 0 0
  • java8 之后使用CompletableFuture来异步执行任务的场景越来越多,这个时候debug调试就是个问...
    黄云斌huangyunbin阅读 8,730评论 0 0