【RTL8720CF】BW15模组 socke本地通信代码

该博客介绍了如何在基于RTL8720CF WiFi蓝牙芯片的平台上移植和实现socket通信客户端代码。首先,初始化必要的库和硬件,接着创建并配置socket连接到指定的IP和端口。在成功连接后,进行数据的发送和接收,并在接收到特定信号时关闭连接。整个过程涉及到FreeRTOS任务创建、TCP/IP协议栈的使用以及错误处理。
摘要由CSDN通过智能技术生成

RTL8720CF的WiFi蓝牙芯片,移植socket通信客户端代码。


#include "FreeRTOS.h"

#include "task.h"

#include "diag.h"

#include "main.h"

#include "gpio_api.h"

#include "example_entry.h"

#include "pwmout_api.h"

#include "stdio.h"

extern void console_init(void);



/***************************************************************************************************************/



#include "sockets.h"

#include "netdb.h"







#define COMPILE_TIME                    __DATE__","__TIME__

#define LOG_MSG                         "\r\n\r\n######################################\r\n\r\n"\

										"this is a socket test!\r\n"\

										"SOCKET CLIENT\r\n"\

                                        "compile time:"COMPILE_TIME"\r\n"\

										"\r\n######################################\r\n\r\n"



#define SOCKET_HOST                     "192.xxx.xxx.xxx"// 填自己的

#define SOCKET_PORT                     5051

/***************************************************************************************************************/





#define DEBUG_INFO               2 



#if(DEBUG_INFO == 1)

	#define LOG(...)             printf(__VA_ARGS__)

	#define AT_LOG(...)          printf(__VA_ARGS__)

	#define ERR_LOG(fmt,...)     printf("ERR:%s:In Fun '%s',Line[%d] #"fmt,__FILE__, __FUNCTION__, __LINE__,##__VA_ARGS__)

#elif(DEBUG_INFO == 2)

	#define LOG(...)             

	#define AT_LOG(...)  		 printf(__VA_ARGS__)

	#define ERR_LOG(fmt,...)     printf("ERR:%s:In Fun '%s',Line[%d] #"fmt,__FILE__, __FUNCTION__, __LINE__,##__VA_ARGS__)

#elif(DEBUG_INFO == 3)

	#define LOG(...)             

	#define AT_LOG(...)         

	#define ERR_LOG(fmt,...)     printf("ERR:%s:In Fun '%s',Line[%d] #"fmt,__FILE__, __FUNCTION__, __LINE__,##__VA_ARGS__)

#else

	#define LOG(...)   

	#define AT_LOG(...)

	#define ERR_LOG(fmt,...)

#endif





#define GPIO_LED_PIN       PA_19

#define GPIO_PUSHBT_PIN    PA_18

#define PWM_5              PA_17

#define PWM_PERIOD         20000

void example_led(void);

void example_led_thread(void);



/*         PWM            */

pwmout_t pwm_led;

void my_pwm_init(void);

void example_pwm(void);

void example_pwm_thread(void);



void test_socket_creat(void);

void test_socket_thread(void);





//任务优先级

#define START_TASK_PRIO		1

//任务堆栈大小	

#define START_STK_SIZE 		128  

//任务句柄

TaskHandle_t StartTask_Handler;

//任务函数

void start_task(void *pvParameters);



// socket 通信处理

char test_socket_handle(void);



/**

  * @brief  Main program.

  * @param  None

  * @retval None

  */

int main(void)

{

	/* Initialize log uart and at command service */

	console_init();



	/* pre-processor of application example */

	pre_example_entry();



	/* wlan intialization */

	wlan_network();



	/* Execute application example */

	example_entry();

	



	/*     user test          */

	xTaskCreate((TaskFunction_t )start_task,            //任务函数

                (const char*    )"start_task",          //任务名称

                (uint16_t       )START_STK_SIZE,        //任务堆栈大小

                (void*          )NULL,                  //传递给任务函数的参数

                (UBaseType_t    )START_TASK_PRIO,       //任务优先级

                (TaskHandle_t*  )&StartTask_Handler);   //任务句柄 

                

	/* Enable Schedule, Start Kernel */

	vTaskStartScheduler();



	/* Should NEVER reach here */

	return 0;

}



//开始任务任务函数

void start_task(void *pvParameters)

{

    taskENTER_CRITICAL();           //进入临界区

	

	//example_led();

	example_pwm();

	AT_LOG("\r\n######################test_socket_creat######################\r\n");

	test_socket_creat();

    vTaskDelete(StartTask_Handler); //删除开始任务

    taskEXIT_CRITICAL();            //退出临界区

}





void example_led(void)

{

	if(xTaskCreate(example_led_thread, ((const char*)"example_led_thread"),1024, NULL, tskIDLE_PRIORITY + 1, NULL) != pdPASS)

		printf("\n\r%s xTaskCreate failed\n", __FUNCTION__);

}



void example_led_thread(void)

{

	AT_LOG("\r\n   GPIO DEMO   \r\n");

	gpio_t gpio_led;

    gpio_t gpio_btn;

    // Init LED control pin

    gpio_init(&gpio_led, GPIO_LED_PIN);

    gpio_dir(&gpio_led, PIN_OUTPUT);        // Direction: Output

    gpio_mode(&gpio_led, PullNone);         // No pull





    // Initial Push Button pin

    gpio_init(&gpio_btn, GPIO_PUSHBT_PIN);

    gpio_dir(&gpio_btn, PIN_INPUT);         // Direction: Input

    gpio_mode(&gpio_btn, PullUp);           // Pull-High



//	my_pwm_init();

//	pwmout_pulsewidth_us(&pwm_led, PWM_PERIOD/2);

	

    while (1) {

		

        // turn off LED

        gpio_write(&gpio_led, 0);

		vTaskDelay(2900);

        // turn on LED

        gpio_write(&gpio_led, 1);

		vTaskDelay(10);   

    }

}

void my_pwm_init()

{

	pwmout_init(&pwm_led, PWM_5); // obj,pin

	pwmout_period_us(&pwm_led, PWM_PERIOD);

	//  pwmout_pulsewidth_us(&pwm_led, pwms);

}



void example_pwm(void)

{

	if(xTaskCreate(example_pwm_thread, ((const char*)"pwm_thread"), 1024, NULL, tskIDLE_PRIORITY + 2, NULL) != pdPASS)

		printf("\n\r%s xTaskCreate failed\n", __FUNCTION__);

}



void example_pwm_thread(void)

{

	static int pwms = 0;

	my_pwm_init();

	pwmout_pulsewidth_us(&pwm_led, PWM_PERIOD);

	while(1)

	{

		

		if(pwms >= PWM_PERIOD)

		{

			pwms = 0;

			LOG("pwms =%d   \r\n",pwms);

		}

		else

			pwms += PWM_PERIOD/200;

		

		if(pwms%1000)

			LOG("\n\rpwms = %d \r\n",pwms);

		pwmout_pulsewidth_us(&pwm_led, pwms);

		vTaskDelay(10);   

    }

}



void test_socket_creat(void)

{

	if(xTaskCreate(test_socket_thread, ((const char*)"test_socket_thread"),1024, NULL, tskIDLE_PRIORITY + 2, NULL) != pdPASS)

		printf("\n\r%s xTaskCreate failed\n", __FUNCTION__);

}

extern void fATPN(void *arg);





void test_socket_thread(void)

{

	vTaskDelay(2000);

	AT_LOG("start connect wifi\r\n");

	fATPN("iQOO,123456789");



	AT_LOG("\r\nend connect wifi\r\n");

	if(test_socket_handle() != 0) 

	{

		ERR_LOG("test_socket_handle\r\n");

	}

 	vTaskDelete(NULL); //删除任务

}



char test_socket_handle(void)

{

	char exit_num = 0;// 退出编码

	// 第1步:创建客户端socket

	int sockfd = socket(AF_INET,SOCK_STREAM,0);



	// 第2步:向服务器发起请求

	struct hostent* h = gethostbyname(SOCKET_HOST);



	if(h == 0)

	{

		exit_num = 1;

		ERR_LOG("gethostbyname ERR:%d\r\n",exit_num);

		goto exit;

	}

	

	struct sockaddr_in servaddr;

	memset(&servaddr,0,sizeof(servaddr));

	servaddr.sin_family = AF_INET;

	servaddr.sin_port = htons(SOCKET_PORT);	// 指定端口

	memcpy(&servaddr.sin_addr,h->h_addr,h->h_length);

	if(connect(sockfd, (struct sockaddr *)&servaddr,sizeof(servaddr)) != 0) // 向服务器发起连接请求

	{

		exit_num = 2;

		ERR_LOG("connect sockfd ERR:%d\r\n",exit_num);

		goto exit;

	}



	char buffer[256];

	char i = 0;

	AT_LOG("**********************************start socket test\r\n");

	sprintf(buffer,"connect sockfd sucess msg%d\r\n",i);

	if(send(sockfd,buffer,strlen(buffer),0)<=0)

	{

		exit_num = 3;

		ERR_LOG("connect sockfd ERR:%d\r\n",exit_num);

		goto exit;

	}	

	// 第3步:与服务端天下,发送一个报文后等待回复,然后发送下一个报文

	for(;;)

	{

		memset(buffer,0,sizeof(buffer));



		// 接受服务器的消息,阻塞

		memset(buffer,0,sizeof(buffer));

		if( recv(sockfd,buffer,sizeof(buffer),0) <= 0 ){

			AT_LOG("recv error");

			exit_num = -1;

			goto exit;

		}

		else

		{

			AT_LOG("LOG recv %d:%s",i++,buffer);

			if(strcmp(buffer,"+++\r\n") == 0)

			{

				AT_LOG("user exit socket\r\n");

				break;

			}	

		}

		// sprintf(buffer,"test msg %d\r\n",i++);

		if(send(sockfd,buffer,strlen(buffer),0)<=0) 

		{

			AT_LOG("send error\r\n");

			exit_num = -1;

			goto exit;

		}	

		else{

			AT_LOG("LOG client send sucess:%s\r\n",buffer);

		}

		vTaskDelay(1); 

	}



	if(sockfd)

		close(sockfd);

	return 0;

exit:

	if(exit_num!= 0)

		ERR_LOG("%d",exit_num);

	if(sockfd)

		close(sockfd);	

	return exit_num;	

}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
《ARM嵌入式系统软件开发实例(一) 周立功 北京航天航空大学出版社》(PDF) 目录第1章 ZLG/FS原理与应用 1.1 概述 1.1.1 ZLG/FS简介 1.1.2 ZLG/FS的特点 1.1.3 已实现的特性 1.1.4 暂时未实现的特性 1.2 使用 1.2.1 使用示例 1.2.2 Config.h和fat.h 1.2.3 与编译器无关的数据类型 1.2.4 初始化ZLG/FS 1.2.5 目录相关操作 1.2.6 文件相关操作 1.2.7 关闭ZLG/FS 1.2.8 在多任务环境下使用ZLG/FS 1.3 ZLG/FS的结构视图 1.3.1 概述 1.3.2 应用程序 1.3.3 文件管理与目录管理 1.3.4 文件分配表管理与文件目录表管理 1.3.5 逻辑盘管理模块 1.3.6 高速缓存管理模块 1.3.7 底层驱动程序 1.3.8 实用程序 1.3.9 源代码文件说明 1.4 驱动程序设计指南 1.4.1 一个驱动程序的例子 1.4.2 参数 1.4.3 逻辑盘初始化 1.4.4 卸载逻辑盘 1.4.5 读/写扇区 1.5 FAT文件系统基础知识 1.5.1 简介 1.5.2 本节的约定 1.5.3 概述(适用于各类型的FAT文件系统) 1.5.4 引导扇区和BPB 1.5.5 FAT数据结构 1.5.6 FAT类型的确定 1.5.7 FAT卷的初始化 1.5.8 FAT32 FSInfo扇区结构和备份引导扇区 1.5.9 FAT的目录结构(FDT表) 1.5.10 FAT的长目录项 1.5.11 命名限制和字符集 1.5.12 短文件名和长文件名的名字映射 1.5.13 命名惯例和长文件名 1.5.14 长目录项对旧版FAT的影响 1.5.15 验证目录的内容 1.5.16 与FAT目录项相关的其他注意事项 1.6 逻辑盘信息管理 1.6.1 用户接口函数 1.6.2 内部使用函数 1.6.3 逻辑盘和卷的区别 1.6.4 逻辑盘信息登录项 1.6.5 初始化 1.6.6 加载底层驱动程序 1.6.7 卸载底层驱动程序 1.6.8 获取逻辑盘信息 1.6.9 获取空闲登录项 1.7 Cache管理 1.7.1 用户接口函数 1.7.2 内部使用函数 1.7.3 原理 1.7.4 初始化 1.7.5 通过Cache读/写逻辑扇区 1.7.6 把Cache数据写回逻辑盘 1.8 文件分配表管理 1.8.1 FAT简介 1.8.2 接口函数 1.8.3 获取簇的下一个簇号 1.8.4 设置下一个簇号 1.8.5 为簇链增加一个簇 1.8.6 删除一个簇链 1.9 文件目录表管理 1.9.1 FDT简介 1.9.2 用户接口函数 1.9.3 内部接口函数 1.9.4 数据结构 1.9.5 读取FDT信息 1.9.6 保存FDT信息 1.9.7 获取指定目录指定FDT信息 1.9.8 设置指定目录指定FDT信息 1.9.9 在指定目录查找指定FDT 1.9.10 指定目录查增加FDT 1.9.11 在指定目录删除指定FDT 1.9.12 改变指定目录指定FDT属性 1.9.13 察看指定目录是否为空 1.9.14 在指定目录查看指定FDT是否存在 1.10 目录操作 1.10.1 用户接口函数 1.10.2 内部接口函数 1.10.3 获取指定目录的逻辑盘号 1.10.4 改变当前逻辑盘 1.10.5 建立目录 1.10.6 删除目录 1.10.7 改变当前目录 1.10.8 用户文件/目录名转换为系统名 1.10.9 获取指定文件/目录所在的目录的开始簇号及系统内名称 1.10.10 获取指定目录开始簇号 1.11 文件操作 1.11.1 用户接口函数 1.11.2 数据结构 1.11.3 初始化 1.11.4 删除文件 1.11.5 打开文件 1.11.6 查看指定的文件是否处于打开状态 1.11.7 关闭文件 1.11.8 从文件中读数据 1.11.9 把数据写入文件 1.11.10 判断文件是否读/写到文件尾 1.11.11 移动文件读/写位置 1.12 实用程序 第2章 USB驱动程序开发 2.1 USB1.1协议简介 2.1.1 USB系统构成 2.1.2 USB设备的枚举过程 2.1.3 USB的分组标识 2.1.4 USB标准设备请求 2.1.5 USB设备描述符 2.2 PDIUSBD12器件简介 2.3 硬件电路设计 2.4 软件设计总体思想 2.5 USB设备控制层 2.6 USB接口控制驱动 2.7 应用层 2.7.1 初始化PDIUSBD12 2.7.2 控制传输处理 2.7.3 端点1和端点2数据接收与发送设计思想 2.7.4 从端点接收数据 2.7.5 往端点发送数据 2.8
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值