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

求助!STM32串口接收数据问题

[复制链接]
电小龙 提问时间:2017-5-12 06:11 /
我用串口一的接收中断接收一组数据,接收到数据之后我就在中断中发一个消息邮箱到一个任务中,这个任务的优先级现在设的是最高的。然后任务等待到这个邮箱后就会进行判断处理。现在发现如果一次性发送一个字节的数据比如0xaa,程序都是正常的,但是如果我一次性发送大于一个字节的数据后如0xaa,0xbb的话只能正常一次。下面我把代码贴出来,麻烦各位帮忙看下,这个问题已经困扰我一天了。。。
  1. /*****************************************
  2. @ 任务优先级最高
  3. *****************************************/
  4. static uint32_t ulValue;
  5. void StartTask_Uart(void const * argument)
  6. {
  7. //    static uint8_t buff[20] = {0};//
  8. //    static uint8_t i = 0;//
  9.     for(;;)
  10.     {
  11.         if(xTaskNotifyWait(0, 0xffffffff, &ulValue, pdMS_TO_TICKS(500)) == pdPASS)//等待500ms
  12.             printf("the data is %x\r\n", ulValue);   
  13.     }
  14. }

  15. /*****************************************
  16. @ 串口中断程序
  17. *****************************************/
  18. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
  19. {
  20.     BaseType_t xHigherPriorityTaskWoken = pdFALSE;
  21.    
  22.     if(huart == &huart1)
  23.     {
  24.         HAL_UART_Receive_IT(&huart1, &recive_buff, 1);
  25.         xTaskNotifyFromISR(Task_UartHandle, recive_buff, eSetValueWithOverwrite, &xHigherPriorityTaskWoken);
  26.         
  27.         /* 如果 xHigherPriorityTaskWoken = pdTRUE,那么退出中断后切到当前最高优先级任务执行 */
  28.             portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
  29.     }
  30. }
复制代码


收藏 1 评论13 发布时间:2017-5-12 06:11

举报

13个回答
any012 回答时间:2017-5-12 08:57:31
额,串口接收完成回调函数里开启下一字节的中断接收吗?
会不会是接收溢出了?
电小龙 回答时间:2017-5-12 09:10:08
any012 发表于 2017-5-12 08:57
额,串口接收完成回调函数里开启下一字节的中断接收吗?
会不会是接收溢出了? ...

那我应什么时候开启下一个字节接收中断呢?在任务里吗?
any012 回答时间:2017-5-12 09:38:59
本帖最后由 any012 于 2017-5-12 09:43 编辑

额,我也正在为类似问题烦恼。可能帮不了你啊。
如果你接收的是定长数据的话,可以设置接收函数的参数里为那个长度。
如果是不定长数据的话,也可以考虑下空闲中断,论坛里有人分享过例程。

还有,也许根本就不是我怀疑的数据溢出问题...

我是用SPI接收定长数据,每次PC6上升沿中断后调用SPI中断接收函数,接收定长数据。
但是主从设备同时启动时,从设备的SPI接收就不正常了。

回答时间:2017-5-12 09:53:08
应该是溢出了。楼主可以看一下是否还进入接收中断。再看一下huart1的状态。
MrJiu 回答时间:2017-5-12 10:00:42
你的问题转变一下:一个字节一个字节连续发(手动连续),没啥问题,一次多个字节发送(软件发送),就导致有问题,如果是这样的你可以把波特率提高一下下试试???
anobodykey 回答时间:2017-5-12 10:52:52
对于这种不定长的数据还是用空闲中断吧
xmshao 回答时间:2017-5-12 11:34:00
怀疑你溢出了,你可以尝试把波特率调低做验证。也可以监测下相关溢出标志。
电小龙 回答时间:2017-5-12 11:38:01
我将HAL_UART_Receive_IT(&huart1, &recive_buff, 1);加到了任务等待消息邮箱下面,现在测试可以了,貌似还挺稳定。
电小龙 回答时间:2017-5-12 13:17:12
电小龙 发表于 2017-5-12 11:38
我将HAL_UART_Receive_IT(&huart1, &recive_buff, 1);加到了任务等待消息邮箱下面,现在测试可以了,貌似还 ...

但是一次性发送的数据大于3个字节又会出现错误了
12下一页
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版