C++实现http客户端连接服务端及客户端json数据的解析

2023-05-16

上一篇链接:https://blog.csdn.net/hfuu1504011020/article/details/88785448

上一篇中说到Unicode转utf8格式的过程,其中谈及到http以及json数据的解析,json解析其实也没啥说的,网上一大推,后面大概介绍下使用,本文着重介绍下c++客户端实现的http连接服务端并返回json数据的过程。

(重点)这里http的连接以及获取json数据过程使用的是多字节编码实现的,直接可以将其转为utf8编码存入mysql中。之前我因为使用的是Unicode编码,在本文代码的基础上再加入上一篇的编码转换也是可以实现Unicode转utf8格式过程。

我们看下http头文件所包含的参数以及函数

 HttpClient.h
#ifndef HTTPCLIENT_H
#define HTTPCLIENT_H

#include <afxinet.h>
#include <string>
using namespace std;

#define  IE_AGENT  _T("Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)")

// 操作成功
#define SUCCESS        0
// 操作失败
#define FAILURE        1
// 操作超时 www.it165.net
#define OUTTIME        2

class CHttpClient
{
public:
	CHttpClient(LPCTSTR strAgent = IE_AGENT);
	virtual ~CHttpClient(void);

	/*static wchar_t* ANSIToUnicode(const char* str);
	static char* UnicodeToANSI(const wchar_t* str);
	static char* UnicodeToUTF8(const wchar_t* str);
    */ //在下面的ExecuteRequest函数中处理了多字节转utf8的方法,不需要再使用这三个函数,这里注释 
      //  的三句转码总觉得在使用时有问题,代码我一并贴出,供大家查找问题

	int HttpGet(LPCTSTR strUrl, LPCTSTR strPostData, string &strResponse);
	int HttpPost(LPCTSTR strUrl, LPCTSTR strPostData, string &strResponse);

private:
	int ExecuteRequest(LPCTSTR strMethod, LPCTSTR strUrl, LPCTSTR strPostData, string &strResponse);
	void Clear();

private:
	CInternetSession *m_pSession;
	CHttpConnection *m_pConnection;
	CHttpFile *m_pFile;
};

#endif // HTTPCLIENT_H

以上是http实现的头文件,以下为.cpp中代码实现过程,内容有点多,若只是使用的话粘贴复制即可

// HttpClient.cpp
#include "StdAfx.h"
#include "HttpClient.h"
 
#define  BUFFER_SIZE				1024

#define  NORMAL_CONNECT             INTERNET_FLAG_KEEP_CONNECTION
#define  SECURE_CONNECT             NORMAL_CONNECT | INTERNET_FLAG_SECURE
#define  NORMAL_REQUEST             INTERNET_FLAG_RELOAD | INTERNET_FLAG_DONT_CACHE 
#define  SECURE_REQUEST             NORMAL_REQUEST | INTERNET_FLAG_SECURE | INTERNET_FLAG_IGNORE_CERT_CN_INVALID
 
CHttpClient::CHttpClient(LPCTSTR strAgent)
{
    m_pSession = new CInternetSession(strAgent);
    m_pConnection = NULL;
    m_pFile = NULL;
}
 
 
CHttpClient::~CHttpClient(void)
{
    Clear();
    if(NULL != m_pSession)
    {
        m_pSession->Close();
        delete m_pSession;
        m_pSession = NULL;
    }
}
 
void CHttpClient::Clear()
{
    if(NULL != m_pFile)
    {
        m_pFile->Close();
        delete m_pFile;
        m_pFile = NULL;
    }
 
    if(NULL != m_pConnection)
    {
        m_pConnection->Close();
        delete m_pConnection;
        m_pConnection = NULL;
    }
}

int CHttpClient::ExecuteRequest(LPCTSTR strMethod, LPCTSTR strUrl, LPCTSTR strPostData, string &strResponse)
{
	DWORD dwFlags;
	DWORD dwStatus = 0;
	DWORD dwStatusLen = sizeof(dwStatus);
	CString strLine;
	CString strServer;
    CString strObject;
    DWORD dwServiceType;
    INTERNET_PORT nPort;
    strResponse = "";

	AfxParseURL(strUrl, dwServiceType, strServer, strObject, nPort);

	try 
	{
		if (dwServiceType == AFX_INET_SERVICE_HTTP)
		{
			m_pConnection = m_pSession->GetHttpConnection(strServer,NORMAL_CONNECT,nPort);
		}
		else
		{
			m_pConnection = m_pSession->GetHttpConnection(strServer, INTERNET_FLAG_SECURE, nPort,
				NULL, NULL);
		}
		if(m_pConnection)
		{
			if (dwServiceType == AFX_INET_SERVICE_HTTP)
			{
				m_pFile = m_pConnection->OpenRequest(strMethod, strObject, 
					NULL, 1, NULL, NULL, NORMAL_REQUEST);
			}
			else
			{
				m_pFile = (CHttpFile*)m_pConnection->OpenRequest(CHttpConnection::HTTP_VERB_POST, strObject, NULL, 1,
					NULL, NULL,
					INTERNET_FLAG_SECURE |
					INTERNET_FLAG_EXISTING_CONNECT |
					INTERNET_FLAG_RELOAD |
					INTERNET_FLAG_NO_CACHE_WRITE |
					INTERNET_FLAG_IGNORE_CERT_DATE_INVALID |
					INTERNET_FLAG_IGNORE_CERT_CN_INVALID
					);
				//get web server option
				m_pFile->QueryOption(INTERNET_OPTION_SECURITY_FLAGS, dwFlags);
				dwFlags |= SECURITY_FLAG_IGNORE_UNKNOWN_CA;
				//set web server option
				m_pFile->SetOption(INTERNET_OPTION_SECURITY_FLAGS, dwFlags);
			}

			
			m_pFile->AddRequestHeaders("Accept: *,*/*");
			m_pFile->AddRequestHeaders("Accept-Language: zh-cn");
			m_pFile->AddRequestHeaders("Content-Type: application/x-www-form-urlencoded");
			m_pFile->AddRequestHeaders("Accept-Encoding: gzip, deflate");

			if(m_pFile->SendRequest(NULL, 0, (LPVOID)(LPCTSTR)strPostData, strPostData == NULL ? 0 : _tcslen(strPostData))) 
			{
				//get response status if success, return 200
				if (dwServiceType != AFX_INET_SERVICE_HTTP)
				{
					m_pFile->QueryInfo(HTTP_QUERY_FLAG_NUMBER | HTTP_QUERY_STATUS_CODE,
						&dwStatus, &dwStatusLen, 0);
				}
// 				while(m_pFile->ReadString(strLine)) 
// 				{
// 					//m_strHtml += Convert(strLine, CP_ACP);
// 					m_strHtml += strLine + char(13) + char(10);
// 				}
				char szChars[BUFFER_SIZE + 1] = {0};
				string strRawResponse = "";
				UINT nReaded = 0;
				while ((nReaded = m_pFile->Read((void*)szChars, BUFFER_SIZE)) > 0)
				{
					szChars[nReaded] = '\0';
					strRawResponse += szChars;
					memset(szChars, 0, BUFFER_SIZE + 1);
				}
		 
			   int unicodeLen = MultiByteToWideChar(CP_UTF8, 0, strRawResponse.c_str(), -1, NULL, 0);
				WCHAR *pUnicode = new WCHAR[unicodeLen + 1];
				memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t));
		 
				MultiByteToWideChar(CP_UTF8,0,strRawResponse.c_str(),-1, pUnicode,unicodeLen);

				DWORD dwNum = WideCharToMultiByte(CP_OEMCP,NULL,pUnicode,-1,NULL,0,NULL,FALSE);// WideCharToMultiByte的运用
				char *psText; // psText为char*的临时数组,作为赋值给std::string的中间变量
				psText = new char[dwNum];
				WideCharToMultiByte (CP_OEMCP,NULL,pUnicode,-1,psText,dwNum,NULL,FALSE);// WideCharToMultiByte的再次运用
				string szDst = psText;// std::string赋值
				delete []psText;// psText的清除
				strResponse = szDst;
		// 		char *ansi_str = UnicodeToUTF8(pUnicode);
		// 		
		// 		string str  = ansi_str;
		// 		free(ansi_str);
		// 
		//         CString cs(str.c_str());
				delete []pUnicode; 
				pUnicode = NULL;
		//        strResponse = cs;
		 
				Clear();
			} 
			else 
			{
				return FAILURE;
			}
		} 
		else 
		{
			return FAILURE;
		}
	} 
    catch (CInternetException* e)
    {
        Clear();
        DWORD dwErrorCode = e->m_dwError;
        e->Delete();
 
        DWORD dwError = GetLastError();
 
       // PRINT_LOG("dwError = %d", dwError, 0);
 
        if (ERROR_INTERNET_TIMEOUT == dwErrorCode)
        {
            return OUTTIME;
        }
        else
        {
            return FAILURE;
        }
    }
	return SUCCESS;
}
 
int CHttpClient::HttpGet(LPCTSTR strUrl, LPCTSTR strPostData, string &strResponse)
{
    return ExecuteRequest("GET", strUrl, strPostData, strResponse);
}
 
int CHttpClient::HttpPost(LPCTSTR strUrl, LPCTSTR strPostData, string &strResponse)
{
    return ExecuteRequest("POST", strUrl, strPostData, strResponse);
}

wchar_t* CHttpClient::ANSIToUnicode(const char* str)
{
	int textlen;
	wchar_t * result;
	textlen = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
	result = (wchar_t *)malloc((textlen + 1) * sizeof(wchar_t));
	memset(result, 0, (textlen + 1) * sizeof(wchar_t));
	MultiByteToWideChar(CP_ACP, 0, str, -1, (LPWSTR)result, textlen);
	return result;
}

char* CHttpClient::UnicodeToUTF8(const wchar_t* str)
{
	char* result;
	int textlen;
	textlen = WideCharToMultiByte(CP_UTF8, 0, str, -1, NULL, 0, NULL, NULL);
	result = (char *)malloc((textlen + 1) * sizeof(char));
	memset(result, 0, sizeof(char) * (textlen + 1));
	WideCharToMultiByte(CP_UTF8, 0, str, -1, result, textlen, NULL, NULL);
	return result;
}

char* CHttpClient::UnicodeToANSI(const wchar_t* str)
{
	char* result;
	int textlen;
	textlen = WideCharToMultiByte(CP_ACP, 0, str, -1, NULL, 0, NULL, NULL);
	result = (char *)malloc((textlen + 1) * sizeof(char));
	memset(result, 0, sizeof(char) * (textlen + 1));
	WideCharToMultiByte(CP_ACP, 0, str, -1, result, textlen, NULL, NULL);
	return result;
}

仔细观察上面所说函数,就可以看到在ExecuteRequest函数中处理了多字节转为utf8格式,后面单独写了几种其他转码方式,这几种方式在转码时总觉得有问题,详细介绍大家参考以上内容。

后面说下json数据,这里我们的http使用的是get请求方式,贴一份我查询会议的代码,内容相对全些,后面再介绍。

int CDatabaseManage::QueryMRInBooked( CString roomId,CString data ,HWND hwnd)
{
    TMRBookedInfo   tmrBookedInfo;
	TMRBookedInfoArray  tmrBookedInfoArray;
	tmrBookedInfoArray.clear();
	UINT uiRet  = -1;
	if (m_httpCtrl == NULL)
	{
		m_httpCtrl = new CHttpClient();
	}
	CString strUrl,strPostData ;
	strUrl.Format(_T("http://此处是ip地址:端口号/QueryConferenceRecord?content={\"Conference_Index\":\"%s\",\"RecordTime\":\"%s\"}"),roomId,data);
	string strResponse="";
	uiRet = m_httpCtrl->HttpGet(strUrl,strPostData,strResponse);
	if ((uiRet == SUCCESS) &&(!strResponse.empty()))
	{
		Json::Value root;
		Json::Reader reader;

		if (reader.parse(strResponse,root,false))
		{
		
			if (root.isMember("content"))
			{
				Json::Value jsResult=root["content"];
				if (jsResult.size()==0)
				{
					return 0;
				}
				uiRet = jsResult.size();
				for(int i=0;i<jsResult.size();i++)
				{
					if (jsResult[i].isMember("Index"))
					{
                           tmrBookedInfo.uiIdx = jsResult[i]["Index"].asInt();
					}
					if (jsResult[i].isMember("Subject"))
					{
						tmrBookedInfo.strObj = jsResult[i]["Subject"].asCString();
					}
					if (jsResult[i].isMember("BeginTime"))
					{
						tmrBookedInfo.uiBeginTime = jsResult[i]["BeginTime"].asCString();
					}
					if (jsResult[i].isMember("EndTime"))
					{
						tmrBookedInfo.uiEndTime = jsResult[i]["EndTime"].asCString();
					}
					if (jsResult[i].isMember("UserName"))
					{
						tmrBookedInfo.uiUserName =jsResult[i]["UserName"].asCString();
					}
					tmrBookedInfoArray.push_back(tmrBookedInfo);
				}
				::SendMessage(hwnd,CM_SHOWRECORD,(WPARAM)&tmrBookedInfoArray,0);
			}
		}
		
	}

	return uiRet;
}

    在strUrl中包含了我需要发送到服务端得ip、端口号,以及打包的json数据,后面使用HttpGet请求,此时就可以获取到服务端响应的json数据,保存在了strResponse中,这些都是在HttpClient.cpp中实现的,后面就是进行解析了,因为每个人写法习惯不一样,这里我只说下其中的conten是key值,后面的是value,至于定义key的内容,需要你们自己商量,或者你在了解下json格式,然后将你解析后数据再发送给所需要的部分就完成了json的解析发送。至此完成所有过程。

    以下链接是对上一篇以及这一篇代码的总体实现,因为自身使用Unicode编码转换的,其中有我详细使用的http以及json数据的解析,创作不易,有兴趣可以看下。

   链接:https://download.csdn.net/download/hfuu1504011020/11057233

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++实现http客户端连接服务端及客户端json数据的解析 的相关文章

  • 物联网安全系列 - 非对称加密算法 ECDH

    非对称加密算法 ECDH 背景 之前的章节讲到了对称加密算法AES xff0c 发送方和接收方需要使用相同的密钥进行通讯 xff0c 但是发送方怎么将密钥安全的发送给接收方 xff1f 这是一个问题 密钥分配问题 对称加密算法中 xff0c
  • 【开源】一款PyQT+Pyserial开发的串口调试工具

    开源 PyQT 43 Pyserial开发的串口调试工具 串口调试工具是我们做嵌入式开发常用的工具 xff0c 市面上已经有很多串口调试工具了 xff0c 博主写这款串口调试工具一方面是为了学习Python PyQT Pyserial 相关
  • 【Matter】解密Matter协议(一)--- 什么是Matter协议?

    1 什么是Matter协议 xff1f 目前的智能家居行业使用解决方案众多 xff0c 相互之间隔离严重 xff0c 有WiFi 蓝牙 ZigBee 蜂窝或者有线等等不同通讯协议的设备 不仅不同协议之间的设备不能互通 xff0c 而且连相同
  • 【蓝牙系列】蓝牙5.4到底更新了什么?(1)--- PAwR

    蓝牙系列 蓝牙5 4到底更新了什么 xff08 1 xff09 PAwR 一 背景 蓝牙技术联盟最近发布了蓝牙5 4的核心规范 xff0c 蓝牙5 4规范的主要改进之一就是实现了单个接入点与数千个终端节点进行双向无连接通信 xff0c 这一
  • UP Squared Board,工业级创新开发板,为您的物联网应用注入升级能量

    研扬科技自推出UP Board xff08 世界首创 Intel 平台信用卡大小开发板 xff09 以来 xff0c 便成功于业界打开名号 xff0c 后续 xff0c 研扬持续开发 UP 系列产品 xff0c 至今 xff0c 除了 UP
  • 【蓝牙系列】蓝牙5.4到底更新了什么(2)

    蓝牙系列 蓝牙5 4到底更新了什么 xff08 2 xff09 一 背景 上一篇文章讲了蓝牙5 4的PAwR特征 xff0c 非常适合应用在电子货架标签 xff08 ESL xff09 领域 xff0c 但是实际应用场景中看 xff0c 只
  • 【转载】【Nordic博文分享系列】详解Zephyr设备树(DeviceTree)与驱动模型

    详解Zephyr设备树 xff08 DeviceTree xff09 与驱动模型 转载自nordic半导体微信公众号 1 前言 Nordic最新的开发包NCS xff08 nRF Connect SDK xff09 相对于原来的nRF5 S
  • 感受一下SPL06气压计+APM三阶互补的高度融合

    不得不说 xff0c spl06气压计很强 xff0c 原始数据也比较干净 xff0c 短时间可以保持在30cm内浮动 xff0c 滤波后在10cm内浮动 就是这么夸张 使用APM的三阶互补滤波融合出 高度 xff0c 速度 xff0c 效
  • 6种串口协议的实现

    串口协议开发 以下解析范式都是采用数据队列的形似来存储 xff0c 并且根据设备运行速度差异 xff0c 还需增加数据包队列来存储解析完毕的数据包 1 范式一 固定长度 无校验 0x6B 20字节 0xB6 上面数据中有一个帧头0x6B x
  • html页面实时刷新显示服务器数据

    在上一篇中我说到浏览器和服务器交互数据 xff0c 是实现了服务器发数据给浏览器 xff0c 并在页面上显示 xff0c 但是是通过按钮点击刷新的 xff0c 而且数据是和html页面一起发过来的 xff0c 在这里我是数据放到页面数组里
  • 平衡小车之家客服真差

    我同事送了我一台直流电机平衡车 xff0c 然后同事又买了一台步进电机平衡车 都是在平衡小车之家买的 xff0c 好好看看下面的图片 最近在研究同事的步进平衡小车 xff0c 然后跑去问一下客服步进电机的参数 xff0c 一看我说 xff0
  • C++编译流程

    C 43 43 编译流程 C C 43 43 是编译型高级语言 xff0c 程序要执行 xff0c 必须要有编译器和链接器 编译过程分为四步 xff1a 预处理 编译 汇编 链接 1 预处理 读取源代码并对其中的以 开头的指令和特殊符号进行
  • 卡尔曼滤波 -- 从推导到应用(一)

    前言 卡尔曼滤波器是在估计线性系统状态的过程中 xff0c 以 最小均方误差为目的而推导出的几个递推数学等式 也可以从贝叶斯推断的角度来推导 本文将分为两部分 xff1a 第一部分 xff0c 结合例子 xff0c 从最小均方误差的角度 x
  • 卡尔曼滤波 -- 从推导到应用(二)

    该文是自我总结性文章 xff0c 有纰漏 xff0c 请指出 xff0c 谢谢 白巧克力 这部分主要是通过对第一部分中提到的匀加速小车模型进行位移预测 先来看看状态方程能建立准确的时候 xff0c 状态方程见第一部分分割线以后内容 xff0
  • LQR 的直观推导及简单应用

    本文主要介绍LQR的直观推导 xff0c 说明LQR目标函数J选择的直观含义以及简单介绍矩阵Q R的选取 xff0c 最后总结LQR控制器的设计步奏 xff0c 并将其应用在一个简单的倒立摆例子上 假设有一个线性系统能用状态向量的形式表示成
  • STM32学习路线-长图

    最近好好整理了一下学习STM32的路程 xff0c 做成了一个长图 xff1a STM32学习路线 xff0c 供初学者们参考一下
  • ROS 教程之 vision: 摄像头标定camera calibration

    在上一个ROS教程视觉文章中 xff0c 我们使用usb cam包读入并发布了图像消息 xff0c 但是图像没有被标定 xff0c 因此存在畸变 ROS官方提供了用于单目或者双目标定的camera calibration包 这个包是使用op
  • ROS 基础: 在同一个节点里订阅和发布消息

    在一些应用中 xff0c 可能有的人需要在同一个节点中实现订阅一个消息 xff0c 然后在该消息的回调函数中处理一下这些数据后再发布到另一个topic上 ROS answers中也有人有相同的疑问 xff0c 这里贴出Martin Peri
  • ROS : 修改ROS源代码(overlaying package)

    ROS官方或者其他个人提供了很多package供大家使用 xff0c 但是随着学习的深入 xff0c 很多人可能想去修改这些package的源代码 xff0c ROS提供了一种称之为overlaying的机制 它允许 ROS原有安装的pac
  • graph slam tutorial :从推导到应用3

    为了更好地理解graph based slam的过程 xff0c 本文以二维平面的激光SLAM为例子 xff0c 先简单介绍如何根据传感器信息构建图 xff0c 即图优化的前端 xff08 front end xff09 然后再针对上篇博客

随机推荐

  • graph slam tutorial : 从推导到应用1

    前言 SLAM问题的处理方法主要分为滤波和图优化两类 滤波的方法中常见的是扩展卡尔曼滤波 粒子滤波 信息滤波等 xff0c 熟悉滤波思想的同学应该容易知道这类SLAM问题是递增的 实时的处理数据并矫正机器人位姿 比如基于粒子滤波的SLAM的
  • graph slam tutorial :从推导到应用2

    在上一部分中通过一个例子大致了解了graph based slam的优化过程 在本篇博客中将提升一个层次 xff0c 对图优化的求解过程进行推导 由于博文关注的在图构建好以后 xff0c 如何调整机器人位姿使误差最下 因此 xff0c 本文
  • graph slam tutorial : g2o 的使用

    g2o全称general graph optimization xff0c 是一个用来优化非线性误差函数的c 43 43 框架 如果阅读了前几篇graph slam tutorial的博客 xff0c 再去读 g2o xff1a a gen
  • Monocular slam 的理论基础(1)

    前言 LSD SLAM和ORB SLAM的出现 xff0c 使得单目slam最近成为了研究热点 单目SLAM一般处理流程包括track和map两部分 所谓的track是用来估计相机的位姿 而map部分就是计算pixel的深度 xff0c 如
  • Monocular slam 中的理论基础(2)

    三角法求深度 xff08 triangulation xff09 在知道了相机的轨迹以后 xff0c 使用三角法就能计算某个点的深度 xff0c 在Hartley的 Multiple view Geometry 一书中第10章 第12章都是
  • svo: semi-direct visual odometry 论文解析

    SVO 从名字来看 xff0c 是半直接视觉里程计 xff0c 所谓半直接是指通过对图像中的特征点图像块进行直接匹配来获取相机位姿 xff0c 而不像直接匹配法那样对整个图像使用直接匹配 整幅图像的直接匹配法常见于RGBD传感器 xff0c
  • 想精通单片机开发,这些必备基础知识不可不掌握

    总体谈一谈对单片机学习的看法 1 我从不说51是基础 xff0c 如果我这么说 xff0c 也请把这句话理解为微机原理是基础 2 对51单片机的操作本质上就是对寄存器的操作 xff0c 对其他单片机也是如此 库只是一个接口 xff0c 方便
  • 从零开始手写 VIO

    前言 最近和高博合作推出了一个关于 VIO 的课程 xff0c 借此博客推荐下 这个课程的图优化后端是我们自己写的 xff0c 仅依赖 Eigen 实现后系统的精度和 ceres 以及 g2o 不相上下 个人感觉这个课程还是能学到不少东西
  • 如何用示波器测量串口波特率

    例如波特率为9600理解为 xff1a 单位时间内传输9600个码元 xff08 位 xff09 1s内可以传输9600位数 假如要测量波特率为9600 xff0c 则每一比特位的时间为 xff1a 1 9600 61 104us 一般示波
  • PHPstorm2018汉化方法

    PhpStorm 2018汉化包下载地址 xff1a https pan baidu com s 1sAPfpPrN3IvZSyGU2kFWmQ 8 将安装目录lib下的resources en jar文件删除 xff0c 然后将压缩包中的
  • CMake学习(3)—— 使用add_subdirectory()添加外部项目文件夹

    一般情况下 xff0c 我们的项目各个子项目都在一个总的项目根目录下 xff0c 但有的时候 xff0c 我们需要使用外部的文件夹 xff0c 怎么办呢 xff1f 例如 xff0c 在目录cxx utility example内的CMak
  • docker高级篇

    docker高级篇 一 dockerfile解析 1 dockerfile是什么 dockerfile是用来构建docker镜像的文本文件 xff0c 是有一条条构建镜像所需的指令和参数构成的脚本 2 dockerfile常用保留字指令 F
  • 死锁

    死锁 xff1a 死锁是指两个或两个以上的进程进在执行过程中 xff0c 由于资源竞争或由于相互通信而造成的一种阻塞式现象 xff0c 如果没有外力影响 那么它们将永远的持续下去 xff0c 此事称系统产生死锁现象 xff0c 这种永远互相
  • pygame入门教程-基础篇

    1 画布surface 我们先启动一个窗口 span class token keyword import span pygame pygame span class token punctuation span init span cla
  • LeetCode刷题(废弃)

    重要提示 xff1a 该博客不再更新 xff01 最新文章请参考LeetCode系列 xff01 为了更好地巩固算法知识 xff0c 打下扎实的计算机基础 好吧 xff0c 实在编不下去了 其实是闲着没事儿做 xff0c 不如动动脑 xff
  • 基于STM32的GPS模块驱动(AIR530)

    一 概述 由于做项目要用到GPS定位 xff0c 于是在某宝购买了这款GPS模块 项目采用的MCU是STM32 废话少说 xff0c 进入正题 二 GPS模块简介 Air530 模块是一款高性能 高集成度的多模卫星定位导航模块 体积小 功耗
  • UCOSIII中的任务调度和任务切换

    1 基本概念 任务调度的思想是 xff0c 几乎每时每刻让优先级别最高的就绪任务处于运行状态 xff0c 它由任务调度器来完成这个工作 xff08 任务级调度器OSShed 和中断级调度器OSIntExit xff09 任务切换 xff0c
  • 嵌入式开发者都该了解的10大算法

    算法一 xff1a 快速排序法 快速排序是由东尼 霍尔所发展的一种排序算法 在平均状况下 xff0c 排序 n 个项目要 n log n 次比较 在最坏状况下则需要 n2 次比较 xff0c 但这种状况并不常见 事实上 xff0c 快速排序
  • 蓝桥杯备赛——第八届省赛(模拟升降控制器)

    第八届省赛题目的控制逻辑相比之前更加复杂 xff0c 需要花一定的时间来理清逻辑 xff08 利用状态机 xff09 虽然之前对状态机有所了解 xff0c 但这是我第一次使用状态机 注 xff1a 1 PWM输出 xff1a PA6 TIM
  • C++实现http客户端连接服务端及客户端json数据的解析

    上一篇链接 xff1a https blog csdn net hfuu1504011020 article details 88785448 上一篇中说到Unicode转utf8格式的过程 xff0c 其中谈及到http以及json数据的