OpenEdv-开源电子网

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

stm32固件库 串口接收无法接收0x00的问题

[复制链接]

1

主题

7

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2019-5-24
在线时间
15 小时
发表于 2020-4-7 21:40:38 | 显示全部楼层 |阅读模式
10金钱
我有一个数据中包含  0x00   但是检测到0x00的时候就会停止接收  ,无法存进buff里,大佬们有没有什么思路可以接收完整的不定长数据         数据例如   30 00  64 20   
我的接收函数是这么写的

void USART1_IRQHandler(void)                        //串口1中断服务程序
{
         static u8 i = 0;

    if(USART_GetITStatus(USART1, USART_IT_RXNE))
    {
        RXBuffer[i++] = USART_ReceiveData(USART1);
        if(i==RXBUFFER_LEN)                          
        {
            i = RXBUFFER_LEN-1;
        }
    }

    if(USART_GetITStatus(USART1, USART_IT_IDLE))
    {
        USART_ReceiveData(USART1);           
        i = 0;
    }
  }


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2020-4-7 22:10:42 | 显示全部楼层
你这代码就可以  c的字符串处理函数遇见\0就结束了,自己处理就好了
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2020-4-8 01:15:00 | 显示全部楼层
仿真看看
回复

使用道具 举报

22

主题

2251

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4480
金钱
4480
注册时间
2013-4-22
在线时间
337 小时
发表于 2020-4-8 10:58:09 | 显示全部楼层
你这个中断写的有问题吧,为什么不清中断呢还是就是校验溢出错误
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2019-5-24
在线时间
15 小时
 楼主| 发表于 2020-4-8 15:11:54 | 显示全部楼层
nashui_sx 发表于 2020-4-7 22:10
你这代码就可以  c的字符串处理函数遇见\0就结束了,自己处理就好了

我就是想让他不遇到0x00结束,大佬能给个思路吗
回复

使用道具 举报

6

主题

211

帖子

0

精华

高级会员

Rank: 4

积分
833
金钱
833
注册时间
2019-12-17
在线时间
157 小时
发表于 2020-4-8 19:51:16 | 显示全部楼层
世间皆虚妄 发表于 2020-4-8 15:11
我就是想让他不遇到0x00结束,大佬能给个思路吗

调试看看,你这个接收应该是不会由于接收到0x00导致停止
回复

使用道具 举报

2

主题

8

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2020-1-2
在线时间
7 小时
发表于 2020-4-8 20:36:38 来自手机 | 显示全部楼层
循环buf,读,写双指针,中断往里写,启动帧超时计时器,住循环往外读,超时没数了,认为结束。实际通信,一般加帧头帧尾,长度,校验,转义等。
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2020-4-8 20:51:21 | 显示全部楼层
世间皆虚妄 发表于 2020-4-8 15:11
我就是想让他不遇到0x00结束,大佬能给个思路吗

最简单就是,处理之前循环查找到0,记住位置
处理前面的字符串混合数字数组,处理完拷贝记住的位置到接收长度到接收buf[0],不归零接收完成标志,下一个循环自然就处理后面的了

复杂的用fifo  或者接收的时候就串口中断把帧断开,不粘包就可以了
回复

使用道具 举报

3

主题

1155

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7464
金钱
7464
注册时间
2015-1-15
在线时间
1368 小时
发表于 2020-4-8 21:04:06 来自手机 | 显示全部楼层
这代码看起来也没啥问题啊
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2019-5-24
在线时间
15 小时
 楼主| 发表于 2020-4-8 23:18:28 | 显示全部楼层
y284858 发表于 2020-4-8 19:51
调试看看,你这个接收应该是不会由于接收到0x00导致停止

然而不接到0x00  其他非0数据接收一点问题都没有   遇到0x00 的数据他就 停止接收了
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2019-5-24
在线时间
15 小时
 楼主| 发表于 2020-4-8 23:22:37 | 显示全部楼层
ggife 发表于 2020-4-8 20:36
循环buf,读,写双指针,中断往里写,启动帧超时计时器,住循环往外读,超时没数了,认为结束。实际通信,一 ...

加帧头帧尾比较不现实,接到的数据比较杂,你这个思路是超时处理吗?我在想是不是读到0x00以为结束了  没等到下一个字节来就退出去了  超时可能是种办法,双指针是啥意思不是很理解
回复

使用道具 举报

6

主题

211

帖子

0

精华

高级会员

Rank: 4

积分
833
金钱
833
注册时间
2019-12-17
在线时间
157 小时
发表于 2020-4-17 09:47:34 | 显示全部楼层
本帖最后由 y284858 于 2020-4-17 09:49 编辑
世间皆虚妄 发表于 2020-4-8 23:18
然而不接到0x00  其他非0数据接收一点问题都没有   遇到0x00 的数据他就 停止接收了

你调试看看!
调试看看!
调试看看!这个中断处理是可以接收0X00的,你大概是在数据处理的时候把0x00处理掉了。你要接收任意长度的数据可以用空闲中断+超时判断,但是你要保证不会超出接收缓存buf




回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-25 10:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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