完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
[C] 纯文本查看 复制代码
//串口接收缓存区 u8 USART2_RX_BUF[USART2_MAX_RECV_LEN]; //接收缓冲,最大USART2_MAX_RECV_LEN个字节.u16 USART2_RX_STA=0; void USART2_IRQHandler(void){u8 res; if(USART_GetiTStatus(USART2, USART_IT_RXNE) != RESET)//接收到数据 接收到以0x0d,0x0a作为结尾的数据{ USART_ClearITPendingBit(USART2,USART_IT_RXNE);res =USART_ReceiveData(USART2); //读取一字节的数据if((USART2_RX_STA&(1<<15))==0)//接收完的一批数据,还没有被处理,则不再接收其他数据 (1<<15)即0x8000{ if(USART2_RX_STA 现在的情况是,能收到50个字节,但是这50个字节的数据,前20个字节的正确,最后10个字节也正确,中间的20个字节数据是把正常数据的最后20个字节填进来了。 |
|
相关推荐
16个回答
|
|
我觉得最好不要再接收中断里面做数据处理,对于分包的数据.可以做一个类似循环队列的处理.采用DMA+空闲中断的方式更节省CPU资源,每次进入空闲中断后将接收到的数据全部丢到队列里面,主函数里面只需要不停的解析队列里面的数据就可以了!
|
|
|
|
这个自己多想想吧,很简单的。
|
|
|
|
原子哥,我还是没想明白,我每接收一个字节,数组角标就+1,不应该会存在到接收完成后,把我最后10个字节的数据填充到第20-30个字节的位置上啊。
我可能钻进死角了,还望原子哥指点一下。 |
|
|
|
大神们都不屑这个问题么?还是木有回答
|
|
|
|
精简代码,测试。
比如你把你安卓发过来的,直接printf输出到电脑,或者直接用你的电脑串口接你的蓝牙模块。 测试下,看看原始数据对不对先 然后剩下的解析数据,实在没什么好说的。 C语言基础问题,不懂就学。 |
|
|
|
需要分包发送吧
|
|
|
|
就是使用printf打印出来的,是错的;这么说的话有可能是安卓那边分包发送有问题了?
|
|
|
|
安卓端蓝牙自动分包发送的,我这边接收
|
|
|
|
不是吧, 你看一下安卓后台的数据应该全部发出来了,蓝牙通信最大字节20个,接收时分段接收组包就行
|
|
|
|
|
|
|
|
|
|
|
|
你得确定你是从第一个开始存起的。如果你一开始就是20了,有什么奇怪?
|
|
|
|
你说的这种方式我试过。DMA那种效果一样,此外接收中断不做数据处理,只是单纯的将数据存储到数组中,结果仍然一样。
|
|
|
|
确定,前20和后20都正确,就中间10个错误。因为我每次接收前都是角标清0,然后等到接收完成,将数据转移走后,又清0,为下一次接收作准备。
|
|
|
|
原子哥,谢了,这个问题暂时先搁置,我修改协议来避开这个问题,等后期有空再来研究这么问题。
|
|
|
|
谢谢啊。DMA+空闲中断是一个可以很好处理多条命令的方式,可以一直缓存命令,然后再一条条的从队列里解析。不过,我这边暂时是接收一个处理一个就行了。
|
|
|
|
只有小组成员才能发言,加入小组>>
347浏览 1评论
460浏览 1评论
587浏览 1评论
用PSOC6 BLE当外围设备,两者传输数据时,psoc6概率性出现蓝牙挂死的原因?
471浏览 1评论
是否有办法通过CYW20835板的固件发送BLE HCI命令?
444浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-3 01:19 , Processed in 1.128597 second(s), Total 112, Slave 94 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号