OpenEdv-开源电子网

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

读取flash与字体文件的内容不同

[复制链接]

14

主题

46

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
260
金钱
260
注册时间
2012-3-22
在线时间
53 小时
发表于 2021-7-4 18:57:18 | 显示全部楼层 |阅读模式
1金钱
请问一下,我直接通过读取flash内部的12M的地址开始的内容,是不是应该跟sd卡内的文件的内容一致呢?
    W25QXX_Read(tempArray, 12 * 1024 * 1024, 10);
    for(i = 0; i < 10; i++)
    {
        while((USART1->SR & 0X40) == 0); //循环发送,直到发送完毕
        USART1->DR = (u8) tempArray;
        delay_ms(100);
    }

上面代码是从12M开始读取10个字节的数据,然后发到串口,接收到内容:
AA 21 00 C0 00 08 A9 02 00 29


然后我用ultraedit打开SD卡内的UNIGBK文件,开头是对不上的,我用搜索也没有找到,在其他的3个字体文件里面也没有发现类似的内容,请问这个是怎么回事呢?谢谢!



最佳答案

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

代码里面是先把字库结构体存放之后再存放的bin文件与字库文件。结构体占用33字节,所以你要读bin文件的话,要在12M+33字节开始读取
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

15

主题

1061

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
3625
金钱
3625
注册时间
2019-8-14
在线时间
1054 小时
发表于 2021-7-4 18:57:19 | 显示全部楼层
代码里面是先把字库结构体存放之后再存放的bin文件与字库文件。结构体占用33字节,所以你要读bin文件的话,要在12M+33字节开始读取 6565.png
02122.png
回复

使用道具 举报

14

主题

46

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
260
金钱
260
注册时间
2012-3-22
在线时间
53 小时
 楼主| 发表于 2021-7-4 18:58:09 | 显示全部楼层
图片粘贴没有成功
在发一下图片

回复

使用道具 举报

14

主题

46

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
260
金钱
260
注册时间
2012-3-22
在线时间
53 小时
 楼主| 发表于 2021-7-4 19:00:22 | 显示全部楼层
又上传一次图片

HanZi.jpg
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2021-7-5 02:15:38 | 显示全部楼层
字体显示正常么?
回复

使用道具 举报

14

主题

46

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
260
金钱
260
注册时间
2012-3-22
在线时间
53 小时
 楼主| 发表于 2021-7-5 10:23:32 | 显示全部楼层
谢谢原子!
显示是正常,所以感觉挺纳闷的,地址错了吗?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2021-7-6 00:31:56 | 显示全部楼层
mcumaster000 发表于 2021-7-5 10:23
谢谢原子!
显示是正常,所以感觉挺纳闷的,地址错了吗?

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

使用道具 举报

14

主题

46

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
260
金钱
260
注册时间
2012-3-22
在线时间
53 小时
 楼主| 发表于 2021-7-6 09:23:31 | 显示全部楼层
谢谢原子!
不想过多耽误你时间,这个是代码:
W25QXX_Read(tempArray, 12 * 1024 * 1024, 10);
    for(i = 0; i < 10; i++)
    {
        while((USART1->SR & 0X40) == 0); //循环发送,直到发送完毕
        USART1->DR = (u8) tempArray;
        delay_ms(100);
    }
我读取的12*1024*1024地址错了没有?请给说一下就好!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2021-7-7 02:31:02 | 显示全部楼层
mcumaster000 发表于 2021-7-6 09:23
谢谢原子!
不想过多耽误你时间,这个是代码:
W25QXX_Read(tempArray, 12 * 1024 * 1024, 10);

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

使用道具 举报

3

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
188
金钱
188
注册时间
2019-10-28
在线时间
37 小时
发表于 2021-7-7 08:44:43 | 显示全部楼层
串口发送有问题,发送的一直都是数组的第一个内容,你要实现的应该是遍历数组吧?
回复

使用道具 举报

3

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2018-2-28
在线时间
16 小时
发表于 2021-7-7 09:07:44 | 显示全部楼层
USART1->DR = (u8) tempArray;你这发送的是什么?你改为USART1->DR = (u8) tempArray[i];试试
回复

使用道具 举报

14

主题

46

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
260
金钱
260
注册时间
2012-3-22
在线时间
53 小时
 楼主| 发表于 2021-7-7 19:45:42 | 显示全部楼层
谢谢原子,谢谢大家,
没有想到大家会继续回复,以为就是敷衍我一下就不管了呢,非常感谢!
我的代码发错了,
    W25QXX_Read(tempArray, 12 * 1024 * 1024, 10);
    for(i = 0; i < 10; i++)
    {
        while((USART1->SR & 0X40) == 0); //循环发送,直到发送完毕
        USART1->DR = (u8) tempArray[i];
        delay_ms(100);
    }
原子,我基本没有计算,就是读了一个地址,但是数据就是不对,我很诧异!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2021-7-8 01:40:58 | 显示全部楼层
mcumaster000 发表于 2021-7-7 19:45
谢谢原子,谢谢大家,
没有想到大家会继续回复,以为就是敷衍我一下就不管了呢,非常感谢!
我的代码发错 ...

肯定是一样的,不一样应该就是你读取的地址和从SD卡看的地址不一样。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

14

主题

46

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
260
金钱
260
注册时间
2012-3-22
在线时间
53 小时
 楼主| 发表于 2021-7-9 07:44:47 | 显示全部楼层
谢谢原子的回复,
我有重新测试了一下,步骤是先把SD根目录的Font里面的文件拷到SD卡里面,然后又再次刷了一下Flash,然后运行,字体显示正常。
然后我有读取并打印10个从12M开始的内容,还是跟之前一样的!!!
读出的数据(!!!)  AA 21 00 C0 00 08 A9 02 00 29
我感觉我操作的不错,但是我用ultraedit打开unigbk.bin文件(第一个更新的程序,应该是从12M地址开始更新的),看到的数据跟这个就是对不上,我在里面搜索也没有!!!

请原子也重复一下这个过程好吗,然后给一个答复,非常感谢!

方法就是,在汉字试验的程序中,while(1)之前加入下面的代码

    W25QXX_Read(tempArray, 12 * 1024 * 1024, 10);

    for(i = 0; i < 10; i++)
    {
        while((USART1->SR & 0X40) == 0); //循环发送,直到发送完毕
        USART1->DR = (u8) tempArray[i];
        delay_ms(100);
    }

然后在while(1)后面加(;),不让大循环进行,然后从串口看一下数据就行了,很方便的,再次感谢了!!!

回复

使用道具 举报

14

主题

46

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
260
金钱
260
注册时间
2012-3-22
在线时间
53 小时
 楼主| 发表于 2021-7-9 07:52:11 | 显示全部楼层
谢谢原子的答复,
我又重复了一次,先从SD根目录下的Font里面把几个字库文件都复制到SD卡,然后又更新字库到Flash,启动汉字程序,都正常。
之后从12M的Flahs读取10个字节的数据,数据如下:
AA 21 00 C0 00 08 A9 02 00 29
然后在电脑端用ultraedit打开unigbk.bin文件(这个是最先更新的文件,应该是在12M地址处),完全没有上面的数据。

请原子也重复一下我的步骤,给一个回复,很简单的,谢谢!

在汉字试验里面,在main函数前,声明数组,
u8 tempArray[10];
在while(1)前,复制下面的代码,

    W25QXX_Read(tempArray, 12 * 1024 * 1024, 10);

    for(i = 0; i < 10; i++)
    {
        while((USART1->SR & 0X40) == 0); //循环发送,直到发送完毕
        USART1->DR = (u8) tempArray[i];
        delay_ms(100);
    }
       
        然后停止大循环,在while(1)后面加;,就可以了!
       
        一直没有解决,谢谢了!
       
        上传答复,网页丢失了,我这个是打了两遍内容!
回复

使用道具 举报

14

主题

46

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
260
金钱
260
注册时间
2012-3-22
在线时间
53 小时
 楼主| 发表于 2021-7-9 07:52:50 | 显示全部楼层
谢谢原子的答复,
我又重复了一次,先从SD根目录下的Font里面把几个字库文件都复制到SD卡,然后又更新字库到Flash,启动汉字程序,都正常。
之后从12M的Flahs读取10个字节的数据,数据如下:
AA 21 00 C0 00 08 A9 02 00 29
然后在电脑端用ultraedit打开unigbk.bin文件(这个是最先更新的文件,应该是在12M地址处),完全没有上面的数据。

请原子也重复一下我的步骤,给一个回复,很简单的,谢谢!

在汉字试验里面,在main函数前,声明数组,
u8 tempArray[10];
在while(1)前,复制下面的代码,

    W25QXX_Read(tempArray, 12 * 1024 * 1024, 10);

    for(i = 0; i < 10; i++)
    {
        while((USART1->SR & 0X40) == 0); //循环发送,直到发送完毕
        USART1->DR = (u8) tempArray[i];
        delay_ms(100);
    }
       
        然后停止大循环,在while(1)后面加;,就可以了!
       
        一直没有解决,谢谢了!
       
        上传答复,网页丢失了,我这个是打了两遍内容!
回复

使用道具 举报

14

主题

46

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
260
金钱
260
注册时间
2012-3-22
在线时间
53 小时
 楼主| 发表于 2021-7-9 07:53:34 | 显示全部楼层
谢谢原子的答复,
我又重复了一次,先从SD根目录下的Font里面把几个字库文件都复制到SD卡,然后又更新字库到Flash,启动汉字程序,都正常。
之后从12M的Flahs读取10个字节的数据,数据如下:
AA 21 00 C0 00 08 A9 02 00 29
然后在电脑端用ultraedit打开unigbk.bin文件(这个是最先更新的文件,应该是在12M地址处),完全没有上面的数据。

请原子也重复一下我的步骤,给一个回复,很简单的,谢谢!

在汉字试验里面,在main函数前,声明数组,
u8 tempArray[10];
在while(1)前,复制下面的代码,

    W25QXX_Read(tempArray, 12 * 1024 * 1024, 10);

    for(i = 0; i < 10; i++)
    {
        while((USART1->SR & 0X40) == 0); //循环发送,直到发送完毕
        USART1->DR = (u8) tempArray[i];
        delay_ms(100);
    }
       
        然后停止大循环,在while(1)后面加;,就可以了!
       
        一直没有解决,谢谢了!
       
        上传答复,网页丢失了,我这个是打了两遍内容!
回复

使用道具 举报

14

主题

46

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
260
金钱
260
注册时间
2012-3-22
在线时间
53 小时
 楼主| 发表于 2021-7-9 07:54:44 | 显示全部楼层
谢谢原子的答复,
我又重复了一次,先从SD根目录下的Font里面把几个字库文件都复制到SD卡,然后又更新字库到Flash,启动汉字程序,都正常。
之后从12M的Flahs读取10个字节的数据,数据如下:
AA 21 00 C0 00 08 A9 02 00 29
然后在电脑端用ultraedit打开unigbk.bin文件(这个是最先更新的文件,应该是在12M地址处),完全没有上面的数据。

请原子也重复一下我的步骤,给一个回复,很简单的,谢谢!

在汉字试验里面,在main函数前,声明数组,
u8 tempArray[10];
在while(1)前,复制下面的代码,

    W25QXX_Read(tempArray, 12 * 1024 * 1024, 10);

    for(i = 0; i < 10; i++)
    {
        while((USART1->SR & 0X40) == 0); //循环发送,直到发送完毕
        USART1->DR = (u8) tempArray[i];
        delay_ms(100);
    }
       
        然后停止大循环,在while(1)后面加;,就可以了!
       
        一直没有解决,谢谢了!
       
        上传答复,网页丢失了,我这个是打了两遍内容!
回复

使用道具 举报

14

主题

46

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
260
金钱
260
注册时间
2012-3-22
在线时间
53 小时
 楼主| 发表于 2021-7-9 08:16:04 | 显示全部楼层
谢谢原子的答复,
我又重复了一次,先从SD根目录下的Font里面把几个字库文件都复制到SD卡,然后又更新字库到Flash,启动汉字程序,都正常。
之后从12M的Flahs读取10个字节的数据,数据如下:
AA 21 00 C0 00 08 A9 02 00 29
然后在电脑端用ultraedit打开unigbk.bin文件(这个是最先更新的文件,应该是在12M地址处),完全没有上面的数据。

请原子也重复一下我的步骤,给一个回复,很简单的,谢谢!

在汉字试验里面,在main函数前,声明数组,
u8 tempArray[10];
在while(1)前,复制下面的代码,

    W25QXX_Read(tempArray, 12 * 1024 * 1024, 10);

    for(i = 0; i < 10; i++)
    {
        while((USART1->SR & 0X40) == 0); //循环发送,直到发送完毕
        USART1->DR = (u8) tempArray[i];
        delay_ms(100);
    }
       
        然后停止大循环,在while(1)后面加;,就可以了!
       
        一直没有解决,谢谢了!
       
        上传答复,网页丢失了,我这个是打了两遍内容!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2021-7-10 01:59:14 | 显示全部楼层
mcumaster000 发表于 2021-7-9 08:16
谢谢原子的答复,
我又重复了一次,先从SD根目录下的Font里面把几个字库文件都复制到SD卡,然后又更新字库 ...

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

使用道具 举报

233

主题

961

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1814
金钱
1814
注册时间
2011-10-9
在线时间
230 小时
发表于 2021-7-10 16:51:15 | 显示全部楼层
本帖最后由 simms01 于 2021-7-10 17:02 编辑

没那么复杂啊  你这个问题 要不就是 数据没读对  要不就是发到串口过程有问题
那么 1. 读 flash 字库头10个字节 然后加起来 看看和是多少  打开这个文件 看看前10字节 和是多少。
如果不一样  那么就是这个字库写到flash过程中写错了 或者你读错了   

不是1  那么就是2  发串口过程有问题 。  一个一个找不好么

而且最好先发一个 AA55 看看串口是否正常 否则波特率错了搞死人

u8 tempArray[10];
在while(1)前,复制下面的代码,

    W25QXX_Read(tempArray, 12 * 1024 * 1024, 10);
while((USART1->SR & 0X40) == 0); //循环发送,直到发送完毕
USART1->DR = 0xaa;
while((USART1->SR & 0X40) == 0); //循环发送,直到发送完毕
USART1->DR = 0x55;

    for(i = 0; i < 10; i++)
    {
        while((USART1->SR & 0X40) == 0); //循环发送,直到发送完毕
        USART1->DR = (u8) tempArray [ i ];
        delay_ms(100);
    }
回复

使用道具 举报

233

主题

961

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1814
金钱
1814
注册时间
2011-10-9
在线时间
230 小时
发表于 2021-7-10 16:56:06 | 显示全部楼层
本帖最后由 simms01 于 2021-7-10 16:59 编辑

这个撤回 删掉了
回复

使用道具 举报

14

主题

46

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
260
金钱
260
注册时间
2012-3-22
在线时间
53 小时
 楼主| 发表于 2021-7-10 17:51:13 | 显示全部楼层
谢谢原子,我用的板子的精英板!
20楼的朋友,
我按照你的办法测试了,下面是返回的结果
AA 55 AA 21 00 C0 00 08 A9 02 00 29
多返回的AA 55 是你要求加上的,其他跟之前的数据是一样。也就是说串口是没有问题的!!波特率没有问题的!
读取数据错误?这个我之前问原子了,12*1024*1024,这个应该没有错啊,Flash也是用的本身的函数,完全没有改动,而且在
试验前,我更新字库了,那可以肯定函数不错的。
希望原子可以测试一下,谢谢了!
回复

使用道具 举报

233

主题

961

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1814
金钱
1814
注册时间
2011-10-9
在线时间
230 小时
发表于 2021-7-10 17:54:17 | 显示全部楼层
你先测试一下 flash的读写函数啊    写01-100进去 然后重新读回来 看对不对 。再不行看看写字库以及读字库函数是怎么写的  这个都写得很简单的
回复

使用道具 举报

14

主题

46

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
260
金钱
260
注册时间
2012-3-22
在线时间
53 小时
 楼主| 发表于 2021-7-11 15:13:50 | 显示全部楼层
谢谢啊,我都是用的源程序里面的函数,不应该错的啊?!如果你有正点原子的板子的话,可以测试一下吗?

原子,非常期待你能够给予一个有说服力的回复啊!!!
回复

使用道具 举报

14

主题

46

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
260
金钱
260
注册时间
2012-3-22
在线时间
53 小时
 楼主| 发表于 2021-7-13 11:51:22 | 显示全部楼层
原子,还没有解决啊!
请给予一个说明好吗?谢谢了!
回复

使用道具 举报

70

主题

6761

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13100
金钱
13100
注册时间
2012-11-26
在线时间
3811 小时
发表于 2021-7-13 13:15:14 | 显示全部楼层
一个debug就能解决的问题,耗了这么多天,只能说楼主牛逼
学无止境
回复

使用道具 举报

14

主题

46

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
260
金钱
260
注册时间
2012-3-22
在线时间
53 小时
 楼主| 发表于 2021-7-13 20:24:52 | 显示全部楼层
别笑话我,请实实在在的指点一下,debug怎么走呢,数据都打印出来了,还debug?现在数据不对,读的flash的内容跟sd卡的文件的内容不一样,地址也不错,用的读flash的函数是原子的源码,而且都已经更新flash了,你说到底怎么回事?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2021-7-14 02:43:46 | 显示全部楼层
mcumaster000 发表于 2021-7-13 11:51
原子,还没有解决啊!
请给予一个说明好吗?谢谢了!

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

使用道具 举报

14

主题

46

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
260
金钱
260
注册时间
2012-3-22
在线时间
53 小时
 楼主| 发表于 2021-7-14 08:02:44 | 显示全部楼层
好的,谢谢原子了,不想打扰你太多,但是一直没有解决。
谢谢了再次!
回复

使用道具 举报

70

主题

6761

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13100
金钱
13100
注册时间
2012-11-26
在线时间
3811 小时
发表于 2021-7-14 08:17:15 | 显示全部楼层
正点原子 发表于 2021-7-14 02:43
我让同事试试,回头回复你

他楼层首地址的错误代码和后面改过的代码竟然输出的一样

只能说代码有问题

让debug也不debug,只会看串口数据,还玻璃心
学无止境
回复

使用道具 举报

14

主题

46

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
260
金钱
260
注册时间
2012-3-22
在线时间
53 小时
 楼主| 发表于 2021-7-14 10:44:19 | 显示全部楼层
你好,麻烦你别老是批评我好吗?
我就是有问题解决不了,来踏踏实实的提问呢。
我用的是原子的源码啊,代码应该不错呢?debug的话,查看什么呢,你说的明确一点好吗?
回复

使用道具 举报

14

主题

46

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
260
金钱
260
注册时间
2012-3-22
在线时间
53 小时
 楼主| 发表于 2021-7-15 09:14:17 | 显示全部楼层
非常感谢,我测试一下去,这个才是真正的有说服力的解答!!!再次感谢!!!
回复

使用道具 举报

14

主题

46

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
260
金钱
260
注册时间
2012-3-22
在线时间
53 小时
 楼主| 发表于 2021-7-15 11:43:00 | 显示全部楼层
测试过了,完全正确!!!


可以看到读出的数据跟文件里面的内容一样,然后把前面的数据取出来,通过vim换为换行符,刚好33个,非常完美!谢谢!这个才是真正的一个解决方案,再次感谢原子!!!
222.jpg
333.jpg
111.jpg
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-24 02:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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