stm32stm32 串口发送送数据问题

温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
Enables or disables the specified USART interrupts.
USARTx: where x can be 1 or 2 to select the USART peripheral.
USART_IT: specifies the USART interrupt sources to be enabled or disabled.
This parameter can be one of the following values:
@arg USART_IT_WU:
Wake up interrupt.
//唤醒中断
@arg USART_IT_CM:
Character match interrupt.//字符匹配中断
@arg USART_IT_EOB:
End of block interrupt.
//块结束中断
@arg USART_IT_RTO:
Receive time out interrupt.
//接收超时中断
@arg USART_IT_CTS:
CTS change interrupt.
//CTS变化中断
@arg USART_IT_LBD:
LIN Break detection interrupt.
//终止检测中断
@arg USART_IT_TXE:
Tansmit Data Register empty interrupt.
//发送数据寄存器空中断
@arg USART_IT_TC:
Transmission complete interrupt.
//发送完成中断
@arg USART_IT_RXNE:
Receive Data register not empty interrupt.
//接收寄存器非空中断
@arg USART_IT_IDLE:
Idle line detection interrupt.
//空闲线检测中断
@arg USART_IT_PE:
Parity Error interrupt.
//奇偶校验错误中断
@arg USART_IT_ERR:
Error interrupt(Frame error, noise error, overrun error)
//错误中断
NewState: new state of the specified USARTx interrupts.
This parameter can be: ENABLE or DISABLE.
* @retval None
*/首先把数据手册的这部分内容贴出来Character transmission procedure1. Program the M bits in USARTx_CR1 to define the word length.2. Select the desired baud rate using the USARTx_BRR register.3. Program the number of stop bits in USARTx_CR2.4. Enable the USART by writing the UE bit in USARTx_CR1 register to 1.5. Select DMA enable (DMAT) in USARTx_CR3 if Multi buffer Communication is to take&place. Configure the DMA register as explained in multibuffer communication.6. Set the TE bit in USARTx_CR1 to send an idle frame as first transmission.7. Write the data to send in the USARTx_TDR register (this clears the TXE bit). Repeat&this for each data to be transmitted in case of single buffer.&8. After writing the last data into the USARTx_TDR register, wait until TC=1. This&indicates that the transmission of the last frame is complete. This is required for&instance when the USART is disabled or enters the Halt mode to avoid corrupting the&last transmission.字符传输过程&1。方案中USARTx_CR1的M位来定义字长。&2。选择所需的波特率使用USARTx_BRR寄存器。&3。计划在USARTx_CR2停止位的数目。&4。通过写寄存器1 USARTx_CR1在UE位使能USART的。&5。选择DMA使能(DMAT)在USARTx_CR3如果多缓冲器通信是采取&地方。配置DMA寄存器在多缓冲器通信解释。&6。设置在USARTx_CR1的TE位发送空闲帧作为第一次传输。&7。写入要发送的数据在USARTx_TDR寄存器(这将清除TXE位)。重复&这对每个数据进行的情况下单个缓冲器的传输。&8。写在最后一个数据到USARTx_TDR寄存器后,等到TC=1。这&表示最后帧的传输完成。这是必需的&例如当USART被禁用或进入暂停模式,以避免破坏&最后一次传输。首先仔细看看这个发送的数据时序图。发现,USART_TDR没有数据的时候,也就是空,TXE会被置位,当往USART_TDR写数据的时候,TXE低列出TXE,TCflag变化的条件TXE:只要USART_TDR没有数据就被置位TCflag:只有TXline数据全部发送出去才会中断。发送过程:往USART_TDR里面写数据-&TXline往外发送。也就是TCflag置位会晚于TXEflag一个字符的时间。字符传输过程&(转)1、 使能串口发送TE,此时USART_DR为空,此时应查询TXE是否置1,TXE置1,TX脚先发送一个空闲帧,把F1帧写入USART_DR,TXE被清零。因为这时正在发送空闲帧,所以写入USART_DR的数据被放入TDR寄存器,还没有拷贝到移位寄存器。2、 在空闲帧发送完后,TDR寄存器中的数据被拷贝到移位寄存器,此时应查询TXE是否置1,TXE置1,表示TDR已空,可以放入下一个数据。此时在TX脚上将会发送F1帧的数据,同时软件把F2帧的数据写入USART_DR,TXE被清零。3、 在F1帧的停止位发送完后,因为TDR寄存器中的F2还没被拷入移位寄存器,所以此时TXE仍为0,TC不置1.此时应查询TXE是否置1,TXE置1,表示TDR已空,可以放入下一个数据。此时在TX脚上将会发送F2帧的数据,同时软件把F3帧的数据写入USART_DR,TXE被清零。4、 在F2帧的停止位发送完后,因为TDR寄存器中的F3还没被拷入移位寄存器,所以此时TXE仍为0,TC不置1.此时应查询TXE是否置1,TXE置1,表示TDR已空,后面没有数据写入USART_DR,TXE保持高电平,此时在TX脚上将会发送F3帧的数据。5、 在F3帧的停止位发送完后,因为此时TXE为1,所以TC标志会置1.如果TCIE为1,将会产生中断。串口发送注意几点:1、 如果正在发送数据,写数据进USART_DR将会把数据写到TDR缓冲寄存器,在本次发送完成后,再把TDR中的数据拷贝进移位寄存器。2、 如果当前没有发送数据,写数据进USART_DR将会把数据直接放到移位寄存器,不经过TDR,TXE被清零,然后发送开始,TXE被硬件置1。3、 只有当一帧数据的停止位发送完成并且TXE为1,TC才会被置1
阅读(9201)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
在LOFTER的更多文章
loftPermalink:'',
id:'fks_',
blogTitle:'STM32串口发送数据详解',
blogAbstract:'串口的中断方式:/**
Enables or disables the specified USART interrupts.
USARTx: where x can be 1 or 2 to select the USART peripheral.
USART_IT: specifies the USART interrupt sources to be enabled or disabled.
This parameter can be one of the following values:
@arg USART_IT_WU:
Wake up interrupt.
//唤醒中断',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:5,
publishTime:5,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:1,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'0',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。查看: 4407|回复: 7
求各位大神指点迷津~stm32 USART1串口发送数据问题
马上注册,结交更多好友,享用更多交流,硬件的世界向你敞开大门!
才可以下载或查看,没有帐号?
本帖最后由 wangmumu2014 于
10:04 编辑
stm32 USART1串口发送数据,用PC机串口助手接受数据与发送的不一致。发送的是“1,2,3,4,5,6,7,8,9”,接收到的是“F6,F2,EE,EA,E6,E2,DE,DA,FA”。程序如下,困扰小弟好久了,真诚的求各位大神指点迷津~/* Includes ------------------------------------------------------------------*/
#include &stm32f10x.h&
#include &stdio.h&
#include &io.h&
//#include &OLED.h&
#include &math.h&
/* Private functions ---------------------------------------------------------*/
char sheng[]={1,2,3,4,5,6,7,8,9};
uint8_t i=0;
uint8_t j=0;
void USART_Config(void)
& && &&&USART_InitTypeDef USART_InitS
& && && &USART_InitStructure.USART_BaudRate = 19200;& && && && && && && && && && && && && && && && && && && && && && && && && && && &//设置串口通信的波特率
& && && &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_Init(USART1,&USART_InitStructure);
& && && &USART_ITConfig(USART1,USART_IT_TC,ENABLE);
& && && &USART_Cmd(USART1,ENABLE);//开启USART1
void NVIC_Config()
& & NVIC_InitTypeDef NVIC_InitS
& & NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);& && && && && && && && & //选择中断分组0
& & NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;& && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && &//选择串口1中断
& & NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;& && && && && && && &//抢占式中断优先级设置为0
& & NVIC_InitStructure.NVIC_IRQChannelSubPriority=4;& && && && && && && && && &&&//响应式中断优先级设置为4
& & NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;& && && && && && && && &//使能中断
& & NVIC_Init(&NVIC_InitStructure);
void USART_Baud(uint32_t pclk2,uint32_t baud)& &//pclk2=32M
& && &&&uint16_
& && &&&uint16_
& && &&&temp = (float)(pclk2*1000000)/(baud*16);
& && &&&mantissa =
& && &&&fraction = (temp-mantissa)*16;
& && &&&mantissa = mantissa&&4;
& && &&&USART1-&BRR = mantissa +
void USART0_SendByte(uint8_t Data)
&&while (!(USART1-&SR & USART_FLAG_TXE));
&&USART1-&DR = (Data & (uint16_t)0x01FF);
void USART1_IRQHandler(void)
if( USART_GetITStatus(USART1, USART_IT_TC) != RESET )
& &&&if(i&9)
& && && && && &&&{
& && && && && && &USART0_SendByte(sheng);
& && && && && && &for(j=0;j&100;j++);
& && && && && && &i++;
& && && && && &&&}
& && && && && &&&{
& && && && && && &i=0;
& && && && && && &USART0_SendByte(sheng);&&
& && && && && &&&for(j=0;j&100;j++);&&
& && && && && && & i++;& && && && && && && && &
& && && && && && &}
int main(void)
& && &&&GPIO_InitTypeDef GPIO_InitS& && && && && &&&
& && &&&RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
& && & RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA&&|&&RCC_APB2Periph_AFIO, ENABLE);& && && && && &
& && &&&/*串口*/
& && &&&GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
& && &&&GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
& && &&&GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//推免输出TX
& && &&&GPIO_Init(GPIOA, &GPIO_InitStructure);
& && &&&GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
& && &&&GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
& && &&&GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入RX
& && &&&GPIO_Init(GPIOA, &GPIO_InitStructure);
& && &&&SystemInit();
& && &&&USART_Config();
& && && &NVIC_Config();& && &&&
& && & USART_Baud(32,19200);
& && &&&while(1)
& &while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);
求大神指点啊~~~~
直接在已经写好的例子里面改下吧
您好,您有好使的例子吗?可以给我发一下吗?非常感谢&
nibutaiguai 发表于
直接在已经写好的例子里面改下吧
您好,您有好使的例子吗?可以给我发一下吗?非常感谢
你这是STM32什么型号呀,是用串口助手接收的吗,是不是有个16进制显示的,你给勾上啦。串口的程序论坛里有好多呢,楼主找找就好啦
stm32F101C6
是用串口助手接收,怎么弄都不好使,急死了&
绚紫飞鸥 发表于
你这是STM32什么型号呀,是用串口助手接收的吗,是不是有个16进制显示的,你给勾上啦。串口的程序论坛里有 ...
stm32F101C6
是用串口助手接收,怎么弄都不好使,急死了
建议楼主找个好使的例程,对一下,看是不是哪里没有配置好,还可以用示波器看一下输出和你发送的一不一样,波特率什么的都对不对,祝你成功
资源帖里面有,论坛里面有很多啊
地址:辽宁省大连市高新园区火炬路7号17层 QQ:
Copyright (C)
All Rights Reserved.查看: 5746|回复: 39
STM32串口接收不定长数据原理与源程序
今天说一下STM32单片机的接收不定长度字节数据的方法。由于STM32单片机带IDLE中断,所以利用这个中断,可以接收不定长字节的数据,由于STM32属于ARM单片机,所以这篇文章的方法也适合其他的ARM单片机。
IDLE中断什么时候发生?
IDLE就是串口收到一帧数据后,发生的中断。什么是一帧数据呢?比如说给单片机一次发来1个字节,或者一次发来8个字节,这些一次发来的数据,就称为一帧数据,也可以叫做一包数据。
如何判断一帧数据结束,就是我们今天讨论的问题。因为很多项目中都要用到这个,因为只有接收到一帧数据以后,你才可以判断这次收了几个字节和每个字节的内容是否符合协议要求。
看了前面IDLE中断的定义,你就会明白了,一帧数据结束后,就会产生IDLE中断。这个中断真是太TMD有用了。省去了好多判断的麻烦。
如何配置好IDLE中断?
下面我们就配置好串口IDLE中断吧。
%E4%B8%B2%E5%8F%A3%E6%8E%A5%E6%94%B6%E5%A4%9A%E5%AD%97%E8%8A%821.png (21.35 KB, 下载次数: 38)
23:11 上传
这是串口CR1寄存器,其中,对bit4写1开启IDLE中断,对bit5写1开启接收数据中断。(注意:不同系列的STM32,对应的寄存器位可能不同)
(RXNE中断和IDLE中断的区别?
当接收到1个字节,就会产生RXNE中断,当接收到一帧数据,就会产生IDLE中断。比如给单片机一次性发送了8个字节,就会产生8次RXNE中断,1次IDLE中断。)
%E4%B8%B2%E5%8F%A3%E6%8E%A5%E6%94%B6%E5%A4%9A%E5%AD%97%E8%8A%822.png (19.34 KB, 下载次数: 40)
23:11 上传
这是状态寄存器,当串口接收到数据时,bit5就会自动变成1,当接收完一帧数据后,bit4就会变成1.
需要注意的是,在中断函数里面,需要把对应的位清0,否则会影响下一次数据的接收。比如RXNE接收数据中断,只要把接收到的一个字节读出来,就会清除这个中断。IDLE中断,如何是F0系列的单片机,需要用ICR寄存器来清除,如果是F1系列的单片机,清除方法是“先读SR寄存器,再读DR寄存器”。(我怎么知道?手册上写的)
下面以STM32F103为例给出源程序。
我们先来看程序中的主要部分。
串口初始化函数片段
%E7%A9%BA%E9%97%B2%E4%B8%AD%E6%96%AD.png (17.99 KB, 下载次数: 55)
23:11 上传
如果你原来的串口初始化函数具有打开串口接收中断的话,实际上就是在初始化函数中多了一条打开空闲中断的语句。
串口中断函数
%E7%A9%BA%E9%97%B2%E4%B8%AD%E6%96%AD2.png (25.9 KB, 下载次数: 46)
23:11 上传
串口中断函数里面,最重要的两条语句,就是上图中圈出来的两条语句。第一条语句用来判断是否接收到1个字节,第二条语句用来判断是否接收到1帧数据。(是不是感觉超级方便?妈妈再也不用担心我如何判断是否接收完1帧数据了。)
%E7%A9%BA%E9%97%B2%E4%B8%AD%E6%96%AD3.png (19.36 KB, 下载次数: 44)
23:11 上传
我写的这个主函数,是用来验证接收的正确性的。RxCounter表示的是这一帧数据有几个字节,接收完一帧数据,会在中断函数里面把ReceiveState置1,然后,通过串口把接收到的数据发送回串口。这样,既验证了接收了多少字节的正确性,又验证了接收到的数据是否正确。
%E7%A9%BA%E9%97%B2%E4%B8%AD%E6%96%AD4.png (26.1 KB, 下载次数: 36)
23:11 上传
上图是结果验证。
点击下载源程序:
(2.25 MB, 下载次数: 187)
23:11 上传
点击文件名下载附件
下载积分: 黑币 -5
& && && && && && && && && && && && && &
& && && && && && && && && && &&&我是瑞生,毫无保留的给大家透露电子设计经验,不定时分享实用的落地的电子设计技巧,希望能够帮助到大家。& &
/**
&&******************************************************************************
&&* @file& & 串口接收不定长字节数据
&&* @author&&瑞生
&&* @version V1.0
&&* @date& &
&&* @brief& &Main program body
&&******************************************************************************
&&******************************************************************************
&&*/&&
/* Includes ------------------------------------------------------------------*/
#include &stm32f10x.h&
#include &uart.h&
volatile uint8_t aRxBuffer[100]={0x00};
volatile uint8_t RxCounter=0;
volatile uint8_t ReceiveState=0;
/**
&&* @brief&&Main program.
&&* @param&&None
&&* @retval None
&&*/
int main(void)
{
& & & & uint8_t i=0;
& & & &
& & & & USART1_Init();
& & & &
&&while (1)
&&{
& & & & & & & & if(ReceiveState==1)//如果接收到1帧数据
& & & & & & & & {
& & & & & & & & & & & & ReceiveState=0;
& & & & & & & & & & & & i=0;
& & & & & & & & & & & & while(RxCounter--)// 把接收到数据发送回串口
& & & & & & & & & & & & {
& & & & & & & & & & & & & & & & USART_SendData(USART1, aRxBuffer[i++]);& & & &
& & & & & & & & & & & & & & & & while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
& & & & & & & & & & & & }
& & & & & & & & & & & & RxCounter=0;
& & & & & & & & }
&&}
}
 好详细的帖子,谢谢lz
 程序下来试了,IDLE进不了啊!
这两天正在琢磨STM32F103的串口中断处理程序,之前以为只能一个字节一个字节接收,多谢楼主提醒还有IDLE这个帧数据接收,大爱啊!
这两天正在琢磨STM32F103的串口中断处理程序,之前以为只能一个字节一个字节接收,多谢楼主提醒还有IDLE这个帧数据接收,大爱啊!
谢谢楼主的分享,太赞了,终于解决我这个不定长GPS信息的接收问题了,赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞
程序下来试了,IDLE进不了啊!
你进不了吗?我就是参考了 这个思想,很棒啊!你看看是不是板子的型号不对,他这是F1的,修改程序,和你的板子相称
感觉挺不错,之前还有个什么串口延时处理,要是这个能用的话都不用那么麻烦了
赞,解决了我的问题
太感谢楼主了
谢谢楼主分享,帮了大忙。。。。。。。
正在学这个,给点赞楼主
为什么最后串口发送的数据总是有个别数据丢失了呢?
楼主,为什么最好发送的数据总是有个别的数据丢失了呢?
楼主,波特率为9600的时候数据是正确的,当波特率设置为115200时,数据就不正确了,为什么呢?
真心是太TMD有用了
大家好,我是新来的,就像楼主说的方法我也试了,只不过是用的UART4,在发送的时候也是有数据丢失,是什么原因呢
zhichizhichi
非常谢谢。
好东西,谢谢!
好东西,学习了。
非常有用,modbus可以用上 前面说的9600可以有这个情况吗
谢谢楼主的分享,太赞了
很好,学习学习!
一直在找方法到底怎么做!!!!!!!!!!!!
真心的良心帖子
强!!!!为;楼主的态度点赞!!
谢谢楼主的分享,太赞了
不错,支持
继续顶,终于有黑币可以下载了
感谢楼主教诲
好贴&&推荐
正好需要串口传速大量的数据,不知道速度跟不跟得上
嗯,不错不错,我之前还是使用流控制界定帧的,移植性好一点,但是既然STM32自带这个功能那为何不用呢,
 兄弟,为什么我参考你的这个程序,串口助手发送11 22 33 44 55时,单片机接收出现FF 11 22 33 44 55
Powered by温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
由毕业设计程序中的一个小BUG引出此问题。程序中当串口接收到一帧数据后(这一帧数据是已知的,包括内容和字节数),需要判断接收到的数据是否为想要的数据。当接收到的数据长度大于想要的帧时,能判断数据是错误的,但是,当收到的数据正好为想要的数据的前一部分的时候,程序就会出现错误了。因为程序中串口中断是这样处理的
SMS_Remind.Buffer[SMS_Remind.Length++]=LuB_SMS;
if(SMS_Remind.Length==17)//如果SMS_Remind.Length&17的话,不能判断接收到的数据错误
if(Check_SMS_Remind()==SUCCESS){SMS_Remind.Active=1;}//短信提醒接收完毕
else{SMS_Init();}
}后来就想到了用在串口中断中循环接收数据+延时判断的方法解决此问题,如果接收到了第一字节的数据,会触发串口中断,进入中断后关闭串口接收中断,用while循环+延时判断接收数据,一旦数据长度达到17或者延时时间到,就结束接收,初始化接收buffer,开串口中断,等待下一次数据的到来。开始的时候在网上找了很多与“在STM32串口中断中循环接收数据”相关的帖子和资料,发现网友们也遇到过这个问题,但很少有解决的。甚至还有的网友说,这是ST公司的一个硬伤。所以开始自己写程序、调试。开始的时候用库函数写的,最多也就能接收2个字节,之后的就不能正确接收了。后来改用寄存器操作的方法,问题才得以解决,亲自测试了在串口中断中循环接收9000字节数据,没有任何问题。下面贴出测试代码(不包括延时判断):void USART1_IRQHandler(void){
USART1-&CR1&=~(1&&2);//关接收中断 do {
if((USART1-&SR&USART_FLAG_RXNE))//检测接收中断标志位是否置位
USART1-&SR&=~(1&&5);//清中断标志位
USART_1.Buffer[t++]=USART1-&DR;
} }while(i==9000); if(t==9000){USART_1.Active=1;}//主循环中用于发送接收buffer中数据的标志 USART1-&CR1|=1&&2;//开接收中断 }&
阅读(2674)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_',
blogTitle:'关于在STM32串口中断中循环接收数据(程序有问题,先保留)',
blogAbstract:'由毕业设计程序中的一个小BUG引出此问题。程序中当串口接收到一帧数据后(这一帧数据是已知的,包括内容和字节数),需要判断接收到的数据是否为想要的数据。当接收到的数据长度大于想要的帧时,能判断数据是错误的,但是,当收到的数据正好为想要的数据的前一部分的时候,程序就会出现错误了。因为程序中串口中断是这样处理的\t\tSMS_Remind.Buffer[SMS_Remind.Length++]=LuB_SMS;\t',
blogTag:'',
blogUrl:'blog/static/9',
isPublished:1,
istop:false,
modifyTime:9,
publishTime:4,
permalink:'blog/static/9',
commentCount:1,
mainCommentCount:1,
recommendCount:2,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}

我要回帖

更多关于 stm32 串口发送 的文章

 

随机推荐