OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 12859|回复: 31

STM32 HAL库使用多串口问题

[复制链接]

5

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2013-8-29
在线时间
14 小时
发表于 2017-12-14 19:03:48 | 显示全部楼层 |阅读模式
1金钱
现在遇到一个情况就是 使用cubeMX 生成的2个串口函数

在main函数中,while循环之前,使用
//HAL_UART_Receive_IT(&huart1, aRxBuffer, RXBUFFERSIZE);//该函数会开启接收中断:标志位UART_IT_RXNE,并且设置接收缓冲以及接收缓冲接收最大数据量
HAL_UART_Receive_IT(&huart2, aRxBuffer2, RXBUFFERSIZE);


其中
uint8_t aRxBuffer[RXBUFFERSIZE];                //        RXBUFFERSIZE=1
uint8_t aRxBuffer2[RXBUFFERSIZE];

主循环中每隔20ms 调用 HAL_UART_Transmit(&huart2,SendDataBuf,sizeof(Sbuff),1000);

在中断服务函数中分别添加了红色字部分

void USART1_IRQHandler(void)
{
  HAL_UART_IRQHandler(&huart1);
HAL_UART_Receive_IT(&huart1, aRxBuffer, RXBUFFERSIZE);
}

/**
void USART2_IRQHandler(void)
{
  HAL_UART_IRQHandler(&huart2);
HAL_UART_Receive_IT(&huart2, aRxBuffer2, RXBUFFERSIZE);
}


回调函数中判断解析帧
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if(huart->Instance==USART1)
    {
       led=~led;//(用于观察程序有没有进来)
       /*解析帧*/
    }
    if(huart->Instance==USART2)
    {
       led=~led;//(用于观察程序有没有进来)
       /*解析帧*/
    }

}

现在的问题是,串口2的发送一直没有问题,但是回调函数中的串口2接收,接收几次后,
整个 if(huart->Instance==USART2) 都不成立了,因为只开串口的接收,led等就不闪了, 明显就是没有进入 if(huart->Instance==USART2),
断点测试,就是串口2好像就没有触发了。但是串口2的发送一直是正常发送的。
请问各位大神,我现在的问题是出在哪里?

最佳答案

查看完整内容[请看2#楼]

隔了这么多天,我后来调试了很多办法, 最后发现是 发送函数的问题, HAL_UART_Transmit(&huart2,SendDataBuf,sizeof(Sbuff),1000); 这个HAL_UART_Transmit函数发送快了, 会导致串口堵塞,从而导致收不到串口的数据,我手来使用 寄存器的发送方式,就没有出现串口收不到数据的情况了 void USART1SendToData(unsigned char a[], unsigned char cnt) { unsigned char i; for(i=0; iSR & 0x40) == 0); USART1->D ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2013-8-29
在线时间
14 小时
 楼主| 发表于 2017-12-14 19:03:49 | 显示全部楼层
本帖最后由 wmfi 于 2018-2-5 13:45 编辑
Noctis 发表于 2017-12-24 21:49
你说的这种用法其实就是LZ之前的用法啊,这种用法本身就不对的。虽然你的实验没有问题,但那只是运气好。 ...

隔了这么多天,我后来调试了很多办法, 最后发现是 发送函数的问题,
HAL_UART_Transmit(&huart2,SendDataBuf,sizeof(Sbuff),1000);
这个HAL_UART_Transmit函数发送快了, 会导致串口堵塞,从而导致收不到串口的数据,我手来使用 寄存器的发送方式,就没有出现串口收不到数据的情况了
void USART1SendToData(unsigned char a[], unsigned char cnt)
{
  unsigned char i;
  for(i=0; i<cnt; i++)
  {
      while((USART1->SR & 0x40) == 0);
      USART1->DR = a[ i ];
  }
}
然后在主循环之前
HAL_UART_Receive_IT(&huart1, aRxBuffer, RXBUFFERSIZE);
HAL_UART_Receive_IT(&huart2, aRxBuffer2, RXBUFFERSIZE);
再在回调函数里面的结尾处再次
HAL_UART_Receive_IT(&huart1, aRxBuffer, RXBUFFERSIZE);
HAL_UART_Receive_IT(&huart2, aRxBuffer2, RXBUFFERSIZE);,
其它地方都不用更改,直接用cubemx生成的代码就行
回复

使用道具 举报

0

主题

88

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
361
金钱
361
注册时间
2016-11-1
在线时间
119 小时
发表于 2017-12-14 20:18:21 | 显示全部楼层
接收几次后就接收不了是因为某一次中断里执行HAL_UART_Receive_IT失败了,执行失败后就没有再开启接中断,所以后面的就收不了。
你看一下源代码,无论是HAL_UART_Receive_IT还是 HAL_UART_Transmit,它们里面都有一行代码__HAL_LOCK(huart); 这是导致某一次中断中执行HAL_UART_Receive_IT失败的原因。
总之,HAL_UART_Receive_IT不要用在中断里。具体使用方法可以参考官方的例程。
回复

使用道具 举报

5

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2013-8-29
在线时间
14 小时
 楼主| 发表于 2017-12-14 21:42:57 | 显示全部楼层
Noctis 发表于 2017-12-14 20:18
接收几次后就接收不了是因为某一次中断里执行HAL_UART_Receive_IT失败了,执行失败后就没有再开启接中断, ...

请问,如果不放到中断服务函数里面,应该放哪里呢?不然不能触发接收回调函数。

还有就是,我的串口1是这样做的,没有出现这问题,串口2就按照串口1的方式一样做的,就不行了
回复

使用道具 举报

0

主题

88

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
361
金钱
361
注册时间
2016-11-1
在线时间
119 小时
发表于 2017-12-14 23:45:23 | 显示全部楼层
放在主循环里。在cubemx存放HAL库的文件夹里搜索UART_TwoBoards_ComIT,里面就有使用HAL_UART_Receive_IT的例程。
不过官方的那个例子看懂了就算了,实际上大部分人的接收中断都不会用HAL库的。

串口1没有问题,只是在你这次测试时没有问题而已,你再多写几行代码,或更改一下发送间隔它都有可能出问题。只要你在接收中断里使用HAL_UART_Receive_IT,就会有机率出现返回非HAL_OK的情况。
其实你在接收中断里使用HAL_UART_Receive_IT也无妨,但一定要检测它的返回值,当检测到不是返回HAL_OK时,你设一个标记为1,在主循环中,检测到该标记为1则执行HAL_UART_Receive_IT,然后将该标记清0就可以了。
回复

使用道具 举报

5

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2013-8-29
在线时间
14 小时
 楼主| 发表于 2017-12-15 09:48:30 | 显示全部楼层
本帖最后由 wmfi 于 2017-12-15 09:50 编辑
Noctis 发表于 2017-12-14 23:45
放在主循环里。在cubemx存放HAL库的文件夹里搜索UART_TwoBoards_ComIT,里面就有使用HAL_UART_Receive_IT的 ...

我也看过了原子哥例程,按照这思路写的,下面是原子的例程截图

串口中断函数

串口中断函数


回调函数

回调函数

在串口1的中断服务函数中确实有看到 超时处理的代码,而我就在中断服务函数就没有加, 只是
添加了HAL_UART_Receive_IT(&UART1_Handler, (u8 *)aRxBuffer, RXBUFFERSIZE),也没有作判断
难道就是这个原因导致的?


回复

使用道具 举报

0

主题

88

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
361
金钱
361
注册时间
2016-11-1
在线时间
119 小时
发表于 2017-12-15 10:53:06 | 显示全部楼层
wmfi 发表于 2017-12-15 09:48
我也看过了原子哥例程,按照这思路写的,下面是原子的例程截图

原子的例程也有问题,他那个超时处理就是多余的,你的串口2也可以加上这个超时处理试试,一样会出问题的。
while (HAL_UART_GetState(&UART1_Handler) != HAL_UART_STATE_READY) 这一行,当HAL_UART_GetState的返回值不等于 HAL_UART_STATE_READY时,在同一个串口中断中不断执行HAL_UART_GetState是等不到它变回 HAL_UART_STATE_READY的。
同理,while(HAL_UART_Receive_IT(&UART1_Handler, (u8 *)aRxBuffer, RXBUFFERSIZE) != HAL_OK)这一行,当HAL_UART_Receive_IT的返回值不等于HAL_OK时,再一直执行也不会等于HAL_OK的。
回复

使用道具 举报

5

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2013-8-29
在线时间
14 小时
 楼主| 发表于 2017-12-15 11:06:08 | 显示全部楼层
Noctis 发表于 2017-12-15 10:53
原子的例程也有问题,他那个超时处理就是多余的,你的串口2也可以加上这个超时处理试试,一样会出问题的 ...

我确实是按照原子的方法加了超时的判断, 问题依然存在 串口2接收一段帧后就不再触发中断了,而串口的发送是以20ms的频率一直再发送,同时串口1也是20ms的频率一直发送,串口1同时也在20ms的接收,问题就是 串口2的接收几次后就怎么也不再接收了, 我现在按照你的方法再主循环里面判断试试
回复

使用道具 举报

5

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2013-8-29
在线时间
14 小时
 楼主| 发表于 2017-12-15 12:06:36 | 显示全部楼层
Noctis 发表于 2017-12-14 23:45
放在主循环里。在cubemx存放HAL库的文件夹里搜索UART_TwoBoards_ComIT,里面就有使用HAL_UART_Receive_IT的 ...

最后按照你说的这思路, 在中断服务函数里面 添加 判断标志

超时1.png

然后在住循环里面来判断 超时标志if(timeout!=0)

main.png

这样串口2的接收好像就没有出现接收一段帧后,就停止的问题了,但是会出现发送5次命令,有可能出现2次收不完全的情况,
可能是解析的问题,总的来说大问题算是解决了
回复

使用道具 举报

0

主题

88

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
361
金钱
361
注册时间
2016-11-1
在线时间
119 小时
发表于 2017-12-15 23:29:19 | 显示全部楼层
这代码会出现接收不完全的情况也很正常,因为HAL_UART_Receive_IT这个函数在接收完RXBUFFERSIZE个数据后就会将接收中断关了,此时如果有数据发送进来,但接收中断又未开启,数据自然会丢失。
其实用HAL库初始化完成后,再用__HAL_UART_ENABLE_IT(&huart, UART_IT_RXNE);开启接收中断,然后中断函数自己重写就不会出现这种问题了。
回复

使用道具 举报

5

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2013-8-29
在线时间
14 小时
 楼主| 发表于 2017-12-21 15:47:25 | 显示全部楼层
Noctis 发表于 2017-12-15 23:29
这代码会出现接收不完全的情况也很正常,因为HAL_UART_Receive_IT这个函数在接收完RXBUFFERSIZE个数据后就 ...

中断函数重写,是怎么重写,重用void USART1_IRQHandler(void) 这函数吗, 但是这样会被提示错误,但是不用这函数名,就不会被认为是中断函数
回复

使用道具 举报

0

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
158
金钱
158
注册时间
2017-10-23
在线时间
35 小时
发表于 2017-12-21 16:11:20 | 显示全部楼层
我以前也用的maxcub,直接用的,也没加那么多判断,直接把开启中断接收一个字节放在回调函数的结束,运行正常,stm32f103,stm32f407实验都没有问题
回复

使用道具 举报

15

主题

406

帖子

0

精华

高级会员

Rank: 4

积分
795
金钱
795
注册时间
2015-3-26
在线时间
151 小时
发表于 2017-12-21 19:10:43 | 显示全部楼层
20ms够?
回复

使用道具 举报

5

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2013-8-29
在线时间
14 小时
 楼主| 发表于 2017-12-22 15:35:35 | 显示全部楼层
qd18754223582 发表于 2017-12-21 16:11
我以前也用的maxcub,直接用的,也没加那么多判断,直接把开启中断接收一个字节放在回调函数的结束,运行正 ...

你的意思是说,将
HAL_UART_Receive_IT(&huart1, aRxBuffer, RXBUFFERSIZE);
HAL_UART_Receive_IT(&huart2, aRxBuffer2, RXBUFFERSIZE);
这2个函数直接放在回调函数里面的结尾处吗?
回复

使用道具 举报

0

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
158
金钱
158
注册时间
2017-10-23
在线时间
35 小时
发表于 2017-12-22 15:36:34 | 显示全部楼层
是啊,我以前就这这么做的,现在也是这么做的
回复

使用道具 举报

0

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
158
金钱
158
注册时间
2017-10-23
在线时间
35 小时
发表于 2017-12-22 15:37:26 | 显示全部楼层
wmfi 发表于 2017-12-22 15:35
你的意思是说,将
HAL_UART_Receive_IT(&huart1, aRxBuffer, RXBUFFERSIZE);
HAL_UART_Receive_IT(&hua ...

是的,你试试,我现在也是这么做的,没发现什么问题
回复

使用道具 举报

5

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2013-8-29
在线时间
14 小时
 楼主| 发表于 2017-12-22 15:49:01 | 显示全部楼层
qd18754223582 发表于 2017-12-22 15:36
是啊,我以前就这这么做的,现在也是这么做的

那思路是不是这样的:
在主循环之前先执行一次
HAL_UART_Receive_IT(&huart1, aRxBuffer, RXBUFFERSIZE);
HAL_UART_Receive_IT(&huart2, aRxBuffer2, RXBUFFERSIZE);
然后再回调函数里面的结尾处再执行一次
HAL_UART_Receive_IT(&huart1, aRxBuffer, RXBUFFERSIZE);
HAL_UART_Receive_IT(&huart2, aRxBuffer2, RXBUFFERSIZE);
其它地方就不需要作任何处理了??是这样的意思吗?
回复

使用道具 举报

0

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
158
金钱
158
注册时间
2017-10-23
在线时间
35 小时
发表于 2017-12-22 16:19:51 | 显示全部楼层
wmfi 发表于 2017-12-22 15:49
那思路是不是这样的:
在主循环之前先执行一次
HAL_UART_Receive_IT(&huart1, aRxBuffer, RXBUFFERSIZE ...

在主函数串口初始化后使用一次,其他的在回调结尾用,不要再主循环里用
回复

使用道具 举报

0

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
158
金钱
158
注册时间
2017-10-23
在线时间
35 小时
发表于 2017-12-22 16:23:18 | 显示全部楼层
qd18754223582 发表于 2017-12-22 16:19
在主函数串口初始化后使用一次,其他的在回调结尾用,不要再主循环里用

接收一次,执行一次中断接收命令,不要重复使用,所以不能再while(1)里使用
回复

使用道具 举报

0

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
158
金钱
158
注册时间
2017-10-23
在线时间
35 小时
发表于 2017-12-22 16:27:49 | 显示全部楼层
wmfi 发表于 2017-12-22 15:49
那思路是不是这样的:
在主循环之前先执行一次
HAL_UART_Receive_IT(&huart1, aRxBuffer, RXBUFFERSIZE ...

不好意思,我看错啦,你表达的思路就是对的,你试试看看是否可以。
回复

使用道具 举报

0

主题

88

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
361
金钱
361
注册时间
2016-11-1
在线时间
119 小时
发表于 2017-12-24 21:46:50 | 显示全部楼层
wmfi 发表于 2017-12-21 15:47
中断函数重写,是怎么重写,重用void USART1_IRQHandler(void) 这函数吗, 但是这样会被提示错误,但是不 ...

不会写的话就参考HAL库里的这个函数 void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)。
其实只重写UART_Receive_IT()这个函数也可以,不过这样就要直接修改HAL库的源文件,所以不建议。
回复

使用道具 举报

0

主题

88

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
361
金钱
361
注册时间
2016-11-1
在线时间
119 小时
发表于 2017-12-24 21:49:24 | 显示全部楼层
qd18754223582 发表于 2017-12-21 16:11
我以前也用的maxcub,直接用的,也没加那么多判断,直接把开启中断接收一个字节放在回调函数的结束,运行正 ...

你说的这种用法其实就是LZ之前的用法啊,这种用法本身就不对的。虽然你的实验没有问题,但那只是运气好。其实为什么这么用法会有问题我之前也解释过了,不过可能你们都没有看源代码吧。我最后贴一次源代码说说好了。
这是F1 V1.6.0版本里的HAL_UART_Transmit_IT函数:

tx

tx

这是HAL_UART_Receive_IT函数:

rx

rx


假设主循环在某一时刻调用了HAL_UART_Transmit_IT函数,且执行到827-832行之间的某一行时,该串口也发生了接收中断,(此时,该串口的UART_HandleTypeDef结构体内的Lock变量=HAL_LOCKED)那么当你在中断回调函数里执行HAL_UART_Receive_IT时,该函数在执行完867行: __HAL_LOCK(huart); 这行代码后就会退出。我再顺便贴一下__HAL_LOCK的定义吧:

lock

lock

可以看到,当Lock=HAL_LOCKED时会返回HAL_BUSY。

所以,除非你能保证你的程序在发生接收中断时,在主程序中不会执行到__HAL_LOCK(huart); 与 __HAL_UNLOCK(huart);之间的内容,否则就不能那么简单地在接收回调函数内使用HAL_UART_Receive_IT。
因为__HAL_LOCK(huart); 与 __HAL_UNLOCK(huart);之间的内容其实很快就会执行完,所以你的实验可能遇不到出错的情况。

回复

使用道具 举报

0

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
158
金钱
158
注册时间
2017-10-23
在线时间
35 小时
发表于 2017-12-25 10:41:25 | 显示全部楼层
Noctis 发表于 2017-12-24 21:49
你说的这种用法其实就是LZ之前的用法啊,这种用法本身就不对的。虽然你的实验没有问题,但那只是运气好。 ...

谢谢你的指点。但是,即使不把中断接收写在中断里,执行中断的时间还是不确定的,也有可能在发送的时候时候触发中断,所以这个和写在哪儿是没有关系的;如果想不发生错误,只能在发送或者接收中断只执行一个,修改库函数。把中断接收放在中断结尾,只是让它接收接收及时而已,如果不考虑事实问题,完全可以执行一个时,失能另一个。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2018-2-6 01:35:23 | 显示全部楼层
wmfi 发表于 2018-2-5 13:43
隔了这么多天,我后来调试了很多办法, 最后发现是 发送函数的问题,
HAL_UART_Transmit(&huart2,SendD ...

谢谢分享
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

0

主题

88

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
361
金钱
361
注册时间
2016-11-1
在线时间
119 小时
发表于 2018-2-6 15:31:02 | 显示全部楼层
本帖最后由 Noctis 于 2018-2-6 15:42 编辑
wmfi 发表于 2017-12-14 19:03
隔了这么多天,我后来调试了很多办法, 最后发现是 发送函数的问题,
HAL_UART_Transmit(&huart2,SendD ...

隔了这么多天你还没正确理解之前失败的原因啊,我感觉我打了很多字解释了
虽然你现在的用法是可以的,但你的理解错了,不是因为
HAL_UART_Transmit函数发送快了

(难道串口发送会因为用你自己写的发送函数而变慢吗???),而是因为HAL_UART_Transmit与HAL_UART_Receive_IT不能“同时”使用。
你其实注释掉HAL_UART_Receive_IT、HAL_UART_Transmit这些函数里面的[mw_shl_code=c,true]__HAL_LOCK(huart);[/mw_shl_code]再用你当初的代码也可以的,因为去掉这行代码后这些函数就可以“同时”用了。
回复

使用道具 举报

0

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
137
金钱
137
注册时间
2013-11-12
在线时间
24 小时
发表于 2018-2-7 10:04:39 | 显示全部楼层
通过不断的调试发现,在初始化的时候
HAL_UART_Receive_IT(&huart1, aRxBuffer, RXBUFFERSIZE);
HAL_UART_Receive_IT(&huart2, aRxBuffer2, RXBUFFERSIZE);

然后再回调函数里面的结尾处再执行一次
HAL_UART_Receive_IT(&huart1, aRxBuffer, RXBUFFERSIZE);
HAL_UART_Receive_IT(&huart2, aRxBuffer2, RXBUFFERSIZE);

的做法是比较可靠的
回复

使用道具 举报

5

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2013-8-29
在线时间
14 小时
 楼主| 发表于 2018-2-7 11:09:11 | 显示全部楼层
Noctis 发表于 2018-2-6 15:31
隔了这么多天你还没正确理解之前失败的原因啊,我感觉我打了很多字解释了
虽然你现在的用法是可以的, ...

是的,是的,你说的确实是对的,  就是那2个函数不能同时在某个时刻一起使用,不然就会出现“堵塞”的情况,应该是我之前没有理解你的意思,见谅
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2014-12-30
在线时间
8 小时
发表于 2018-7-22 00:08:27 | 显示全部楼层
__HAL_LOCK(huart) 把整个外设锁起来了,如同时收发数据(全双工)就会死锁,如不改HAL库代码,学官方例程,搞一问一答(非全双工)
回复

使用道具 举报

3

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
123
金钱
123
注册时间
2019-7-9
在线时间
27 小时
发表于 2019-7-24 15:36:10 | 显示全部楼层
厉害 学习到了 确实是这样
回复

使用道具 举报

3

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
123
金钱
123
注册时间
2019-7-9
在线时间
27 小时
发表于 2019-7-24 15:37:46 | 显示全部楼层
Noctis 发表于 2017-12-24 21:49
你说的这种用法其实就是LZ之前的用法啊,这种用法本身就不对的。虽然你的实验没有问题,但那只是运气好。 ...

楼主的方法解决了困扰了很多的问题
回复

使用道具 举报

3

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
123
金钱
123
注册时间
2019-7-9
在线时间
27 小时
发表于 2019-7-24 15:38:14 | 显示全部楼层
wmfi 发表于 2017-12-15 12:06
最后按照你说的这思路, 在中断服务函数里面 添加 判断标志

楼主的方法解决了困扰了很多的问题
回复

使用道具 举报

34

主题

94

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2022-4-8
在线时间
81 小时
发表于 2023-8-19 01:18:48 | 显示全部楼层
wmfi 发表于 2018-2-7 11:09
是的,是的,你说的确实是对的,  就是那2个函数不能同时在某个时刻一起使用,不然就会出现“堵塞”的情 ...

你好,问题解决了吗?我也的类似的问题,可以分享一下代码吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 02:00

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表