OpenEdv-开源电子网

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

探索者连接ATK-ESP8266透传文件数据丢失的问题

[复制链接]

11

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2017-8-17
在线时间
50 小时
发表于 2020-11-4 10:46:00 | 显示全部楼层 |阅读模式
10金钱
使用ATK-ESP8266模块与F4探索者开发板连接,目的是将SD卡里面的文件通过wifi模块发送至电脑。目前遇到以下两个问题摸不着头脑。望做过类似项目的解答
问题一:使用TCP透传模式,将SD卡里的TXT文件发送至电脑端的网络调试助手,数据保存至文件。对比源TXT文件文件发现数据丢失。多次试验发现低概率数据完整,其他都是数据缺失。比如1.05M的TXT文件,传输后再保存就只有1.04M。
问题二:使用TCP透传模式,将SD卡里的WAV音频文件发送至电脑端的网络调试助手,数据保存至空白WAV文件。数据丢失严重(更不用考虑播放了),音频文件的传输不知是否理解错误,不能直接从SD卡读出来就传输吗?是否需要先读出来转为整型数据类型再传输至电脑端?
以下是透传数据部分代码:
void send_wav(void)
{
        //发送wav
        u8 ress;
        FIL fwav; //目录
        u8 *databuf;
        UINT br;


        int i = 0;
        long filesize = 0;//文件数据长度初始化


        databuf=(u8*)mymalloc(SRAMIN,512); //开辟1024字节内存区域
        /*打开一个文本文件*/
        if(SD_Init() == 0)
        {
                //ress = f_open(&fwav,(const TCHAR*)"0:/RECORDER/20201103154800.wav", FA_READ);
                ress = f_open(&fwav,(const TCHAR*)"0:/RECORDER/doc.txt", FA_READ);
                filesize = fwav.fsize; //数据长度
                /* 读取并显示所有的行 */
                if(ress == FR_OK)
                {
                        do
                        {
                                memset(databuf,0,512); //清空数组
                                f_lseek(&fwav,i); //将文件指针每次移动i个子节
                                ress=f_read(&fwav,databuf,512, &br); //读取1024个字节文件数据保存到databuf中
                                u3_printf("%s",databuf);
                                i+=512;
                                //退出透传,检查TCP数据包发完数据,再进入透传
                                u3_printf("+++");//退出透传
                                atk_8266_send_cmd((u8*)"AT+CIPMODE=0",(u8*)"OK",20);   //关闭透传模式
                                while(atk_8266_send_cmd((u8*)"AT+CIPCHECKSEQ=1",(u8*)"OK",50));//检查TCP数据包是否发送完。
                                atk_8266_send_cmd((u8*)"AT+CIPSEND",(u8*)"OK",20);    //再次进入透传  
                        }
                        while(i<filesize);


                        delay_ms(200);
                        atk_8266_at_response(1);
                        //关闭文件
                        printf("文件发送完成");
                        f_close(&fwav);
                        myfree(SRAMIN,&fwav);
                        myfree(SRAMIN,databuf);
                }
        }
        else
                printf("没有SD卡");
}

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

使用道具 举报

11

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2017-8-17
在线时间
50 小时
 楼主| 发表于 2020-11-4 12:56:20 | 显示全部楼层
重新发一次透传部分代码,里面有几行后来加的。用不了所以删了重新传
void send_wav(void)
{
        //发送wav
        u8 ress;
        FIL fwav; //目录
        u8 *databuf;
        UINT br;


        int i = 0;
        long filesize = 0;//文件数据长度初始化


        databuf=(u8*)mymalloc(SRAMIN,512); //开辟1024字节内存区域
        /*打开一个文本文件*/
        if(SD_Init() == 0)
        {
                //ress = f_open(&fwav,(const TCHAR*)"0:/RECORDER/20201103154800.wav", FA_READ);
                ress = f_open(&fwav,(const TCHAR*)"0:/RECORDER/doc.txt", FA_READ);
                filesize = fwav.fsize; //数据长度
                /* 读取并显示所有的行 */
                if(ress == FR_OK)
                {
                        do
                        {
                                memset(databuf,0,512); //清空数组
                                f_lseek(&fwav,i); //将文件指针每次移动i个子节
                                ress=f_read(&fwav,databuf,512, &br); //读取1024个字节文件数据保存到databuf中
                                u3_printf("%s",databuf);
                                i+=512;
                        }
                        while(i<filesize);


                        delay_ms(200);
                        atk_8266_at_response(1);
                        //关闭文件
                        printf("文件发送完成");
                        f_close(&fwav);
                        myfree(SRAMIN,&fwav);
                        myfree(SRAMIN,databuf);
                }
        }
        else
                printf("没有SD卡");
}
回复

使用道具 举报

21

主题

2205

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5136
金钱
5136
注册时间
2014-8-26
在线时间
1316 小时
发表于 2020-11-4 20:27:07 | 显示全部楼层
波特率设置为921600看下
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2021-4-2
在线时间
0 小时
发表于 2021-4-2 08:27:54 | 显示全部楼层
u3_printf函数只能发送字符串,若读取的音频文件中存在为0的数据,则被认为是字符串结束,所以会出现丢数据的情况。解决的方法是重写u3_printf函数
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2021-4-2
在线时间
0 小时
发表于 2021-4-2 10:08:13 | 显示全部楼层
u3_printf只能发以'\0'结束的字符串,不能发含0的二进制数据
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-22 10:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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