专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
STM32
串口中断接收如何判断数组接收完毕呢?
2019-08-18 21:22
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
STM32/STM8
15258
19
1447
串口中断接收如何判断数组接收完毕呢?开发板上的例程是是判断最后2个字节是0x0A,0x0D, 而我接收到得数据最后2位就是实际的数值。0x00 ,0x23, 或者0x00 ,0x37 这样不确定的数值,怎么判断数组接收结束了?是最后一个接收到的是' ' 吗?
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
19条回答
justin2
2019-08-21 09:56
可以参考下mosbus协议,判断一帧数据完成就是超时3.5个字符,
需要使用的资源 :定时器1个,串口接收中断,一个接收数组unsigned char【】,1个数组索引unsigned char
步骤
1,初始化定时器,计算溢出时间,modbus是3.5个字符间隔9600大概3.5ms,可以根据自己的需求,
2,初始化USART,打开接收中断
3,在USART接收中断中 接收数据保存在接收缓冲区中, ReadBuffer[Index]=USART_ReceiveData(USART1);
然后Inedx++,启动定时器,TIM的Count置0(TIM重新开始)
4,在定时器中断函数中处理信息,当定时器中断时,表示已经3.5个字符的时间没收到数据了,可以认为接收完成了,最后Index索引置0,准备接收下一帧数据。
参考代码
void USART1_IRQHandler()
{
if(USART_GetITStatus(USART1,USART_IT_RXNE))
{
USART_ClearITPendingBit(USART1,USART_IT_RXNE);
ReadBuffer[Index]=USART_ReceiveData(USART1);
Index++;
TIM_SetCounter(TIM2,0);
TIM_Cmd(TIM2,ENABLE);
}
}
void TIM2_IRQHandler()
{
if(TIM_GetITStatus(TIM2,TIM_IT_Update))
{
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
TIM_Cmd(TIM2,DISABLE);
Index=0;
处理ReadBuffer接收到的数据
}
}
加载中...
查看其它19个回答
一周热门
更多
>
相关问题
STM32F4上I2C(在PROTEUS中模拟)调试不通的问题
6 个回答
芯片供应紧张,准备换个MCU,MM32L系列替换STM32L系列的怎么样?
7 个回答
STM32同时使用两个串口进行数据收发时数据丢包的问题
5 个回答
STM32F103串口通信死机问题
4 个回答
STM32WLE5CC连接SX1268在LoRa模式下能与 SX1278互通吗?
2 个回答
相关文章
ST公司第一款无线低功耗单片机模块有效提高物联网设计生产效率
0个评论
如何实现对单片机寄存器的访问
0个评论
通过USB用STM32片内自带Bootloader下载程序及注意事项
0个评论
欲练此功必先自宫之STM32汇编启动,放慢是为了更好的前行
0个评论
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
STM32
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
需要使用的资源 :定时器1个,串口接收中断,一个接收数组unsigned char【】,1个数组索引unsigned char
步骤
1,初始化定时器,计算溢出时间,modbus是3.5个字符间隔9600大概3.5ms,可以根据自己的需求,
2,初始化USART,打开接收中断
3,在USART接收中断中 接收数据保存在接收缓冲区中, ReadBuffer[Index]=USART_ReceiveData(USART1);
然后Inedx++,启动定时器,TIM的Count置0(TIM重新开始)
4,在定时器中断函数中处理信息,当定时器中断时,表示已经3.5个字符的时间没收到数据了,可以认为接收完成了,最后Index索引置0,准备接收下一帧数据。
参考代码
void USART1_IRQHandler()
{
if(USART_GetITStatus(USART1,USART_IT_RXNE))
{
USART_ClearITPendingBit(USART1,USART_IT_RXNE);
ReadBuffer[Index]=USART_ReceiveData(USART1);
Index++;
TIM_SetCounter(TIM2,0);
TIM_Cmd(TIM2,ENABLE);
}
}
void TIM2_IRQHandler()
{
if(TIM_GetITStatus(TIM2,TIM_IT_Update))
{
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
TIM_Cmd(TIM2,DISABLE);
Index=0;
处理ReadBuffer接收到的数据
}
}
一周热门 更多>