OpenEdv-开源电子网

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

ESP8266-SDK 串口接收一帧数据里有十六进制0xff会偶尔触发两次串口中断,如何解决?

[复制链接]

53

主题

567

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2107
金钱
2107
注册时间
2017-2-11
在线时间
307 小时
发表于 2020-8-31 22:34:18 | 显示全部楼层 |阅读模式
10金钱
本帖最后由 jiangyy 于 2020-8-31 22:38 编辑

我是基于NONOS-SDK开发的,ESP8266 串口接收来自串口助手发送的一帧数据,当ESP8266接收的数据中包含十六进制0xFF的时候,这帧数据会被分成两次接收,也就是串口中断产生两次,如何解决?

举例:
串口助手下发一帧十六进制数据包:AB CD 04 FF 01 3A B6,此时ESP8266的串口偶尔会产生两次中断,这帧数据会被截断两帧数据AB CD 04 FF和01 3A B6。
我要换成字符串形式发送,不会出现断包现象。

我的应用需求是这样的:ESP8266的串口接收一个完整的数据包,然后在串口中断里面,将这帧数据通过TCP发送函数发出去。现在的难点是串口偶尔不能完整接收一帧数据,如何保证一个接收一个完整的数据包。

下图是该现象发生:

我的问题

我的问题

MSDN类似问题

MSDN类似问题
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

22

主题

2251

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4480
金钱
4480
注册时间
2013-4-22
在线时间
337 小时
发表于 2020-9-1 13:14:28 | 显示全部楼层
看下处理机制,是不是有地方默认了0xff就是结束。
回复

使用道具 举报

53

主题

567

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2107
金钱
2107
注册时间
2017-2-11
在线时间
307 小时
 楼主| 发表于 2020-9-2 14:07:26 | 显示全部楼层
三叶草 发表于 2020-9-1 13:14
看下处理机制,是不是有地方默认了0xff就是结束。

库封装了,只要库函数声明,没有看到具体的库函数内容。
回复

使用道具 举报

6

主题

211

帖子

0

精华

高级会员

Rank: 4

积分
833
金钱
833
注册时间
2019-12-17
在线时间
157 小时
发表于 2020-9-2 18:31:53 | 显示全部楼层
jiangyy 发表于 2020-9-2 14:07
库封装了,只要库函数声明,没有看到具体的库函数内容。

尝试做一个超时来解决,比如1ms没有收到新的数据就认为是一帧数据接收完成
回复

使用道具 举报

53

主题

567

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2107
金钱
2107
注册时间
2017-2-11
在线时间
307 小时
 楼主| 发表于 2020-9-4 10:28:08 | 显示全部楼层
y284858 发表于 2020-9-2 18:31
尝试做一个超时来解决,比如1ms没有收到新的数据就认为是一帧数据接收完成

你是说开启一个 软件定时器来判断吗?
回复

使用道具 举报

53

主题

567

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2107
金钱
2107
注册时间
2017-2-11
在线时间
307 小时
 楼主| 发表于 2020-9-4 10:28:33 | 显示全部楼层
回复

使用道具 举报

6

主题

211

帖子

0

精华

高级会员

Rank: 4

积分
833
金钱
833
注册时间
2019-12-17
在线时间
157 小时
发表于 2020-9-4 14:02:06 | 显示全部楼层
jiangyy 发表于 2020-9-4 10:28
你是说开启一个 软件定时器来判断吗?

差不多
回复

使用道具 举报

53

主题

567

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2107
金钱
2107
注册时间
2017-2-11
在线时间
307 小时
 楼主| 发表于 2020-9-4 15:36:36 | 显示全部楼层

哪数据怎么衔接在一起呢?如果一帧数据有多个  0xff的话,那就中断好几次了,断断续续的。
回复

使用道具 举报

6

主题

211

帖子

0

精华

高级会员

Rank: 4

积分
833
金钱
833
注册时间
2019-12-17
在线时间
157 小时
发表于 2020-9-4 18:22:02 | 显示全部楼层
jiangyy 发表于 2020-9-4 15:36
哪数据怎么衔接在一起呢?如果一帧数据有多个  0xff的话,那就中断好几次了,断断续续的。

你超时断帧在断之前是存在一起的
回复

使用道具 举报

6

主题

211

帖子

0

精华

高级会员

Rank: 4

积分
833
金钱
833
注册时间
2019-12-17
在线时间
157 小时
发表于 2020-9-4 18:26:52 | 显示全部楼层
jiangyy 发表于 2020-9-4 15:36
哪数据怎么衔接在一起呢?如果一帧数据有多个  0xff的话,那就中断好几次了,断断续续的。

本来数据存在buf1里面,在第一次数据接收断帧时不处理数据,设置延时时间,下一次收到继续在原来的基础上存数据并更新延时时间,直到延时时间到达没有收到数据这时候给出一个标志位,只有在检测到超时时间的时候才处理这样数据就是在一起的。
回复

使用道具 举报

53

主题

567

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2107
金钱
2107
注册时间
2017-2-11
在线时间
307 小时
 楼主| 发表于 2020-9-7 16:28:13 | 显示全部楼层
y284858 发表于 2020-9-4 18:26
本来数据存在buf1里面,在第一次数据接收断帧时不处理数据,设置延时时间,下一次收到继续在原来的基础上 ...

你用的是软件定时器还是硬件定时器?能否提供一下你的代码例程,我借鉴一下
回复

使用道具 举报

6

主题

211

帖子

0

精华

高级会员

Rank: 4

积分
833
金钱
833
注册时间
2019-12-17
在线时间
157 小时
发表于 2020-9-8 18:09:33 | 显示全部楼层
jiangyy 发表于 2020-9-7 16:28
你用的是软件定时器还是硬件定时器?能否提供一下你的代码例程,我借鉴一下

用软件定时器和硬件定时器都可以
DATA_cnt1 = DMA_GetCurrDataCounter(DMA1_Channel5); //获取dma搬运数据长度
                if (DATA_cnt1 != USART_BUFF_MAX)//比较是否等于设置长度如果不等于表示已经开始接收数据
                {
                        static u16 DATA_cnt2 = 0;//保存上一次查询长度
                        static u8 delay_cnt = 0;
                        if (DATA_cnt1 != DATA_cnt2)//比较本次长度是否等于上次长度
                        {
                                DATA_cnt2 = DATA_cnt1;//长度发生变化保存新的长度
                                delay_cnt = 0;//清零即计时
                        }
                        else
                        {
                                if (delay_cnt++>2)//如果长度没有变化计时加一
                                {//如果3毫秒接收数据长度没有发生改变认为数据接收完成,这个时间跟据你自己情况调节
                                        delay_cnt = 0;
                                        U1_Read_L = USART_BUFF_MAX - DATA_cnt2;//记录数据长度
                                        DATA_cnt2 = USART_BUFF_MAX;//数据长度重置
                                        DMA_Cmd(DMA1_Channel5, DISABLE);

                                        //设置传输数据长度
                                        DMA_SetCurrDataCounter(DMA1_Channel5, USART_BUFF_MAX);

                                        //打开DMA
                                        DMA_Cmd(DMA1_Channel5, ENABLE);

                                        UART1_DATA_FLAG = 1;//标记数据接收完成,退出中断后在主程序中处理
                                }
                        }
                }
回复

使用道具 举报

6

主题

211

帖子

0

精华

高级会员

Rank: 4

积分
833
金钱
833
注册时间
2019-12-17
在线时间
157 小时
发表于 2020-9-8 18:11:40 | 显示全部楼层
jiangyy 发表于 2020-9-7 16:28
你用的是软件定时器还是硬件定时器?能否提供一下你的代码例程,我借鉴一下

我没做8266,给你的是stm32串口接收的但是原理是一样的
回复

使用道具 举报

53

主题

567

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2107
金钱
2107
注册时间
2017-2-11
在线时间
307 小时
 楼主| 发表于 2020-12-3 10:30:04 | 显示全部楼层
有贴友知道怎么解决吗?不能沉下去啊~!
回复

使用道具 举报

53

主题

567

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2107
金钱
2107
注册时间
2017-2-11
在线时间
307 小时
 楼主| 发表于 2020-12-3 16:19:16 | 显示全部楼层
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2020-12-3 17:36:16 | 显示全部楼层
把你的数据先做Coding,增加控制键值比如0xCD
数据是0xCD 就改为 0xCD, 0xCD
数据是0xFF 就改为 0xCD, 0xFE

接收后用相同的方法解码, 这样就可以避免发送的数据含0xFF, 缺点是数据会变长了, 还需要浪费资源编码解码
回复

使用道具 举报

53

主题

567

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2107
金钱
2107
注册时间
2017-2-11
在线时间
307 小时
 楼主| 发表于 2020-12-3 19:59:35 | 显示全部楼层
edmund1234 发表于 2020-12-3 17:36
把你的数据先做Coding,增加控制键值比如0xCD
数据是0xCD 就改为 0xCD, 0xCD
数据是0xFF 就改为 0xCD,  ...

十六进制发送,避免不了这种0xff,如果采集的数据值有0xff是无法避免的,只能在中断里面处理了。我也不清楚这个BUG是不是官方库导致的
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-14 13:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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