关于图像传输问题

bj-alex 2013-08-17 12:59:48
正在尝试用STM32控制GPRS发送数据到互联网。目前已经可以发送简单数据,并在服务器接收。由于GPRS模块每次最多发送1K的内容,所以,在发送静态图像时遇到问题。使用透传的话,如何将一个5K左右的图像发送出去呢?现在手头有一个小于5K图像做测试,为16进制的数组。
...全文
217 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
liuwei1402 2014-04-23
  • 打赏
  • 举报
回复
楼主,求助,您的图片发送成功没有最后?这个丢包率和速度效果怎么样?
bj-alex 2013-08-31
  • 打赏
  • 举报
回复
非常感谢版主的详细解答。
我这里的图片是单独一个pic.c文件,做了一个外部声明:extern const unsigned char pic[8058],如果我不写8058,用sizeof(pic),编译就会出错,我百度了下,其他人也有类似问题,原因就是这个pic[]数组必须指定大小。这个8058,是我数了下图片pic.c文件中有多少个16进制数据得出的结果。我百度了sizeof的用法,当数组中有元素时,可以用sizeof得出所占内存大小,为什么我这里必须要先指定数组大小?
bj-alex 2013-08-30
  • 打赏
  • 举报
回复
如果是给出一个16进制数组的图片文件,如何判断它的数组长度?我在单步调试时发现,空格不发送,对于这个文件来说,就是发送8058个字节,这个8058是我自己数多少行,每行多少个16进制数,算出来的,有没有类似strlen()这样的函数直接得出?
bj-alex 2013-08-30
  • 打赏
  • 举报
回复
引用 5 楼 wangfan027 的回复:
send_gprs_data((char*)pic,1); 1参数类型不对,需要强制转换 2参数是个数组的话后面不能带[4051]
void send_gprs_data(char * buf)
{
    unsigned int i,j,k,m,s;
	 i=0;
	k=strlen((const char *)buf);
	s=k/BUFLENP;
	m=k%BUFLENP;   //BUFLENP=1024

     
    send_string_uart3(TM_TYPE_TPSMODE);        // "AT%TPS=2,1,3000,1024\x00D\x00A"

   if(i<(s*BUFLENP))
    {
            
         for ( j = 0 ; j <1024 ; j ++) 
          {
            bufp[j]=buf[i];
	        i++;
            send_data_uart3(bufp[j]);
           }  		  
	     delay_GSM(5000);  
       
     }
   else
     {
       for(j=0;j<m;j++)
       	{
    	  bufp[j]=buf[i];
	      i++;
	      send_data_uart3(bufp[j]);
     	}
     }
    delay_GSM(5000);
}
请教版主,上面是我写的分包发送图片数组的代码。单步调试,一次可以发送数组中一个字节。我的困惑是,1,原先的pic[]数组内装的16进制数据,每次发送的是AE,73这样的数据,我在接收端是否还要进行转换?2,在发送控制部分,我用的是strlen(),但是有些人说要用sizeof(),这里,在强制转换(char*)pic后,是否在末尾添加了"\0",用strlen()行吗?3,我在查看pic.c文件时(如下截图),发现里面有好多空格,有8058个16进制数据(自己数的),但是用strlen()得出结果4516。 还请版主赐教~
dceacho 2013-08-30
  • 打赏
  • 举报
回复
原先的pic[]数组内装的16进制数据,每次发送的是AE,73这样的数据,我在接收端是否还要进行转换? 不需要,进制不是问题 2,在发送控制部分,我用的是strlen(),但是有些人说要用sizeof(),这里,在强制转换(char*)pic后,是否在末尾添加了"\0",用strlen()行吗? 不行!strlen原理是查找结束符来判断长度的,你需要发送的是"数据"不是字符串,所以需要用sizeof 强制转换不会改变"数值"仅仅改变类型,所以不会末尾给你添加"\0" 3,我在查看pic.c文件时(如下截图),发现里面有好多空格,有8058个16进制数据(自己数的),但是用strlen()得出结果4516 如上,strlen()原理不一样,你用sizeof()看下结果是多少
jeffkuang_2005 2013-08-30
  • 打赏
  • 举报
回复
分包发送,协议自己定。
dceacho 2013-08-24
  • 打赏
  • 举报
回复
send_gprs_data((char*)pic,1); 1参数类型不对,需要强制转换 2参数是个数组的话后面不能带[4051]
bj-alex 2013-08-24
  • 打赏
  • 举报
回复
引用 1 楼 wangfan027 的回复:
自己新建协议,分块发送就可以了
for(i=0;i<sizeof(bufP[]);i++) { for(j=0;j<BUFLEN;j++) { buf[j]=bufP[i]; send_data_uart3(buf[j]); } } BUFLEN为1024B,上面代码位于发送函数内部。但是发送函数参数传递出问题了
bj-alex 2013-08-24
  • 打赏
  • 举报
回复
主函数中有:send_gprs_data(pic[4051],1); 调用函数 void send_grps_data(char * bufp, unsigned int count){} pic[4051]就是图片数组,16进制。定义是u8 pic[]={} 编译时报错: main.c(106): error: #167: argument of type "u8" is incompatible with parameter of type "char *"
bj-alex 2013-08-24
  • 打赏
  • 举报
回复
引用 5 楼 wangfan027 的回复:
send_gprs_data((char*)pic,1); 1参数类型不对,需要强制转换 2参数是个数组的话后面不能带[4051]
青松2 2013-08-20
  • 打赏
  • 举报
回复
自己分包发送
dceacho 2013-08-20
  • 打赏
  • 举报
回复
自己新建协议,分块发送就可以了

27,373

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧