oppoN1T手机能用tf卡只能读不能写增容吗

STM32串口中断方式接收
STM32串口中断方式接收
转载▼
打开串口的时钟源
void RCC_Configuration(void)
&&RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1
| RCC_APB2Periph_GPIOA |&
&&RCC_APB2Periph_GPIOB
| RCC_APB2Periph_AFIO, ENABLE);
首先中断的配置
void NVIC_Configuration(void)&
NVIC_InitTypeDef NVIC_InitS
#ifdef&&VECT_TAB_RAM&&
&&NVIC_SetVectorTable(NVIC_VectTab_RAM,
&&NVIC_SetVectorTable(NVIC_VectTab_FLASH,
&&NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);&
&&NVIC_InitStructure.NVIC_IRQChannel
= USART1_IRQC&
&&NVIC_InitStructure.NVIC_IRQChannelSubPriority
&&NVIC_InitStructure.NVIC_IRQChannelCmd
= ENABLE;&
&&NVIC_Init(&NVIC_InitStructure);&
接着设置GPIO的第二功能
void GPIO_Configuration(void)&
&&GPIO_InitTypeDef
GPIO_InitS
&&GPIO_InitStructure.GPIO_Pin
= GPIO_Pin_9;&
&&GPIO_InitStructure.GPIO_Mode
= GPIO_Mode_AF_PP;&
&&GPIO_InitStructure.GPIO_Speed
= GPIO_Speed_50MHz;&
&&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);
初始化串口
void USART_Configuration(void)&
&&USART_InitTypeDef
USART_InitS&
&&USART_ClockInitTypeDef&&USART_ClockInitS&
USART_ClockInitStructure.USART_Clock =
USART_Clock_D&
USART_ClockInitStructure.USART_CPOL = USART_CPOL_L&
USART_ClockInitStructure.USART_CPHA = USART_CPHA_2E&
USART_ClockInitStructure.USART_LastBit =
USART_LastBit_D&
USART_ClockInit(USART1,
&USART_ClockInitStructure);&
USART_InitStructure.USART_BaudRate = 115200;&
USART_InitStructure.USART_WordLength =
USART_WordLength_8b;&
USART_InitStructure.USART_StopBits = USART_StopBits_1;&
USART_InitStructure.USART_Parity = USART_Parity_N&
USART_InitStructure.USART_HardwareFlowControl =
USART_HardwareFlowControl_N
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,
然后是中断处理函数,这里只实现了简单的将收到的字符回显到终端上
void USART1_IRQHandler(void)&
&&&&if(USART_GetFlagStatus(USART1,USART_IT_RXNE)==SET)&
&&&&{&&&&&&&&&&&&&&&
= USART_ReceiveData(USART1);&
&&&&&&&&USART_SendData(USART1,i);&
&&&&&&&&while(USART_GetFlagStatus(USART1,
USART_FLAG_TC) == RESET)&
&&&&&&&&{&
&&&&&&&&}&&&&&&&&&&&&&&&&
&&&&if(USART_GetITStatus(USART1,
USART_IT_RXNE) != RESET)&
&&&&&&&&USART_ClearITPendingBit(USART1,
USART_IT_RXNE);
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。stm32如何判断串口发过来的数据?并如何跟字符串比较?【arm吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:13,192贴子:
stm32如何判断串口发过来的数据?并如何跟字符串比较?收藏
如题!初学stm32 求各位大神帮帮忙
arm嵌入式系统,达内真实案例强化实训,从入门到精通120天快速提升个人能力,7天免费试听,达内金牌讲师24小时在线答疑,点击咨询,即送1000元学习卡.
uint8_ch = USART_ReceiveData(USART1);//串口接收到的数据 char str[]=&online&; //ch str 如何比较?
登录百度帐号推荐应用stm32应用-简单的串口接收与发送程序
单片机&嵌入式
单片机应用
嵌入式操作系统
学习工具&教程
学习和开发单片机的必备工具
(有问必答)
(带你轻松入门)
电子元件&电路模块
当前位置: >>
>> 浏览文章
stm32应用-简单的串口接收与发送程序
与上位机的串口通信是一个很常用的程序。碧海蓝天在刚刚接触stm32芯片时写的第一个简单程序就是串口通信,现在把程序代码甩出来与大家分享。完整的程序哦~一般人我不告诉他
&库版本& :ST3.0.0
文件:mian.c
//功能:串口初始化、打开定时器中断,然后一直接收数据状态就好了。发送在中断中实现
#include "stm32f10x.h"
#include "usart.h"
u8 USART_rx_
int main(void)
&&RCC_Configuration();&&&&&
//系统时钟配置
&&GPIO_Configuration();&&&&&
//端口初始化
&&NVIC_Configuration();&&&&&
//中断源配置
&&USART_Configuration();&
&&&//串口1初始化
&&Time_Init();&&&&&&&&&&&
//定时器初始化
&&#ifdef DEBUG
&&&&&&debug();
&&TIM_Cmd(TIM3,ENABLE);&
&& while(1)
文件:usart.c
#include "stm32f10x.h"
#include "stdio.h"
#include "usart.h"
&&unsigned char auchCRCHi [256]
&&0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,
&&0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
&&0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
&&0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,
&&0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
&&0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,
&&0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,
&&0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
&&0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
&&0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,
&&0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,
&&0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
&&0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,
&&0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
&&0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
&&0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40};
&&unsigned char auchCRCLo [256]
&&0x00,0xC0,0xC1,0x01,0xC3,0x03,0x02,0xC2,0xC6,0x06,0x07,0xC7,0x05,0xC5,0xC4,0x04,
&&0xCC,0x0C,0x0D,0xCD,0x0F,0xCF,0xCE,0x0E,0x0A,0xCA,0xCB,0x0B,0xC9,0x09,0x08,0xC8,
&&0xD8,0x18,0x19,0xD9,0x1B,0xDB,0xDA,0x1A,0x1E,0xDE,0xDF,0x1F,0xDD,0x1D,0x1C,0xDC,
&&0x14,0xD4,0xD5,0x15,0xD7,0x17,0x16,0xD6,0xD2,0x12,0x13,0xD3,0x11,0xD1,0xD0,0x10,
&&0xF0,0x30,0x31,0xF1,0x33,0xF3,0xF2,0x32,0x36,0xF6,0xF7,0x37,0xF5,0x35,0x34,0xF4,
&&0x3C,0xFC,0xFD,0x3D,0xFF,0x3F,0x3E,0xFE,0xFA,0x3A,0x3B,0xFB,0x39,0xF9,0xF8,0x38,
&&0x28,0xE8,0xE9,0x29,0xEB,0x2B,0x2A,0xEA,0xEE,0x2E,0x2F,0xEF,0x2D,0xED,0xEC,0x2C,
&&0xE4,0x24,0x25,0xE5,0x27,0xE7,0xE6,0x26,0x22,0xE2,0xE3,0x23,0xE1,0x21,0x20,0xE0,
&&0xA0,0x60,0x61,0xA1,0x63,0xA3,0xA2,0x62,0x66,0xA6,0xA7,0x67,0xA5,0x65,0x64,0xA4,
&&0x6C,0xAC,0xAD,0x6D,0xAF,0x6F,0x6E,0xAE,0xAA,0x6A,0x6B,0xAB,0x69,0xA9,0xA8,0x68,
&&0x78,0xB8,0xB9,0x79,0xBB,0x7B,0x7A,0xBA,0xBE,0x7E,0x7F,0xBF,0x7D,0xBD,0xBC,0x7C,
&&0xB4,0x74,0x75,0xB5,0x77,0xB7,0xB6,0x76,0x72,0xB2,0xB3,0x73,0xB1,0x71,0x70,0xB0,
&&0x50,0x90,0x91,0x51,0x93,0x53,0x52,0x92,0x96,0x56,0x57,0x97,0x55,0x95,0x94,0x54,
&&0x9C,0x5C,0x5D,0x9D,0x5F,0x9F,0x9E,0x5E,0x5A,0x9A,0x9B,0x5B,0x99,0x59,0x58,0x98,
&&0x88,0x48,0x49,0x89,0x4B,0x8B,0x8A,0x4A,0x4E,0x8E,0x8F,0x4F,0x8D,0x4D,0x4C,0x8C,
&&0x44,0x84,0x85,0x45,0x87,0x47,0x46,0x86,0x82,0x42,0x43,0x83,0x41,0x81,0x80,0x40};
unsigned short CRC16(unsigned char* puchMsg, unsigned short
usDataLen)
&&unsigned char uchCRCHi = 0xFF
&&unsigned char uchCRCLo = 0xFF
&&unsigned char uI
&&while (usDataLen--)
&&&&uIndex
= uchCRCHi^*puchMsg++;
&&&&uchCRCHi
= uchCRCLo^auchCRCHi[uIndex];
&&&&uchCRCLo
= auchCRCLo[uIndex];
&&return (uchCRCHi && 8 |
uchCRCLo) ;
void RCC_Configuration(void)
& ErrorStatus
HSEStartUpS&&
&&&//枚举变量,定义高速时钟的启动状态
RCC_DeInit();&&&&&&&&&&&&&&&&&&
//RCC系统重置,用于Debug目的
RCC_HSEConfig(RCC_HSE_ON);&&&&&&&&&&&&&&&&
//使能高速时钟源HSE&&
& HSEStartUpStatus =
RCC_WaitForHSEStartUp();&&&
//等待HSE稳定
& if(HSEStartUpStatus == SUCCESS)
FLASH_SetLatency(FLASH_Latency_2);&&&&&
&FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);&&&&&
RCC_HCLKConfig(RCC_SYSCLK_Div1);
// HCLK = SYSCLK
RCC_PCLK2Config(RCC_HCLK_Div1);
// PCLK2 = HCLK
RCC_PCLK1Config(RCC_HCLK_Div2);&&&&&&&&
///PCLK1 = HCLK/2
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
RCC_PLLCmd(ENABLE);
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET){}
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
while(RCC_GetSYSCLKSource() != 0x08){}
& RCC_APB2PeriphClockCmd( RCC_APB2Periph_USART1
|RCC_APB2Periph_GPIOA |RCC_APB2Periph_AFIO |RCC_APB2Periph_GPIOB ,
& RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,
//------------------------------------------------------------------
//函数名:void GPIO_Configuration()
//输入参数:null
//返回参数:null
//说明:GPIO初始化函数
//------------------------------------------------------------------
void GPIO_Configuration(void)
& GPIO_InitTypeDef
GPIO_InitS&&&&&//GPIO初始化结构体声明
& GPIO_InitStructure.GPIO_Pin =
GPIO_Pin_9;&&&&&&&&&
//USART1 TX
& GPIO_InitStructure.GPIO_Mode =
GPIO_Mode_AF_PP;&&&
//复用推挽输出
& GPIO_InitStructure.GPIO_Speed =
GPIO_Speed_50MHz;&&
& GPIO_Init(GPIOA,
&GPIO_InitStructure);&&&&&
& GPIO_InitStructure.GPIO_Pin =
GPIO_Pin_10;&&&&&&&&&
//USART1 RX
& GPIO_InitStructure.GPIO_Mode =
GPIO_Mode_IN_FLOATING;&&
//复用浮空输入
& GPIO_Init(GPIOA,
&GPIO_InitStructure);&&&&&&&&&&
&GPIO_InitStructure.GPIO_Pin =
GPIO_Pin_6;&
&GPIO_InitStructure.GPIO_Mode =
GPIO_Mode_Out_PP;&&
&GPIO_InitStructure.GPIO_Speed =
GPIO_Speed_50MHz;
&GPIO_Init(GPIOB, &GPIO_InitStructure);
//------------------------------------------------------------------
//函数名:void NVIC_Configuration()
//输入参数:null
//返回参数:null
//说明:NVIC初始化函数
//------------------------------------------------------------------
void NVIC_Configuration(void)
{&&&&&&&&&&&&&&
& NVIC_InitTypeDef
NVIC_InitS&&&&&&
//NVIC初始化结构体声明
VECT_TAB_RAM&&&&&&&
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
//如果程序在RAM中调试那么定义中断向量表在RAM中否则在Flash中
NVIC_SetVectorTable(NVIC_VectTab_FLASH,
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
& 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);
& NVIC_InitStructure.NVIC_IRQChannel =
TIM3_IRQn;
//设置定时器3全局中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =
//抢占优先级 1
& NVIC_InitStructure.NVIC_IRQChannelSubPriority =
//子优先级为0
& NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
& NVIC_Init(&NVIC_InitStructure);
//------------------------------------------------------------------
//函数名:void USART_Configuration()
//输入参数:null
//返回参数:null
//说明:串口初始化函数
//------------------------------------------------------------------
void USART_Configuration(void){
& USART_InitTypeDef
USART_InitS&&&&&&&&&&&&&&&&&&
//串口初始化结构体声明
& USART_ClockInitTypeDef
USART_ClockInitS
& USART_InitStructure.USART_BaudRate =
115200;&&&&&&//设置波特率为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_N&&
//无硬件流控
& USART_InitStructure.USART_Mode = USART_Mode_Rx |
USART_Mode_Tx;&&&&&//接受和发送模式都打开
USART_ClockInitStruct.USART_Clock=USART_Clock_D&&&&&
//串口时钟禁止
USART_ClockInitStruct.USART_CPOL=USART_CPOL_L&&&&&&&
//数据低电平有效
USART_ClockInitStruct.USART_CPHA=USART_CPHA_2E&&&&//配置CPHA使数据在第2个边沿的时候被捕获
USART_ClockInitStruct.USART_LastBit=USART_LastBit_D&&//
禁用最后一位,使对应的时钟脉冲不会再输出到SCLK引脚
& USART_ClockInit(USART1,
&USART_ClockInitStruct);
&&&&&//配置USART与时钟相关的设置
& USART_Init(USART1,
&USART_InitStructure);&&&&&&&//配置串口参数函数
& USART_ITConfig(USART1, USART_IT_RXNE,
ENABLE);&&&&&&
//使能接收中断
//USART_ITConfig(USART1, USART_IT_TXE,
ENABLE);&&&&//使能发送缓冲空中断
//USART_ITConfig(USART1, USART_IT_TC,
ENABLE);&&&&//使能发送完成中断
USART_ClearFlag(USART1,USART_FLAG_TC);&&&&&&&&
//清除发送完成标志位
& USART_Cmd(USART1,
ENABLE);&&&&&&&&&//使能串口1
//------------------------------------------------------------------
//函数名:void Time_Init()
//输入参数:null
//返回参数:null
//说明:定时器初始化函数
//------------------------------------------------------------------
void Time_Init(void)
& TIM_TimeBaseInitTypeDef
TIM_TimeBaseS
TIM_DeInit(TIM3);&&&&&&&&&&&&//复位TIM3定时器
& TIM_TimeBaseStructure.TIM_Period
=7999;&&&&&&&&
&//设置自动重装载寄存器锁存值,1ms溢出&&&&&&
& TIM_TimeBaseStructure.TIM_Prescaler =
8;&&&&&&//9分频&
& TIM_TimeBaseStructure.TIM_ClockDivision =
0x0;&&&&&&
//时钟分频因子
& TIM_TimeBaseStructure.TIM_CounterMode =
TIM_CounterMode_Up;&//计数器向上计数模式
&&&&&&&&&&&&
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);&&&&//写TIM3各寄存器参数
& TIM_ClearFlag(TIM3,TIM_FLAG_Update);
& TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
文件:usart.h
#ifndef _USART_H
#define _USART_H
#include "stm32f10x.h"
void RCC_Configuration(void);&&
//声明RCC初始化函数
void GPIO_Configuration(void);&&
//声明GPIO初始化函数
void NVIC_Configuration(void);&&
//声明NVIC初始化函数
void USART_Configuration(void);&&
//声明串口初始化函数
Time_Init(void);&&&&
//声明定时器初始化函数
unsigned short CRC16(unsigned char* puchMsg, unsigned short
usDataLen);
文件:stm32f103x_it.c
//需要设置串口接收中断和定时器3中断,中断时间为1ms
//------------------------------------------------------------------
//函数名:void USART1_IRQHandler(void)
//输入参数:null
//返回参数:null
//说明:串口接收中断服务
//------------------------------------------------------------------
void USART1_IRQHandler(void)
&&if(USART_GetITStatus(USART1,
USART_IT_RXNE) !=
RESET)&&&&&&&&&
//判断读寄存器是否非空
&&&GPIO_SetBits(GPIOB,GPIO_Pin_6);
&&&&rx_data[RbufCounter++]=USART_ReceiveData(USART1);&
& //接收字节到接收缓冲区
&&&&if(USART_Rsv_Status==0)
&&&&&&if(RbufCounter&1)
&&&&&&&&if(rx_data[0]==0xA5&&rx_data[1]==0x5A)&&&
//当接收到的数据帧头两个字节同时为0xA5和0x5A时
&&&&&&&&&&USART_Rsv_Status=1;
&&&&&&&&&&USART_SendData(USART1,
rx_data[0]);
&&&&&&&&else
&&&&&&&&&&rx_data[0]=rx_data[1];
&&&&&&&&&&RbufCounter=1;
&&&&&&USART_1ms_Cnt=0;
&&&&}&&&&&&&&&&&&
&&}&&&&&&&&&
//------------------------------------------------------------------
//函数名:void TIM2_IRQHandler(void)
//输入参数:null
//返回参数:null
//说明:定时器2中断服务
//------------------------------------------------------------------
void TIM2_IRQHandler(void)
//------------------------------------------------------------------
//函数名:void TIM3_IRQHandler(void)
//输入参数:null
//返回参数:null
//说明:定时器3中断服务
//------------------------------------------------------------------
void TIM3_IRQHandler(void)
&&if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET)&&&&&&&
//判断是否为定时器3溢出中断
&&&&GPIO_SetBits(GPIOB,GPIO_Pin_6);
&&&&TIM_ClearITPendingBit(TIM3,
TIM_IT_Update);&&//清中断标记
&&&&if(USART_Rsv_Status==1)
&&&&USART_1ms_Cnt++;
&&&&if(USART_1ms_Cnt&5)
&&&&&USART_SendData(USART1,0xAA);
&&&&&&USART_Rsv_Status=0;&&&&&//连续计数超过5次对USART_Rsv_Status置0,继续等待接收
&&&&&&USART_1ms_Cnt=0;&&&&&&&&
//当USART_1ms_Cnt&5时对USART_1ms_Cnt重新清零&
&&&&&&if(RbufCounter==(u16)rx_data[4]+7)&&&&&&&&&&&&&
//检验数据的完整性
//定义循环变量
&&&&&&&&int
&&&&&&&&data_length=rx_data[4];
&&&&&&&&for(i=0;i
&&&&&&&&&&data[i]=rx_data[i];
&&&&&&&&}&
&&&&&&&&CRC_data_Hi=rx_data[RbufCounter-1];
&&&&&&&&CRC_data_Lo=rx_data[RbufCounter-2];
&&&&&&&&CRC_data=CRC16((unsigned
char*)data,data_length+5);
&&&&&&&&CRC_data_Hi1=CRC_data&&8;
&&&&&&&&CRC_data_Lo1=CRC_data&0x00
&&&&&&&&&if(CRC_data_Hi==(u8)CRC_data_Hi1
&& CRC_data_Lo==CRC_data_Lo1)
&&&&&&&&&{
&&&&&&&&&&&for(j=0;rx_data[j]!='\0';j++)&&
//循环逐字输出,到结束字'\0'
&&&&&&&&&&&{&&&&&&&
&&&&&&&&&&&&&USART_SendData(USART1,
rx_data[j]);&&&&
//发送字符
&&&&&&&&&&&&&while(USART_GetFlagStatus(USART1,
USART_FLAG_TXE) == RESET)
&&&&&&&&&&&&&{
&&&&&&&&&&&&&}
//等待字符发送完毕
&&&&&&&&&&&}
&&&&&&RbufCounter=0;
&&&&}&&&&&
【】【】【】【】
上一篇:下一篇:
CopyRight @
单片机教程网
, All Rights Reservedstm32串口接收数据怎么判断有无OK - 硬件开发当前位置:& &&&stm32串口接收数据怎么判断有无OKstm32串口接收数据怎么判断有无OK&&网友分享于:&&浏览:61次stm32串口接收数据如何判断有无OK?串口1通过引脚接收到数据,我放入了一个数组之中,然后判断里面有无OK,如果有,灯就会亮,可是我的灯没有反应代码如下,各位高手帮帮忙!while(1){if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==SET)& {& RxBuffer1[RecLen1++]=USART_ReceiveData(USART1);
& while(RecLen1==100);}for(i=0;i&100;i++){if((RxBuffer1[i]=='O')&&(RxBuffer1[i+1]=='K')){GPIO_ResetBits(GPIO_LED,DS1_PIN);Delay(0x3FFFFF);}}}------解决方案--------------------串口使用中断来接收数据的,没有使用查询的办法来做的,每接收到一个字节,数组指针加1
------解决方案--------------------这样的协议不好。。。至少也要知道什么时候是数据的开始和结束,你才好在期间找吧?
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有用DMA方式从串行USART口连续接收数据,怎样确认收到一个完整的包。 - STM32 - 意法半导体STM32/STM8技术社区
后使用快捷导航没有帐号?
查看: 6050|回复: 11
用DMA方式从串行USART口连续接收数据,怎样确认收到一个完整的包。
在线时间0 小时
主题帖子好友
新手上路, 积分 20, 距离下一级还需 30 积分
新手上路, 积分 20, 距离下一级还需 30 积分
&span style=&font-size: &&&span style=&font-family: 宋体; &&我用DMA方式从USART口接收数据,转存到缓存中,缓存大小为255,实际接收数据每包
在线时间57 小时
主题帖子好友
高级会员, 积分 943, 距离下一级还需 57 积分
高级会员, 积分 943, 距离下一级还需 57 积分
RE:用DMA方式从串行USART口连续接收数据,怎样确认收到一个完整的包。
这个数据包格式你自己能控制吗?也就是你自己定义的吗?如果是,那就容易一些,在包结束最后一个字节增加标示符,随便定义一个字符都行。
根据包结束符,来判定一次DMA接收。
2、如果这个数据包是字符串,根据判定结束字符0x0d,0x0a字符来启动下一次DMA接收。
3、系统给定数据包,一般这样的数据包格式都比较固定。
这样需要判定每次结束符,来启动下一次DMA转换。
思路就是:根据接收到的字符最后一个或两个字节内容来判定结束标记。
在线时间1 小时
主题帖子好友
金牌会员, 积分 1042, 距离下一级还需 3958 积分
金牌会员, 积分 1042, 距离下一级还需 3958 积分
RE:用DMA方式从串行USART口连续接收数据,怎样确认收到一个完整的包。
楼上说的比较好,
1、就是自定顶一个协议, 启动和停止用一个特定字符串来表示;如5A5A5A5A表示启动,A5A5A5A5表示停止。发送时以启动开头,以停止结尾,接收时可以检查。
2、发送一个字符串,第一个字节表示发送数据段的长度,紧接着是数据的内容; 接收时就可以知道数据接受完了没有。
很多协议都是这么实现的,比较常见的如USB协议的描述符实现
在线时间4 小时
主题帖子好友
初级会员, 积分 61, 距离下一级还需 139 积分
初级会员, 积分 61, 距离下一级还需 139 积分
RE:用DMA方式从串行USART口连续接收数据,怎样确认收到一个完整的包。
如果没有特殊的结束字符串很难办的,有的话按1楼方法做就行
在线时间5 小时
主题帖子好友
金牌会员, 积分 1339, 距离下一级还需 3661 积分
金牌会员, 积分 1339, 距离下一级还需 3661 积分
回复:用DMA方式从串行USART口连续接收数据,怎样确认收到一个完整的包。
上层可以自己封装一下,做一个包头一个结束
在线时间2 小时
主题帖子好友
中级会员, 积分 445, 距离下一级还需 55 积分
中级会员, 积分 445, 距离下一级还需 55 积分
RE:用DMA方式从串行USART口连续接收数据,怎样确认收到一个完整的包。
还是不建议LZ使用DMA接收, 接收最好使用中断方式, 这样易控制些。
在线时间2 小时
主题帖子好友
中级会员, 积分 445, 距离下一级还需 55 积分
中级会员, 积分 445, 距离下一级还需 55 积分
RE:用DMA方式从串行USART口连续接收数据,怎样确认收到一个完整的包。
还是不建议LZ使用DMA接收, 接收最好使用中断方式, 这样易控制些。
在线时间12 小时
主题帖子好友
金牌会员, 积分 1821, 距离下一级还需 3179 积分
金牌会员, 积分 1821, 距离下一级还需 3179 积分
RE:用DMA方式从串行USART口连续接收数据,怎样确认收到一个完整的包。
其实很简单的,发送的包分成两种,比如包A和包B,其中包B是你要发送的数据,包A只是包B的字节数目,而且包A的长度是固定的。每次都首先发送包A告之接收方包B的长度,然后再发送包B,如此一直下去就可以了。这是用DMA发送和接收不定长包的最好方式。其它的方法都太过复杂,操作性不强。
在线时间57 小时
主题帖子好友
高级会员, 积分 943, 距离下一级还需 57 积分
高级会员, 积分 943, 距离下一级还需 57 积分
回复:用DMA方式从串行USART口连续接收数据,怎样确认收到一个完整的包。
回复第 8 楼 于 20:00:45发表:
其实很简单的,发送的包分成两种,比如包A和包B,其中包B是你要发送的数据,包A只是包B的字节数目,而且包A的长度是固定的。每次都首先发送包A告之接收方包B的长度,然后再发送包B,如此一直下去就可以了。这是用DMA发送和接收不定长包的最好方式。其它的方法都太过复杂,操作性不强。
你说的是一个完整的串口通信协议格式,原理是一样的,
自定义的串口通信协议一般都是这样:
+数据大小+ 数据内容+校验码+结束符
这种格式是串口通信最稳定的方法之一。
在线时间0 小时
主题帖子好友
新手上路, 积分 20, 距离下一级还需 30 积分
新手上路, 积分 20, 距离下一级还需 30 积分
RE:用DMA方式从串行USART口连续接收数据,怎样确认收到一个完整的包。
谢谢各位大侠,我先和上位机协商一下,价格结束符试试。
站长推荐 /2
Tel: 3-8064
备案号: 苏ICP备号-2
|||意法半导体STM32/STM8技术社区
Powered by

我要回帖

更多关于 oppo手机支持tf卡吗 的文章

 

随机推荐