完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
我用HAL_UART_Receive_IT(&huart2,RxBuffer,10); 这个函数接收串口发来的数据,然后在void HAL_UART_RxCpltCallback(UART_HandleTypeDef*UartHandle) 中处理数据并开启下一次中断。 现在经过实际测试是HAL_UART_Receive_IT()函数中第三个接收数据长度的参数如果设置短的话片子容易死掉。接收长度设置长的话,如果一次过来的数据不够数量串口继续在那等着。这两种情况肯定与实际情况不符。 求助一个各位达人,如果做到对方发来多少字节,可以在串口中接收同样的字节数,然后处理。
|
|
相关推荐
37个回答
|
|
|
Cube下实现串口+DMA+空闲中断接收不定长数据
http://www.stmcu.org/module/foru ... &fromuid=394920 (出处: 意法半导体STM32/STM8技术社区) |
|
|
|
|
亲爱的娜娜 发表于 2019-6-18 12:59 学到了 |
|
|
|
|
亲爱的娜娜 发表于 2019-6-18 12:59 用库函数的时候可以用下面的代码接收数据 if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //接收数据 { a=USART_ReceiveData(USART2); USART_ClearITPendingBit(USART2,USART_IT_RXNE); } 用stm32cubemx 怎么实现同样的功能呢。 |
|
|
|
|
|
hal里面直接有中断函数的处理和状态清除。cubemx生成里面应该有中断函数部分吧。
|
|
|
|
|
|
cubemx里边的中断接收函数只能定长接收,如果不定长只能用dma加串口中断接收好像还不如用库函数来的方便的。 |
|
|
|
|
|
HAL_UART_Receive_IT(&huart2,RxBuffer,10);
把10改成1,因为你的数据是不定长度的,接收函数写在串口接收的回调函数内, HAL_UART_Receive_IT(&huart1,&Rx2Buffer,1); void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle) { if(UartHandle->Instance==USART2) // { COM2_ATCMDretREC[COM2_REC_POINT] = Rx2Buffer; COM2_REC_POINT++; if(COM2_REC_POINT >= COM2_REC_BYTES_MAX) { COM2_REC_POINT = 0; } } } 在主程序内每间隔200mS(这个时间间隔不要太小就行了),比较前后两次的COM2_REC_POINT值,如果值不为0,并且两次值是一样的,就可以基本判断为这次接收的数据结束了,否则再等下一个200MS. |
|
|
|
|
苏州名之卓 发表于 2019-6-18 14:13 这样做你试过吗? 现在我实验的结果是如果中断接收函数的长度改为1 的话,我发送超过一个字节的数据,片子会死掉。 |
|
|
|
|
|
试过的,数据接收帧长度不同,但是每个数据帧间隔的时间较长,所以这个方法是可行的。
如果发送超过一个字节,片子会死掉,那很可能是设置的问题,HAL库其实已经帮我们考虑了很全面了。 还有提醒一下,如果你的程序有很多警告的话,建议你注意一点,有些警告没关系的,有些警告会有问题的。 我已经养成习惯了,规范语法,基本可以做到一个警告也没有,也可以避免一些陷阱。 |
|
|
|
|
|
程序应该是没有死掉,估计是溢出导致。楼主是否按照楼上所述加如了回调函数。
|
|
|
|
|
苏州名之卓 发表于 2019-6-18 14:38 一语惊醒我了,我按照教程在发送函数后边判断if(HAL_UART_Transmit_IT(&huart2,(uint8_t*) Uart2Data,1) !=halok) 执行了Error_Handler() 函数,并且出现的这个警告没有处理。导致出现上边的问题。感谢提醒! |
|
|
|
|
苏州名之卓 发表于 2019-6-18 14:38 现在问题是HAL_UART_Receive_IT(&huart1,&Rx2Buffer,1); 这个函数当我发送三个字节的时候,这个函数只接受第一个字节,后两个字节丢了。 |
|
|
|
|
|
回调函数肯定加了。问题是定长接收一个字节, 我发送三个字节,那后两个字节就丢了。 |
|
|
|
|
|
你进串口中断后,马上要把 Rx2Buffer 这个数据保存在数组中的,数组最好开大一些,要不数据放不下。
|
|
|
|
|
|
理解不了你的做法。进串口中断后把Rx2Buffer这个数据保存到数组没有问题。 问题是我发送了三个字节,接收函数只接受一个字节。我把这一个字节保存到数组中了,丢了另外两个。 没有意义啊。 |
|
|
|
|
|
楼主看一下,接收完成后是否就关闭了中断。
|
|
|
|
|
|
肯定是关了中断的,不然也不会每次在回调函数里边/HAL_UART_Receive_IT(&huart2,Uart2Data,1); 开启下一次中断。 不知道您说这个是什么意思。 因为只接受了一个字节的数据就关闭中断了,所以后边的数据就进不来了? |
|
|
|
|
|
用HAL比较少,我还是用的标准库,我也没有合适的解决方法。修改办法两种,一种该驱动,接收完成也不关闭中断,一种是通过Rx2Buffer定义一个大空间,实时去处理Rx2Buffer中的数据,满足条件以后重新进行接收处理。
HAL_UART_Receive_IT(&huart1,&Rx2Buffer,sizeof(Rx2Buffer)) |
|
|
|
|
TOPCB 发表于 2019-6-18 16:12 改驱动的方式试过了吗? 我刚才试了下接收完成不关闭中断,好像也没什么区别,不知道哪里的问题。 第二种定义一个大的缓冲区,如果不够接受函数的字节数的话得一直在那等着吧。 |
|
|
|
|
|
我改过是可以的。可以通过判断接收剩余字数,这样来确定当前已经接收到多少。
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
STM32F405驱动DS1302时钟模块,输出时间错乱该怎么排查?
2797 浏览 2 评论
stm32f405rgt6驱动DS1302ZN出现时间错乱问题
2403 浏览 1 评论
stm32用fsmc读取ad7606采集数据,数据不变,只有开发版复位才更新数据
2276 浏览 0 评论
2388 浏览 1 评论
1637 浏览 1 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 01:48 , Processed in 1.262878 second(s), Total 106, Slave 89 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
1286