Proteus仿真单片机STM32F103的TCP通信5
使用WIFI模拟器软件实现Proteus与NetAssist进行TCP通信功能在同一台电脑上下位机为Proteus仿真stm32f103单片机作为服务端上位机使用NetAssist作为客户端使用WIFI模拟器软件与Proteus通过VSPD虚拟串口以JSON格式数据进行通信上位机发送{“LED”:0}、{“LED”:1}控制下位机LED灯亮灭。1.创建Stmcubeide工程配置USART1、USART2均为115200BPS分别连接串口调试软件和WIFI模拟器软件配置PB5口为输出连接LED灯。2.编写程序依赖库cJSON库下载地址cJSON GitHub https://github.com/DaveGamble/cJSON如果解析错误可换json库。/* USER CODE END Header *//* Includes ------------------------------------------------------------------*/#includemain.h#includeusart.h#includegpio.h/* Private includes ----------------------------------------------------------*//* USER CODE BEGIN Includes */#includestring.h#includecJSON.h#includestdio.h#ifdef__GNUC__#definePUTCHAR_PROTOTYPEint__io_putchar(intch)#else#definePUTCHAR_PROTOTYPEintfputc(intch,FILE*f)#endifPUTCHAR_PROTOTYPE{HAL_UART_Transmit(huart1,(uint8_t*)ch,1,0xFFFF);returnch;}intfputc(intch,FILE*f){HAL_UART_Transmit(huart1,(uint8_t*)ch,1,0xffff);returnch;}intfgetc(FILE*f){uint8_tch0;HAL_UART_Receive(huart1,ch,1,0xffff);returnch;}uint8_tmy_re_buf2;uint8_tmy_re_buf[2000];uint16_tpt_w20;uint16_tpt0;uint8_taRxBuffer;//接收中断缓冲/*1.模块Station模式下做tcp server ATCWMODE w 开启AP模式 ATCWSAP”y”,”1234567890”,3,0 设置名、密码、加密方式 ATCIPMUX1 开多连接模式 ATCIPSERVER1,8888创建服务器 ATCIFSR 查看本地IP地址 */charCAT[]AT\r\n;charCRST[]ATRST\r\n;charCMODE[]ATCWMODE2\r\n;charCWIFI[]ATCWSAP\MUC\,\\,3,0\r\n;//加密模式 0 - OPEN 1 - WEP 2 - WPA_PSK 3 - WPA2_PSK 4 - WPA_WPA2_PSKcharCMUX[]ATCIPMUX1\r\n;charCSERVER[]ATCIPSERVER1,8080\r\n;charGETIP[]ATCIFSR\r\n;charCSEND[]ATCIPSEND0,5\r\n;//发送5字节到CLIENT连接ID为0的远端charsendBuff[50];charRecive[15];charRecive2[15];/* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*//* USER CODE BEGIN PTD *//* USER CODE END PTD *//* Private define ------------------------------------------------------------*//* USER CODE BEGIN PD *//* USER CODE END PD *//* Private macro -------------------------------------------------------------*//* USER CODE BEGIN PM *//* USER CODE END PM *//* Private variables ---------------------------------------------------------*//* USER CODE BEGIN PV *//* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/voidSystemClock_Config(void);/* USER CODE BEGIN PFP */voidcommand(charCommand_AT[]){intLenthstrlen(Command_AT);HAL_UART_Transmit(huart2,(uint8_t*)Command_AT,Lenth,0xff);printf(%s,Command_AT);HAL_Delay(3500);}voidwifiSend(chardata[]){uint8_tLenthstrlen(data);sprintf(sendBuff,ATCIPSEND0,%d\r\n,Lenth);command(sendBuff);HAL_UART_Transmit(huart2,(uint8_t*)data,Lenth,0xff);}voidESP8266_Init(void){command(CAT);command(CRST);command(CMODE);command(CWIFI);command(CMUX);command(CSERVER);command(GETIP);//command(CSEND);}/* USER CODE END PFP *//* Private user code ---------------------------------------------------------*//* USER CODE BEGIN 0 *//* USER CODE END 0 *//** * brief The application entry point. * retval int */intmain(void){/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_USART1_UART_Init();MX_USART2_UART_Init();/* USER CODE BEGIN 2 */ESP8266_Init();//wifiSend(Im Server.);HAL_UART_Receive_IT(huart2,(uint8_t*)aRxBuffer,1);HAL_Delay(1000);cJSON*json;cJSON*Array_obj1;intsize;/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while(1){if(pt0)// 只有当接收到数据时才处理{// 提取有效的JSON数据char*json_startstrrchr((constchar*)my_re_buf,{);// 找到最后一个{if(json_start!NULL){char*json_endstrrchr(json_start,});// 找到对应的}if(json_end!NULL){// 提取JSON字符串charjson_buffer[100]{0};intjson_lenjson_end-json_start1;if(json_lensizeof(json_buffer)){strncpy(json_buffer,json_start,json_len);json_buffer[json_len]\0;printf(\nRaw JSON: %s,json_buffer);// 解析JSONjsoncJSON_Parse(json_buffer);if(json!NULL){printf(\nJSON parsed successfully);Array_obj1cJSON_GetObjectItem(json,LED);if(Array_obj1!NULL){printf(\nLED object found);// 尝试使用不同的方式获取LED值intled_valueArray_obj1-valueint;printf(\nLED value: %d,led_value);if(led_value){HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET);printf(\nLED ON);}else{HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET);printf(\nLED OFF);}}else{printf(\nLED object not found);}cJSON_Delete(json);// 释放JSON对象}else{printf(\nJSON parse error: %s,cJSON_GetErrorPtr());}}}}// 重置接收缓冲区memset(my_re_buf,0,sizeof(my_re_buf));pt0;}HAL_Delay(1000);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */}/* USER CODE BEGIN 4 */voidHAL_UART_RxCpltCallback(UART_HandleTypeDef*huart){UNUSED(huart);if(huarthuart2){my_re_buf2aRxBuffer;if(ptsizeof(my_re_buf)-1)// 防止数组越界{my_re_buf[pt]aRxBuffer;my_re_buf[pt]\0;// 确保字符串结束符}HAL_UART_Receive_IT(huart2,(uint8_t*)aRxBuffer,1);}}/* USER CODE END 4 */3.调试软件使用配置COM10和COM11、COM12和COM13两对串STM32的USART2连接COM11WIFI模拟器串口连接COM11先后打开WIFI模拟器运行Proteus打开网络调试助手设为TCP Server可查到第一个IP并记下再设为TCP Client并填写远程主机地址IP和端口。可以发送{“LED”:0}、{“LED”:1}控制LED灯亮灭了。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2521253.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!