OpenEdv-开源电子网

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

请教下各位,串口接收数据存入外部flash的问题!

[复制链接]

18

主题

67

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
375
金钱
375
注册时间
2015-9-15
在线时间
98 小时
发表于 2016-8-4 15:56:21 | 显示全部楼层 |阅读模式
3金钱

在做关于串口接收的数据放入外部flash当中,串口中断当中每接收到4k数据,就设置标志位,在主函数中写入。
我写入的文件有6k,先写4k,剩下的再写。程序如下,[mw_shl_code=c,true]if(flag_usart)
                                {
                                        flag_usart=0;
                                  W25QXX_Write(USART_BUF,q*4096,4096);
                                  q++;
                                }
                 if(w)
                 {
                                if(w==old)
                                        {
                                                lenth=w;
                                                lenth1=lenth+q*4096;
                                                printf("3¤¶èÎa%d\r\n",lenth1);
                                                W25QXX_Write(USART_BUF,q*4096,lenth);
                                                old=0;
                                                q=0;
                                                w=0;
                                                flag_update=1;
                                        }
        else
           old=w;
                 }
  delay_ms(3);
                 if(flag_update)
                 {
                         flag_update=0;
                         W25QXX_Read(Buff1,0,100);
                         for(i=0;i<100;i++)
                         {
                                 printf("%x\r\n",Buff1);
                         }
                 }[/mw_shl_code]

下面是中断函数[mw_shl_code=c,true]if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
                {
                  USART_ClearITPendingBit(USART1,USART_IT_RXNE);
                        USART_BUF[w] =USART_ReceiveData(USART1);       
                        w++;
     }
        if(w==4096)
        {
                w=0;
                flag_usart=1;
}[/mw_shl_code]。
问题来了!我在读flash的时候,为什么读出来的是4k地址,开始的100个字节数据??并不是从地址0 开始的数据

最佳答案

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

要么全部接收完了再写,要么N个一组一组的写。定义2个N个长度的数组,1个专门接收数据,接收完N个后复制进入另外一个数组,写数据的时候写另外一个数组的数据。不要随便加printf ;这个函数要时间的
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-8-4 15:56:22 | 显示全部楼层
本帖最后由 憨厚诚实大叔 于 2016-8-4 17:00 编辑

要么全部接收完了再写,要么N个一组一组的写。定义2个N个长度的数组,1个专门接收数据,接收完N个后复制进入另外一个数组,写数据的时候写另外一个数组的数据。不要随便加printf ;这个函数要时间的
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11544
金钱
11544
注册时间
2014-4-1
在线时间
1315 小时
发表于 2016-8-4 16:08:09 | 显示全部楼层

没听懂。。。

回复

使用道具 举报

18

主题

67

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
375
金钱
375
注册时间
2015-9-15
在线时间
98 小时
 楼主| 发表于 2016-8-4 16:14:01 | 显示全部楼层

不好意思,描述的不太清楚。
我写入6k字节。串口中断的时候,4k就写入一次。剩余的再写入。我想验证下我发送的数据对不对。然后我用W25Qxx_READ函数读出地址0开始的100个数据。
我用winhex打开我发送的bin文件,一对比。发现,函数读出的第一个数据是bin的第4096个字节。
回复

使用道具 举报

55

主题

159

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2016-7-16
在线时间
64 小时
发表于 2016-8-4 16:18:57 | 显示全部楼层
求人不如求己。告诉一个办法,单步执行,然后观察变量或数组的值变化情况,你就会搞清问题出在哪里。
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-8-4 16:23:23 | 显示全部楼层
weewwewe 发表于 2016-8-4 16:14
不好意思,描述的不太清楚。
我写入6k字节。串口中断的时候,4k就写入一次。剩余的再写入。我想验证下我 ...

写数据要时间的,特别是你接收完4K再擦除写数据,擦除的时间长,在你擦除的时候,前面的给覆盖了
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11544
金钱
11544
注册时间
2014-4-1
在线时间
1315 小时
发表于 2016-8-4 16:24:19 | 显示全部楼层

串口接收,保存,
然后写入存储器。

在串口接收的位置检查,看接收数据对不对;
然后再查写入过程。

回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-8-4 16:26:41 | 显示全部楼层
如果比特率太高,也有可能程序没运行到写的地方,新的数据又来了,给覆盖了
回复

使用道具 举报

18

主题

67

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
375
金钱
375
注册时间
2015-9-15
在线时间
98 小时
 楼主| 发表于 2016-8-4 16:33:10 | 显示全部楼层
憨厚诚实大叔 发表于 2016-8-4 16:23
写数据要时间的,特别是你接收完4K再擦除写数据,擦除的时间长,在你擦除的时候,前面的给覆盖了

谢谢你的回答。
我感觉是不是我分开写处理的不合适。我写3.8k的数据,也要擦除4k,但是就是正常的。只要大于4k就要分开写入,就会有问题。
回复

使用道具 举报

18

主题

67

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
375
金钱
375
注册时间
2015-9-15
在线时间
98 小时
 楼主| 发表于 2016-8-4 16:34:40 | 显示全部楼层
xuande 发表于 2016-8-4 16:24
串口接收,保存,
然后写入存储器。

有点怪的是,我前面已经写入了4k,总共写入了6k。读地址0的数据是4k过后的第一个数据。感觉前4k丢失了。
回复

使用道具 举报

18

主题

67

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
375
金钱
375
注册时间
2015-9-15
在线时间
98 小时
 楼主| 发表于 2016-8-4 16:35:11 | 显示全部楼层
清秋枫叶 发表于 2016-8-4 16:18
求人不如求己。告诉一个办法,单步执行,然后观察变量或数组的值变化情况,你就会搞清问题出在哪里。

恩恩,谢谢你建议。我看看
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-8-4 16:41:17 | 显示全部楼层
weewwewe 发表于 2016-8-4 16:33
谢谢你的回答。
我感觉是不是我分开写处理的不合适。我写3.8k的数据,也要擦除4k,但是就是正常的。只要 ...

你都没听懂我的意思,你知道擦除一页要多久么,你知道你传一个字节过来要多久么,擦除flash写flash数据的时候是不会相应中断的,你看看你的第二个数据是不是4097的数据
回复

使用道具 举报

18

主题

67

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
375
金钱
375
注册时间
2015-9-15
在线时间
98 小时
 楼主| 发表于 2016-8-4 16:48:22 | 显示全部楼层
憨厚诚实大叔 发表于 2016-8-4 16:41
你都没听懂我的意思,你知道擦除一页要多久么,你知道你传一个字节过来要多久么,擦除flash写flash数据的 ...

擦除一页不清楚,波特率9600情况下,接收一个字节大概1ms吧。
第二个字节是4097,读出的数据是4096后面的100个数据
回复

使用道具 举报

18

主题

67

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
375
金钱
375
注册时间
2015-9-15
在线时间
98 小时
 楼主| 发表于 2016-8-4 16:51:16 | 显示全部楼层
憨厚诚实大叔 发表于 2016-8-4 16:41
你都没听懂我的意思,你知道擦除一页要多久么,你知道你传一个字节过来要多久么,擦除flash写flash数据的 ...

如果是覆盖的话,有什么方法可以避免呢?请教下思路
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-8-4 16:52:10 | 显示全部楼层
printf("3¤&para;è&Icirc;a%d\r\n",lenth1); 怪不得会过冲,把所有的 printf去掉,然后确认接收完了再读数据
回复

使用道具 举报

18

主题

67

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
375
金钱
375
注册时间
2015-9-15
在线时间
98 小时
 楼主| 发表于 2016-8-4 16:59:36 | 显示全部楼层
憨厚诚实大叔 发表于 2016-8-4 16:52
printf("3¤&para;è&Icirc;a%d\r\n",lenth1); 怪不得会过冲,把所有的 printf去掉,然后确认接收完了再读 ...

你好,删除了printf还是老样子
在确认数据是否发送完,我采用的原子大哥的方法,所以我加了3ms延时,这会不会影响呢?
回复

使用道具 举报

18

主题

67

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
375
金钱
375
注册时间
2015-9-15
在线时间
98 小时
 楼主| 发表于 2016-8-4 17:03:30 | 显示全部楼层
憨厚诚实大叔 发表于 2016-8-4 16:59
要么全部接收完了再写,要么N个一组一组的写。定义2个N个长度的数据,1个专门接收数据,接收完N个后复制进 ...

因为数会有点大。定义一个大数组,空间不够。我试试你的思路,谢谢哈
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-8-4 17:12:08 | 显示全部楼层
weewwewe 发表于 2016-8-4 17:03
因为数会有点大。定义一个大数组,空间不够。我试试你的思路,谢谢哈

我IAP就是这样协议更新的。你擦除和写flash的时候最好监视看看有没有错误
回复

使用道具 举报

18

主题

67

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
375
金钱
375
注册时间
2015-9-15
在线时间
98 小时
 楼主| 发表于 2016-8-4 17:13:29 | 显示全部楼层
憨厚诚实大叔 发表于 2016-8-4 17:12
我IAP就是这样协议更新的。你擦除和写flash的时候最好监视看看有没有错误

恩恩,谢谢你哈。我试试
回复

使用道具 举报

18

主题

67

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
375
金钱
375
注册时间
2015-9-15
在线时间
98 小时
 楼主| 发表于 2016-8-4 17:24:30 | 显示全部楼层
憨厚诚实大叔 发表于 2016-8-4 17:12
我IAP就是这样协议更新的。你擦除和写flash的时候最好监视看看有没有错误

感谢!
你说的双数组的方法可以正确接收到数据
回复

使用道具 举报

18

主题

67

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
375
金钱
375
注册时间
2015-9-15
在线时间
98 小时
 楼主| 发表于 2016-8-4 17:25:41 | 显示全部楼层
weewwewe 发表于 2016-8-4 17:24
感谢!
你说的双数组的方法可以正确接收到数据

我也在做IAP更新!
现在可以进行下一步了
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-8-4 17:55:39 | 显示全部楼层
weewwewe 发表于 2016-8-4 17:25
我也在做IAP更新!
现在可以进行下一步了

我用的030的,操作flash一定要注意时间,擦除和写都是要时间的
回复

使用道具 举报

58

主题

359

帖子

0

精华

高级会员

Rank: 4

积分
987
金钱
987
注册时间
2014-9-29
在线时间
261 小时
发表于 2016-8-4 18:41:34 | 显示全部楼层
用环形缓冲区比较好   不怕覆盖
另外写是要时间的
回复

使用道具 举报

18

主题

67

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
375
金钱
375
注册时间
2015-9-15
在线时间
98 小时
 楼主| 发表于 2016-8-4 21:21:31 | 显示全部楼层
闪电之舞 发表于 2016-8-4 18:41
用环形缓冲区比较好   不怕覆盖
另外写是要时间的

恩恩,谢谢建议。环形缓冲区是什么呢
回复

使用道具 举报

58

主题

359

帖子

0

精华

高级会员

Rank: 4

积分
987
金钱
987
注册时间
2014-9-29
在线时间
261 小时
发表于 2016-8-6 11:23:19 | 显示全部楼层
weewwewe 发表于 2016-8-4 21:21
恩恩,谢谢建议。环形缓冲区是什么呢

ringbuffer   网上好多例子的,来讲这个
回复

使用道具 举报

18

主题

67

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
375
金钱
375
注册时间
2015-9-15
在线时间
98 小时
 楼主| 发表于 2016-8-8 10:49:40 | 显示全部楼层
闪电之舞 发表于 2016-8-6 11:23
ringbuffer   网上好多例子的,来讲这个

恩恩,我好久看看。谢谢
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-9 08:42

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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