你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

蓝牙串口接受18位数据(包含包头1、包尾1、校验1)错位

[复制链接]
红尘雪 提问时间:2024-10-13 17:05 / 未解决

问题描述

理想接受16进制数据10进制显示包头为第1个字节0xA5包尾为最后一个字节0x5A校验位为倒数第二位0xF2.image.png

实际上有时会发生错位现象:(第一张是正常的,大概有一半时间出现下面的现象)

image.pngimage.pngimage.png


上位机及信息接收:

蓝牙接收到的信息已经使用串口助手查看过了,为

A5 1D 00 00 4A 01 4A01 32 00 3C 00 1D 00 B4 00 F2 5A 无误。

蓝牙和cubemx波特率均设置为了·115200bit/s,应该不存在数据接收被其他中断打断的情况。一个字节是10位,那么10ms可以传输115.2个字节,而我这里为18个字节。image.png

代码情况:

数组定义:

stm32f1xx_it.c 文件中定义了 uint8_t Rx_Buff[18]数组用于接收;

主函数中声明了数组为外部变量 extern uint8_t Rx_Buff[18];

主函数while(1)前开启了串口接收中断函数 HAL_UART_Receive_IT(&huart3,Rx_Buff,18);image.png

串口中断函数 void USART3_IRQHandler(void)中再次开启了串口接收中断函数 HAL_UART_Receive_IT(&huart3,Rx_Buff,sizeof(Rx_Buff)); 函数

image.png

我觉得这里不应该开,因为当所有字节接受完成之后将会进入回调函数,那么我只要在回调函数里再次打开接收函数HAL_UART_Receive_IT(&huart3,Rx_Buff,18);不就行了。但经过实践发现(串口中断函数void USART3_IRQHandler(void)中不开启HAL_UART_Receive_IT(&huart3,Rx_Buff,18)将只能接收到第一个数据0xA5

image.png

回调函数:

回调函数 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)中再次打开接收函数``HAL_UART_Receive_IT(&huart3,Rx_Buff,18);以使得串口接受完18位数据后再次进行接收。

但就像上面写的一样,不在串口中断函数``void USART3_IRQHandler(void)中打开HAL_UART_Receive_IT(&huart3,Rx_Buff,sizeof(Rx_Buff)); 将只能接收到第一个数据0xA5


2024.10.13 19:00更新:

经过测试发现

将数据发送方式改为有更改才发送(之前为定时发送),再次测试。发现问题出在回调函数不能次次进入,也就是每次接收到的数据不一定为18位导致回调函数无法进入,于是接收函数无法开启导致数据不能形成循环。

这要怎么解决,求大神解答👀️ 👀️ 👀️


2024.10.13 11:50更新:

问题出在:

外部中断和串口中断设置的抢占和响应优先级一致,那么若同时发生则将会按照默认中断优先级执行外部中断,当串口信号传输到了一半时外部中断执行完成,那么将会导致导致串口所接收的数据不完全(不为18位),导致无法进入回调函数,也就无法再次开启串口接收中断函数。

image.png
image.png
image.png
image.png
收藏 评论0 发布时间:2024-10-13 17:05

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版