上周解决了WIFI 传输过程中连接中断,电脑端接收不到数据的问题。又花了一周的时间才正确的把从开发板上获取的图像数据转换、编码保存为BMP 图像。
本来是打算在开发板上,以字符串的形式每次发送512个字节,电脑端再解析出来。但是图片解析一直有问题。最后直接用串口在调试助手上把一帧图像的数据以16进制的形式打印出来,发现数据根本对不上。最后改成以打印十六进制的形式将数据发送到电脑,开发板发送部分的代码如下:
void wifi_send_data(unsigned short *data,int len)
{
unsigned short *p = data;
u8 count=0; //用于计数单次发送的个数
p = (unsigned short*)malloc(sizeof(unsigned short)*128);
if(atk_8266_consta_check() == '+')
{
printf("连接正常\r\n");
}
else
{
printf("连接中断\r\n");
return;
}
atk_8266_at_response(1);
delay_ms(10);
free(p);
p=data;
//首先发送起始信息
atk_8266_quit_trans();
atk_8266_send_cmd("AT+CIPSEND","OK",20);
u3_printf("start of msg");
atk_8266_at_response(1);
delay_ms(20);
while(len > 0)
{
// if(len >= 32)
// {
// len -= 32;
// u3_printf("%32.32s",p);
// p+=16; //short 类型的指针对应两个char 类型指针移动的长度
// }
// else
// {
// u3_printf("%s",p);
// len=0;
// }
//修改为发送十六进制数的字符串,每次发送64个short 类型的数
count=0;
if(len >= 64)
{
len -= 64;
while(count < 64)
{
u3_printf("%x",*p);
++p;
++count;
}
}
else
{
while(count < len)
{
u3_printf("%x",*p);
++count;
}
len =0;
}
get_feedback();
delay_ms(20);
}
//发送标识一帧图像结束的消息
u3_printf("end of msg");
atk_8266_at_response(1);
delay_ms(1000);
printf("发送结束==========================================\r\n");
// char *p = data;
// char *send_content = (char*)malloc(sizeof(char)*2);
// while(len > 0)
// {
// atk_8266_quit_trans();
// atk_8266_send_cmd("AT+CIPSEND","OK",20);
// sprintf(send_content,"%02x%02x",*p,*(p+1));
// u3_printf(send_content); //发送数据
// p +=2;
// len -= 2;
// atk_8266_at_response(1);
// }
// free(send_content);
}
下面就是对接受到的图像数据进行解析了。我用的摄像头是OV7670 ,采用的是RGB565 ,即每个像素点最高为为RED ,5个bit ,中间为GREEN,6个bit ,最低为BLUE ,5个bit 。转换为在电脑上能显示的RGB 只需要分别将RGB独立为一个字节,低位为0。比如RGB565 为0XFF, 先用逻辑运算获取到每个分量,R:0X1F,G:0X