OpenEdv-开源电子网

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

请问各位大佬,为什么空闲中断有时候能接收到完整的一帧数据,有时候又只能接收到一个字符呢?

[复制链接]

12

主题

80

帖子

0

精华

高级会员

Rank: 4

积分
581
金钱
581
注册时间
2019-8-6
在线时间
132 小时
发表于 2020-12-10 19:27:32 | 显示全部楼层 |阅读模式
20金钱
本帖最后由 lyy26655 于 2020-12-15 16:13 编辑

2020年12月14日:非常感谢楼里大家的帮助以及讨论,置顶的回复基本完美解决了这个问题





可以参考   @旮旯旭   的这篇帖子
STM32V6之串口HAL库串口空闲中断接收不定长字节代码实现
http://www.armbbs.cn/forum.php?mod=viewthread&tid=101377

这种方式应该可以解决大部分接收问题,缺点在于接收到一个数据的超时时间没法自定义
剩下两种可定义 作者都为 @旮旯旭   @旮旯旭   @旮旯旭

STM32V6之串口HAL库接收不定长字节数据方法三 心跳相对超时判断
http://www.armbbs.cn/forum.php?mod=viewthread&tid=101395

STM32V6之串口HAL库接收不定长字节数据方法二-定时器超时计数-单数据接收模式
http://www.armbbs.cn/forum.php?mod=viewthread&tid=101391


在while前打开了空闲中断:__HAL_UART_ENABLE_IT(&huart2,UART_IT_IDLE);__HAL_UART_ENABLE_IT(&huart3,UART_IT_IDLE);

中断回调函数如下:
void UART_IDLECallBack(UART_HandleTypeDef *huart)
{
  if(huart==&huart2)
    __HAL_UART_CLEAR_IDLEFLAG(&huart2);
    HAL_UART_Receive_IT(&huart2,&Uart2Status.RxBuf,1);

if(huart==&huart3)
    __HAL_UART_CLEAR_IDLEFLAG(&huart3);
    HAL_UART_Receive_IT(&huart3,&Uart3Status.RxBuf,1);

}

想请问一下,为什么串口2能收到完整的一帧数据,但串口3只能收到一个字符呢?会不会是跟模块回复的时间有关系呢
如果有更好的办法可以一次完整获取一帧数据,也请大佬们提出,目前没有用DMA是因为不太清楚手动配置DMA需要配置多少信息

上次485的问题已经解决,发送一次性读取两个寄存器的命令就可以了


再补充下:串口3接的模块回复数据不是一次性回复完 中间有时间间隔 还会回复换行符/r/n 猜测是这个原因导致只能接收到一个字符请问各位大佬有思路吗,方便贴一段代码来学习下,谢谢!
模块回复的内容为:
AT/r/n
OK
在串口调试助手上显示的是
AT
OK
现在问题是模块不光会回复AT OK 还会回复
AT +SIOPEN
1,0
OK
类似的信息 请大佬帮忙







最佳答案

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

1、把ascii转化成2个hex码,比如数据 0x5A -> 5转0x35 A转0x41,这样你的数据里面就只有几个数字和字母的内容,然后帧头帧尾采用特殊字符。 但是这样会导致数据量扩大几乎一倍,数据量小可以用。 2、双帧头加校验,这个比较稳定,接收的时候数据断了,就直接丢掉。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

84

帖子

1

精华

高级会员

Rank: 4

积分
666
金钱
666
注册时间
2013-10-21
在线时间
88 小时
发表于 2020-12-14 09:12:00 | 显示全部楼层
lyy26655 发表于 2020-12-14 09:05
大神,想请问下您,我现在用的STM32F103RCT6 UART5 没有DMA功能,那怎么样才能接收到完整数据呢 麻烦您了 ...

UART5没有DMA一样可以用空闲中断啊,首先你需要知道你的串口的数据流是什么方式的,如果数据流每帧是连续的,就可以用空闲中断,如果不连续有协议头和尾,那就根据协议来。你的代码是STM32CubeMX生成的吗?发我一份给你改改
回复

使用道具 举报

4

主题

84

帖子

1

精华

高级会员

Rank: 4

积分
666
金钱
666
注册时间
2013-10-21
在线时间
88 小时
发表于 2020-12-14 11:26:53 | 显示全部楼层
UART5使用空闲中断用HAL库写方便,多数据接收,帖子里说出来都可以写一篇帖子了
STM32V6之串口HAL库串口空闲中断接收不定长字节代码实现
http://www.armbbs.cn/forum.php?mod=viewthread&tid=101377
这个是我写的在其他论坛的帖子,里面包含了中断和DMA的方式。

回复

使用道具 举报

28

主题

294

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1790
金钱
1790
注册时间
2018-3-26
在线时间
294 小时
发表于 2020-12-10 19:27:33 | 显示全部楼层
caoenq 发表于 2020-12-11 14:51
帧头、帧尾要设置成哪些内容才有如此的唯一性呢?请大神赐教。

1、把ascii转化成2个hex码,比如数据 0x5A -> 5转0x35 A转0x41,这样你的数据里面就只有几个数字和字母的内容,然后帧头帧尾采用特殊字符。

但是这样会导致数据量扩大几乎一倍,数据量小可以用。

2、双帧头加校验,这个比较稳定,接收的时候数据断了,就直接丢掉。
茵茵猪头
回复

使用道具 举报

2

主题

685

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3448
金钱
3448
注册时间
2017-7-4
在线时间
869 小时
发表于 2020-12-10 20:21:19 | 显示全部楼层
空闲中断时间太短,不适合用来判断一帧;有时可能因为发送端的延迟,导致误判;开一个计时器,比如10ms未收到数据,则认为是一帧;串口是字节流数据,真正靠谱的帧处理是增加帧头帧尾,通过头尾判断一帧。
回复

使用道具 举报

0

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2019-12-31
在线时间
29 小时
发表于 2020-12-11 09:02:37 | 显示全部楼层
Acuity 发表于 2020-12-10 20:21
空闲中断时间太短,不适合用来判断一帧;有时可能因为发送端的延迟,导致误判;开一个计时器,比如10ms未收 ...

靠帧头、帧尾也不可靠,如果有效数据中有跟帧尾一样的字节,恰好又发完这个数据就断流了,还是会出错。
回复

使用道具 举报

5

主题

152

帖子

0

精华

高级会员

Rank: 4

积分
777
金钱
777
注册时间
2016-7-15
在线时间
119 小时
发表于 2020-12-11 09:08:09 | 显示全部楼层
没配置好,我三个串口同时用空闲中断收发数据,稳稳的
好好学习,天天向上。
回复

使用道具 举报

2

主题

685

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3448
金钱
3448
注册时间
2017-7-4
在线时间
869 小时
发表于 2020-12-11 10:06:19 | 显示全部楼层
caoenq 发表于 2020-12-11 09:02
靠帧头、帧尾也不可靠,如果有效数据中有跟帧尾一样的字节,恰好又发完这个数据就断流了,还是会出错。

很显然,必须确保一帧内,数据内容不会与帧头帧尾重复。有重复,那就不叫帧头帧尾了
回复

使用道具 举报

12

主题

80

帖子

0

精华

高级会员

Rank: 4

积分
581
金钱
581
注册时间
2019-8-6
在线时间
132 小时
 楼主| 发表于 2020-12-11 13:43:37 | 显示全部楼层
再补充下:串口3接的模块回复数据不是一次性回复完 中间有时间间隔 还会回复换行符/r/n 猜测是这个原因导致只能接收到一个字符请问各位大佬有思路吗,方便贴一段代码来学习下,谢谢!
回复

使用道具 举报

0

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2019-12-31
在线时间
29 小时
发表于 2020-12-11 14:51:13 | 显示全部楼层
Acuity 发表于 2020-12-11 10:06
很显然,必须确保一帧内,数据内容不会与帧头帧尾重复。有重复,那就不叫帧头帧尾了

帧头、帧尾要设置成哪些内容才有如此的唯一性呢?请大神赐教。
回复

使用道具 举报

3

主题

312

帖子

0

精华

高级会员

Rank: 4

积分
907
金钱
907
注册时间
2011-10-19
在线时间
196 小时
发表于 2020-12-11 14:52:42 来自手机 | 显示全部楼层
空闲中断如果不配合DMA使用是收不到完整的数据的:连续来多个字节时,空闲中断只在最后一个字节之后发生一次。你这个是中断接收方式,应该用RXNE中断。
回复

使用道具 举报

2

主题

685

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3448
金钱
3448
注册时间
2017-7-4
在线时间
869 小时
发表于 2020-12-11 15:00:28 | 显示全部楼层
caoenq 发表于 2020-12-11 14:51
帧头、帧尾要设置成哪些内容才有如此的唯一性呢?请大神赐教。

1、数据内容转换成字符串格式,以类似\r\n这样的字符作帧头帧尾
2、转义,比如用7E、7F作为侦头帧尾,7D为转义字;数据内容遇到7E用7D 01替换,遇到7F用7D 02替换,遇到7D用7D 03替换。接收方接收到数据后,需要先反转义。
比如发送 01 7E 7F 03 05 7D->加上帧头帧尾转义后:7E 01 7D 01 7D 02 03 05 7D 03 7F
回复

使用道具 举报

2

主题

685

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3448
金钱
3448
注册时间
2017-7-4
在线时间
869 小时
发表于 2020-12-11 15:01:29 | 显示全部楼层
caoenq 发表于 2020-12-11 14:51
帧头、帧尾要设置成哪些内容才有如此的唯一性呢?请大神赐教。

空闲中断还是配合DMA接收,参考帖子:http://www.openedv.com/forum.php ... d=317086&extra=
回复

使用道具 举报

4

主题

84

帖子

1

精华

高级会员

Rank: 4

积分
666
金钱
666
注册时间
2013-10-21
在线时间
88 小时
发表于 2020-12-11 15:11:01 | 显示全部楼层
都在胡扯
回复

使用道具 举报

12

主题

80

帖子

0

精华

高级会员

Rank: 4

积分
581
金钱
581
注册时间
2019-8-6
在线时间
132 小时
 楼主| 发表于 2020-12-11 16:36:19 | 显示全部楼层
ufbycd 发表于 2020-12-11 14:52
空闲中断如果不配合DMA使用是收不到完整的数据的:连续来多个字节时,空闲中断只在最后一个字节之后发生一 ...

您好,萌新还是想追根溯源一下,我并没有打开__HAL_UART_ENABLE_IT(&huart2,UART_IT_RXNE); 也算是用了RXNE中断吗
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2020-12-11 18:24:28 | 显示全部楼层
不应该用空闲中断来判断帧的开始或结束,除非是你跟通信的另一端的码农有默契, 否则谁说过帧与帖之间是一定要停顿? 反过来看, 既然能用空闲来判断帧头帧尾, 还要帧头来搞装饰么?
回复

使用道具 举报

24

主题

695

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1666
金钱
1666
注册时间
2016-4-29
在线时间
266 小时
发表于 2020-12-12 08:47:45 | 显示全部楼层
Acuity 发表于 2020-12-11 15:00
1、数据内容转换成字符串格式,以类似\r\n这样的字符作帧头帧尾
2、转义,比如用7E、7F作为侦头帧尾,7D ...

也就是说在数据域(除去帧头和帧尾)不可能出现7E和7F,同时7D后一字节必定是01、02、03三者之一
回复

使用道具 举报

2

主题

685

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3448
金钱
3448
注册时间
2017-7-4
在线时间
869 小时
发表于 2020-12-12 10:31:27 | 显示全部楼层
d1z1y2 发表于 2020-12-12 08:47
也就是说在数据域(除去帧头和帧尾)不可能出现7E和7F,同时7D后一字节必定是01、02、03三者之一

对,接收到数据后,根据7D 01、7D  02、7D  03还原为实际数据。
回复

使用道具 举报

4

主题

84

帖子

1

精华

高级会员

Rank: 4

积分
666
金钱
666
注册时间
2013-10-21
在线时间
88 小时
发表于 2020-12-12 12:28:19 | 显示全部楼层
符合modbus的用空闲中断的方式接收很不错啊
回复

使用道具 举报

3

主题

312

帖子

0

精华

高级会员

Rank: 4

积分
907
金钱
907
注册时间
2011-10-19
在线时间
196 小时
发表于 2020-12-13 21:48:17 来自手机 | 显示全部楼层
各楼层都没有认真看题,回得牛头不对马嘴,也是服了。
回复

使用道具 举报

12

主题

80

帖子

0

精华

高级会员

Rank: 4

积分
581
金钱
581
注册时间
2019-8-6
在线时间
132 小时
 楼主| 发表于 2020-12-14 09:05:54 | 显示全部楼层
Acuity 发表于 2020-12-12 10:31
对,接收到数据后,根据7D 01、7D  02、7D  03还原为实际数据。

大神,想请问下您,我现在用的STM32F103RCT6 UART5 没有DMA功能,那怎么样才能接收到完整数据呢 麻烦您了
回复

使用道具 举报

12

主题

80

帖子

0

精华

高级会员

Rank: 4

积分
581
金钱
581
注册时间
2019-8-6
在线时间
132 小时
 楼主| 发表于 2020-12-14 11:18:02 | 显示全部楼层
旮旯旭 发表于 2020-12-14 09:12
UART5没有DMA一样可以用空闲中断啊,首先你需要知道你的串口的数据流是什么方式的,如果数据流每帧是连续 ...

谢谢您,提供一些思路就好现在是字符串,发送AT模块会回复AT/nOK
回复

使用道具 举报

12

主题

80

帖子

0

精华

高级会员

Rank: 4

积分
581
金钱
581
注册时间
2019-8-6
在线时间
132 小时
 楼主| 发表于 2020-12-14 16:12:23 | 显示全部楼层
本帖最后由 lyy26655 于 2020-12-14 16:29 编辑
旮旯旭 发表于 2020-12-14 11:26
UART5使用空闲中断用HAL库写方便,多数据接收,帖子里说出来都可以写一篇帖子了
STM32V6之串口HAL库串口空 ...

这个帖子太牛逼了 谢谢您 !您写的这串代码非常好用,希望大家都能学习参考
回复

使用道具 举报

0

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2019-12-31
在线时间
29 小时
发表于 2020-12-14 16:24:19 | 显示全部楼层
Acuity 发表于 2020-12-11 15:00
1、数据内容转换成字符串格式,以类似\r\n这样的字符作帧头帧尾
2、转义,比如用7E、7F作为侦头帧尾,7D ...

了解了,感谢回复。
回复

使用道具 举报

12

主题

80

帖子

0

精华

高级会员

Rank: 4

积分
581
金钱
581
注册时间
2019-8-6
在线时间
132 小时
 楼主| 发表于 2020-12-14 16:48:57 | 显示全部楼层
本帖最后由 lyy26655 于 2020-12-14 16:53 编辑


已编辑已编辑已编辑
回复

使用道具 举报

12

主题

80

帖子

0

精华

高级会员

Rank: 4

积分
581
金钱
581
注册时间
2019-8-6
在线时间
132 小时
 楼主| 发表于 2020-12-15 10:29:25 | 显示全部楼层
本帖最后由 lyy26655 于 2020-12-15 10:45 编辑
旮旯旭 发表于 2020-12-14 11:26
UART5使用空闲中断用HAL库写方便,多数据接收,帖子里说出来都可以写一篇帖子了
STM32V6之串口HAL库串口空 ...

想再详细问您一下,您发的那篇帖子里面HAL_UART_Receive_IT方式是依靠接收超时来判断接收一帧完整数据的吗?因为也没看到对RxXferSize的值进行定义,所以好奇是怎么做到能完整接收的
回复

使用道具 举报

4

主题

84

帖子

1

精华

高级会员

Rank: 4

积分
666
金钱
666
注册时间
2013-10-21
在线时间
88 小时
发表于 2020-12-15 11:16:17 | 显示全部楼层
lyy26655 发表于 2020-12-15 10:29
想再详细问您一下,您发的那篇帖子里面HAL_UART_Receive_IT方式是依靠接收超时来判断接收一帧完整数据的 ...

RxXferSize? 这个不是HAL库里huart的句柄里面的变量么
HAL_UART_Receive_IT(&huart1, g_tBspUart.pRxBuf, g_tBspUart.rxSize);

那么在HAL_UART_Receive_IT函数里面 RxXferSize = g_tBspUart.rxSize;
RxXferCount = g_tBspUart.rxSize;

在接收中断里 RxXferCount是递减的,产生空闲中断的话 根据 RxXferCount获取剩余空间
最大空间 RxXferSize  - RxXferCount = 接收到的字节数

DMA是通过查询 NDTR寄存器获取的,和DMA区别就是从哪里获取剩余空间,处理方式类似。不知道你具体想问什么

回复

使用道具 举报

12

主题

80

帖子

0

精华

高级会员

Rank: 4

积分
581
金钱
581
注册时间
2019-8-6
在线时间
132 小时
 楼主| 发表于 2020-12-15 13:30:12 | 显示全部楼层
旮旯旭 发表于 2020-12-15 11:16
RxXferSize? 这个不是HAL库里huart的句柄里面的变量么
HAL_UART_Receive_IT(&huart1, g_tBspUart.pRxBuf ...

想问的就是 现在用的是STM32F103RCT6 UART5,这个串口是没法配置DMA的(相当于只用到了HAL_UART_Receive_IT对吧);
用了您写的BSP_UART_IDLE_Handler之后能完整的收到一帧数据了,但是您是用什么办法确保收到的的确是完整的一帧数据的?原理是什么,谢谢您
回复

使用道具 举报

4

主题

84

帖子

1

精华

高级会员

Rank: 4

积分
666
金钱
666
注册时间
2013-10-21
在线时间
88 小时
发表于 2020-12-15 14:05:55 | 显示全部楼层
lyy26655 发表于 2020-12-15 13:30
想问的就是 现在用的是STM32F103RCT6 UART5,这个串口是没法配置DMA的(相当于只用到了HAL_UART_Receive_ ...

1、原理不就是串口的空闲中断超时方式么,1个数据接收完成以后也就是产生了RXNE中断以后,1个数据时间内没有再接收到数据这个时候就会产生IDLE中断标志,也就是通过串口空闲中断方式接收的超时时间是1个数据的时间和波特率有关系。接收到1包数据以后在中断里置Flag,终止本次传输,同时再次开启下一次接收。
2、像AT指令这种返回的数据都是\r\n结尾的,你判断下最后2个字节的数据是不是 0x0D 0x0A呗,握手协议都有帧头帧尾+校验等方式的,或者符合一定格式的。看前面说的AT的话 就判断最后是不是0D 0A结尾

你是想问 2 里面的描述?
回复

使用道具 举报

12

主题

80

帖子

0

精华

高级会员

Rank: 4

积分
581
金钱
581
注册时间
2019-8-6
在线时间
132 小时
 楼主| 发表于 2020-12-15 14:13:59 | 显示全部楼层
旮旯旭 发表于 2020-12-15 14:05
1、原理不就是串口的空闲中断超时方式么,1个数据接收完成以后也就是产生了RXNE中断以后,1个数据时间内 ...

真的非常感谢您耐心又详尽的解答,您要是再整理下发个贴相信可以帮助到更多的人,再次感谢
回复

使用道具 举报

12

主题

80

帖子

0

精华

高级会员

Rank: 4

积分
581
金钱
581
注册时间
2019-8-6
在线时间
132 小时
 楼主| 发表于 2020-12-15 14:34:29 | 显示全部楼层
Acuity 发表于 2020-12-10 20:21
空闲中断时间太短,不适合用来判断一帧;有时可能因为发送端的延迟,导致误判;开一个计时器,比如10ms未收 ...

您的思路挺好,参考了,谢谢
回复

使用道具 举报

4

主题

84

帖子

1

精华

高级会员

Rank: 4

积分
666
金钱
666
注册时间
2013-10-21
在线时间
88 小时
发表于 2020-12-15 15:19:59 | 显示全部楼层
lyy26655 发表于 2020-12-15 14:34
您的思路挺好,参考了,谢谢

STM32V6之串口HAL库接收不定长字节数据方法三 心跳相对超时判断
http://www.armbbs.cn/forum.php?mod=viewthread&tid=101395

STM32V6之串口HAL库接收不定长字节数据方法二-定时器超时计数-单数据接收模式
http://www.armbbs.cn/forum.php?mod=viewthread&tid=101391

为啥我想打你,话说你想自定义2个字节之间的超时时间,我明明有写方式二和方式三
不就是你想要的么。
回复

使用道具 举报

12

主题

80

帖子

0

精华

高级会员

Rank: 4

积分
581
金钱
581
注册时间
2019-8-6
在线时间
132 小时
 楼主| 发表于 2020-12-15 16:06:10 | 显示全部楼层
本帖最后由 lyy26655 于 2020-12-15 16:12 编辑
旮旯旭 发表于 2020-12-15 15:19
STM32V6之串口HAL库接收不定长字节数据方法三 心跳相对超时判断
http://www.armbbs.cn/forum.php?mod=vi ...

哈哈 我看到了 单纯说IDLE这个方式,谢谢您补充
回复

使用道具 举报

12

主题

80

帖子

0

精华

高级会员

Rank: 4

积分
581
金钱
581
注册时间
2019-8-6
在线时间
132 小时
 楼主| 发表于 2021-4-25 21:43:59 | 显示全部楼层
旮旯旭 发表于 2020-12-15 15:19
STM32V6之串口HAL库接收不定长字节数据方法三 心跳相对超时判断
http://www.armbbs.cn/forum.php?mod=vi ...

以移远的BC20为例

您好 现在遇到个问题 用的方式是              STM32V6之串口HAL库接收不定长字节数据方法二-定时器超时计数-单数据接收模式               http://www.armbbs.cn/forum.php?mod=viewthread&tid=101391

比如有一条AT指令

[20:59:24.685]发→◇AT+MIPLOPEN=0,86400

[20:59:24.692]收←◆AT+MIPLOPEN=0,86400
OK

[20:59:24.939]收←◆
+MIPLEVENT: 0,4

[20:59:26.368]收←◆
+MIPLEVENT: 0,6

只有收到最后一条消息+MIPLEVENT: 0,6才能证明登陆成功 判断成功登陆的条件是if(strstr((const char*)g_tBspUart.pRxBuf,(const char*)"0,6") != NULL)

如果用常规接收方式比如串口空闲中断 因为时间(注意时间)原因可能会被分割为三帧

从发送到接收完最后一包数据 一共需要近2s 也就是2000ms的时间 但我不可能就为了这一条数据 就把接收超时时间设置的特别长 对吗

还有就是AT指令程序设计 比如MCU给模块发一条指令
HAL_UART_Transmit(&huart3,close_command_echo,sizeof(close_command_echo),0xffff);
delay_ms(1500);
为了保证能收到消息 我都会加一个delay_ms延时

然后用strstr函数做判断  看收到的东西对不对 但有些时候不知道是不是延时的问题 打印到串口1的消息就会缺失

然后整个AT指令的发送与判断是用switch case来做的 指令基本都是用这样的代码再重复

                HAL_UART_Transmit(&huart3,request_signal_quality,strlen(request_signal_quality),0xffff);
                delay_ms(1500);
                                if(strstr((const char*)g_tBspUart.pRxBuf,(const char*)"OK") != NULL)
                                        {       
                                        sscanf(g_tBspUart.pRxBuf,"\r\n+CESQ: %[^,],%[^,],%[^,],%[^,],%[^,],%s\r\n\r\nOK",&signal_value_t.signal_quality,\
                                        &signal_value_t.bit_error_rate,&signal_value_t.RSCP,&signal_value_t.Ec_No,\
                                        &signal_value_t.RSRQ,&signal_value_t.RSRP);     //存到结构体数组里的信息有时候会丢失 打印出来是空白的 不知道是不是因为接收的时候有问题?
                                               
                                        clear_buffer();       

                                        sprintf(return_signal_quality,\
                                        "[BC20]Extend signal_quality: %s\r\n             bit error rate: %s\r\n                       RSCP: %s\r\n                      Ec_No: %s\r\n                       RSRQ: %s\r\n                       RSRP: %s\r\n",\
                                        &signal_value_t.signal_quality,&signal_value_t.bit_error_rate,\
                                        &signal_value_t.RSCP,&signal_value_t.Ec_No,&signal_value_t.RSRQ,&signal_value_t.RSRP);
                                                       
                                        HAL_UART_Transmit(&huart1,return_signal_quality,strlen(return_signal_quality),0xffff); //某些时候打印出来的内容就是空白的 说明sscanf并没有格式化数据存储到结构体数组里 偶尔会存在这个问题 现在就不知道原因是不是和延时有关系
如果有关系 应该怎么处理呢
                                                       
                                        memset(return_signal_quality,0,sizeof(return_signal_quality));       
       
                                        a=3;
                                        g_tBspUart.rxFlag=0;
                                        break;
                                        }

回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-25 00:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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