目录
1.6 my_spi_wifi_image_senfOriginal函数
1.7 my_spi_wifi_image_SendOriginal_BX函数
说明:
根据逐飞的库,进行了wifi图传代码的封装
编译环境:ADS 1.80
一、my_spi_wifi.c文件
1.1 预编译和全局变量
#include "zf_common_headfile.h"
//选择协议,必选一个,不然没办法通信
//#define UTP
#define TCP
uint8 wifi_spi_test_buffer[] = "初始化成功\n";
uint8 wifi_spi_get_data_buffer[256];
uint32 data_length = 0;
// 图像备份数组,在发送前将图像备份再进行发送,这样可以避免图像出现撕裂的问题
IFX_ALIGN(4) uint8 image_copy[MT9V03X_H*MT9V03X_W];
1.2 my_spi_wifi_init函数
/* @wifi初始化函数
* @说明:根据逐飞库修改而来
* @作者:吴广金
* @时间:2024年3月7日
* */
void my_spi_wifi_init(void)
{
while(wifi_spi_init(WIFI_SSID_TEST, WIFI_PASSWORD_TEST))
{
printf("\r\n connect wifi failed. \r\n");
system_delay_ms(100); // 初始化失败 等待 100ms
}
printf("\r\n module version:%s",wifi_spi_version); // 模块固件版本
printf("\r\n module mac :%s",wifi_spi_mac_addr); // 模块 MAC 信息
printf("\r\n module ip :%s",wifi_spi_ip_addr_port); // 模块 IP 地址
// zf_device_wifi_spi.h 文件内的宏定义可以更改模块连接(建立) WIFI 之后,是否自动连接 TCP 服务器、创建 UDP 连接
if(0 == WIFI_SPI_AUTO_CONNECT) // 如果没有开启自动连接 就需要手动连接目标 IP
{
while(wifi_spi_socket_connect( // 向指定目标 IP 的端口建立连接
#ifdef UDP//建立udp连接
"UDP", // 指定使用UDP方式通讯
#endif
#ifdef TCP //建立TCP连接
"TCP", // 指定使用TCP方式通讯
#endif
WIFI_SPI_TARGET_IP, // 指定远端的IP地址,填写上位机的IP地址
WIFI_SPI_TARGET_PORT, // 指定远端的端口号,填写上位机的端口号,通常上位机默认是8080
WIFI_SPI_LOCAL_PORT)) // 指定本机的端口号
{
// 如果一直建立失败 考虑一下是不是没有接硬件复位
printf("\r\n Connect UDP/TCP Servers error, try again.");
system_delay_ms(100); // 建立连接失败 等待 100ms
}
}
// 发送测试数据至服务器
data_length = wifi_spi_send_buffer(wifi_spi_test_buffer, sizeof(wifi_spi_test_buffer));
wifi_spi_udp_send_now();
if(!data_length)
{
printf("\r\n send success.");
}
else
{
printf("\r\n %ld bytes data send failed.", data_length);
}
}
1.3 my_spi_wifi_rece函数
/* @wifi接收函数
* @说明:根据逐飞库修改而来
* @作者:吴广金
* @返回值:uint32类型,返回接收到的数据
* @时间:2024年3月7日
* */
uint32 my_spi_wifi_rece(void)
{
data_length = wifi_spi_read_buffer(wifi_spi_get_data_buffer, sizeof(wifi_spi_get_data_buffer));
if(data_length) // 如果接收到数据 则进行数据类型判断
{
printf("\r\n Get data: <%s>.", wifi_spi_get_data_buffer);
if(!wifi_spi_send_buffer(wifi_spi_get_data_buffer, data_length))
{
wifi_spi_udp_send_now();
printf("\r\n send success.");
memset(wifi_spi_get_data_buffer, 0, data_length); // 数据发送完成 清空数据
}
else
{
printf("\r\n %ld bytes data send failed.", data_length);
return data_length;
}
}
}
1.4 my_spi_wifi_image_init函数
/* @图像发送函数初始化
* @说明:根据逐飞库修改而来
* @作者:吴广金
* @时间:2024年3月7日
* */
void my_spi_wifi_image_init(void)
{
//初始化逐飞上位机助手,推荐在摄像头初始化后
// 逐飞助手初始化 数据传输使用高速WIFI SPI
seekfree_assistant_interface_init(SEEKFREE_ASSISTANT_WIFI_SPI);
//配置图传参数
// 发送总钻风图像信息(仅包含原始图像信息)
seekfree_assistant_camera_information_config(SEEKFREE_ASSISTANT_MT9V03X, image_copy, MT9V03X_W, MT9V03X_H);
}
1.5 my_spi_wifi_image_send函数
/* @图像发送函数(人视角正转图像)
* @说明:这时上位机显示的图像为人视角的正面图,但与实际图像处理上的坐标不一样
* @作者:吴广金
* @时间:2024年3月7日
* */
void my_spi_wifi_image_send(void)
{
uint8 i = 0;
uint8 j = 0;
uint16 offset;
// 在发送前将图像备份再进行发送,这样可以避免图像出现撕裂的问题
for(i = 120-1 ;i > 0;i--)
{
offset = i*188;
for(j = 0;j<188;j++)
{
//图像复制
image_copy[offset+j] = out[(119-i)*188+j];
//扫线情况
if((119-i)>34&&(119-i)<82&&((119-i)%2==1))
{
//左右两条边线
if(j==all_out_left[((119-i)-35)/2])
image_copy[offset+j] = 0xFD;
if(j==all_out_right[((119-i)-35)/2])
image_copy[offset+j] = 0xFD;
//中间边线
if(j==all_out_scan_mid[((119-i)-35)/2])
if((((119-i)-35)/2)==12)
image_copy[offset+j] = 0xFD;
else
image_copy[offset+j] = 0;
}
}
}
// 发送图像
seekfree_assistant_camera_send();
#ifdef UDP
// wifi_spi_udp_send_now();
#endif
}
1.6 my_spi_wifi_image_senfOriginal函数
/* @图像发送函数(原始图像)
* @说明:这时上位机显示的图像为实际图像
* @作者:吴广金
* @时间:2024年3月7日
* */
void my_spi_wifi_image_sendOriginal(void)
{
// 在发送前将图像备份再进行发送,这样可以避免图像出现撕裂的问题
memcpy(image_copy, out, MT9V03X_IMAGE_SIZE);
// 发送图像
seekfree_assistant_camera_send();
#ifdef UDP
// wifi_spi_udp_send_now();
#endif
}
1.7 my_spi_wifi_image_SendOriginal_BX函数
/* @图像发送函数(原始图像+边线)
* @说明:这时上位机显示的图像为实际图像
* @作者:吴广金
* @时间:2024年3月7日
* */
void my_spi_wifi_image_sendOriginal_BX(void)
{
uint8 i = 0;
uint8 j = 0;
uint16 offset;
// 在发送前将图像备份再进行发送,这样可以避免图像出现撕裂的问题
memcpy(image_copy, out, MT9V03X_IMAGE_SIZE);
for( i = 0;i < 120;i ++)
{
offset = i*188;
for(j = 0;j < 188;j ++)
{
//扫线情况
if(i>34&&i<82&&(i%2==1))
{
//左右两条边线
if(j==all_out_left[(i-35)/2])
image_copy[offset+j] = 0xFD;
if(j==all_out_right[(i-35)/2])
image_copy[offset+j] = 0xFD;
//中间边线
if(j==all_out_scan_mid[(i-35)/2])
if(((i-35)/2)==12)
image_copy[offset+j] = 0xFD;
else
image_copy[offset+j] = 0;
}
}
}
// 发送图像
seekfree_assistant_camera_send();
#ifdef UDP
// wifi_spi_udp_send_now();
#endif
}
1.8 my_wifi_image_send函数
/* @图像发送函数(选择函数)
* @说明:选择一种图形传输方式进行传输
* @参数(IMAGE_SEND data):图像传输的枚举
* @作者:吴广金
* @时间:2024年3月7日
* */
void my_wifi_image_send(IMAGE_SEND data)
{
switch(data){
case 0:
break;
case FRONTVIEW:
my_spi_wifi_image_send();//人视角图像
break;
case ORIGINAL:
my_spi_wifi_image_sendOriginal();//原始图像
break;
case OUTER:
my_spi_wifi_image_sendOriginal_BX();//原始图像+扫线
break;
default:
break;
}
}
二、my_spi_wifi.h文件
#ifndef __MYSPIWIFI_H_
#define __MYSPIWIFI_H_
#include "zf_common_headfile.h"
#define WIFI_SSID_TEST "MERCURY_1646" //wifi账号
#define WIFI_PASSWORD_TEST "858714786" //wifi密码
typedef enum
{
FRONTVIEW = 1,
ORIGINAL = 2,
OUTER = 3,
}IMAGE_SEND;
void my_spi_wifi_init(void);
//接收函数
uint32 my_spi_wifi_rece(void);
void my_spi_wifi_image_init(void);
void my_spi_wifi_image_send(void);
void my_spi_wifi_image_sendOriginal(void);
void my_spi_wifi_image_sendOriginal_BX(void);
void my_wifi_image_send(IMAGE_SEND data);
#endif