winCE中实现虚拟串口的方法

2023-11-13

转载请标明是引用于 http://blog.csdn.net/chenyujing1234 

欢迎大家拍砖!

 

环境:wince6.0+ARM+Freescell

 

一、目的

设计一个读GPS串口数据的驱动,并注册为COM口。

二、实现过程

1、COM_Init

注册表中读出GPS COM口号及是否Debug,创建共享数据区,创建读取数据的线程,打开GPS真实的COM口;

开一线程MonitorCommEventProc读取GPS口数据,并用DecodeGpsBuf解析读取到的数据。

这里注意在WinCE驱动中的XXX_Init中的入口参数DWORD dwContext通过

LPCTSTR regKeyPath = (LPCTSTR)dwContext;HKEY hKey = OpenDeviceKey(regKeyPath);可以转化为其所在驱动的.reg注册的HKEY。

 

DWORD COM_Init(DWORD dwContext)   
{   
	DWORD dwPare,dwReturn;
	LPCTSTR regKeyPath = (LPCTSTR)dwContext;
	HKEY hKey = OpenDeviceKey(regKeyPath);

	DWORD size = 4;
	DWORD index;

	MyPDebugStringW(L"Enter Com_Init");
	if ( hKey == NULL )
	{
		MyPDebugStringW(L"Fun:%s; hKey == NULL", __FUNCTIONW__);
		//return NULL;
	}
	if (ERROR_SUCCESS != RegQueryValueEx(hKey,_T("GpsCom"), 0, NULL, (LPBYTE)&g_GsmPort, &size))
	{
	//	RETAILMSG(TRUE,(TEXT("We get original com index :%d ......\r\n"),g_GsmPort));
	}
	if (ERROR_SUCCESS != RegQueryValueEx(hKey,_T("Dbg"), 0, NULL, (LPBYTE)&g_bDbg, &size))
	{
	//	RETAILMSG(TRUE,(TEXT("We get original com index :%d ......\r\n"),g_GsmPort));
	}
#if 0
	if (ERROR_SUCCESS != RegQueryValueEx(hKey,_T("Index"), 0, NULL, (LPBYTE)&index, &size))
	{
		RegCloseKey(hKey);
		return NULL;
	}

	GetFromVirtalRegistry((BYTE *)&g_GsmPort,&size, NULL, HKEY_LOCAL_MACHINE, _T("virtalSerial"), _T("Index"));
#endif
	RegCloseKey(hKey);

	MyPDebugStringW(L"The apply port is com%d", g_GsmPort);
	InitializeCriticalSection(&g_csOpen);   
	InitializeCriticalSection(&g_csRead);   
	InitializeCriticalSection(&g_csWrite);   
	
	g_dwWM_PEKSUNNY  = RegisterWindowMessage(L"WM_PEKSUNNY");
	if(!g_hEventComm)
		g_hEventComm = CreateEvent(NULL,TRUE,FALSE,NULL);   

#if 0
	//给GSM模块上电
	dwPare=(0<<16)|(21<<8)|(1);
	KernelIoControl(IOCTL_HAL_SET_GPIO_HIGH_LOW,&dwPare,sizeof(DWORD),NULL,0,&dwReturn);
	dwPare=(0<<16)|(26<<8)|(1);
	KernelIoControl(IOCTL_HAL_SET_GPIO_HIGH_LOW,&dwPare,sizeof(DWORD),NULL,0,&dwReturn);
#endif
	g_pGpsDataMem = (PGPSDATA)ReadShareArea();

	g_pGpsDataMem->iSatNum = 67;

	return OpenTransmitThr();
  
}   
BOOL OpenTransmitThr()
{
	TCHAR szPort[12];
	swprintf(szPort, L"COM%u:", g_GsmPort);

	g_hCom = CreateFile(szPort, GENERIC_READ | GENERIC_WRITE , 0, NULL, OPEN_EXISTING, 0, NULL);
	if(g_hCom == INVALID_HANDLE_VALUE )   
	{   
		MyPDebugStringW(L"Fun:%s; CreateFile %s failed", __FUNCTIONW__, szPort);  
		return FALSE;   
	}   
	else  
	{   
		MyPDebugStringW(L"Fun:%s; CreateFile %s success", __FUNCTIONW__, szPort);   
	} 

#if 1
	if(!InitComDcb(g_hCom,CBR_9600))
	{
		MyPDebugStringW(L"Fun:%s; Line:%d; InitComDcb failed", __FUNCTIONW__, __LINE__);
	}
		//goto SET_SUCCEED_FLAG;
	if(!InitComTimeOuts(g_hCom))
	{
		MyPDebugStringW(L"Fun:%s; Line:%d; InitComTimeOuts failed", __FUNCTIONW__, __LINE__);
	}
		//goto SET_SUCCEED_FLAG;
	SetupComm(g_hCom, 1024,1024);
	PurgeComm(g_hCom, PURGE_TXCLEAR|PURGE_RXCLEAR|PURGE_RXABORT|PURGE_TXABORT);

	//设置端口上指定信号的状态
	// SETDTR: 发送DTR (data terminal ready)信号
	// SETRTS: 发送RTS (request to send)信号
	EscapeCommFunction(g_hCom,SETDTR);
	EscapeCommFunction(g_hCom,SETRTS);
#endif

	InterlockedExchange((LPLONG)(&g_bExitMonitorProc),FALSE);   
	g_hReadThread =CreateThread(NULL,NULL,MonitorCommEventProc,NULL,NULL,NULL); 
	return TRUE;
}



 

DWORD MonitorCommEventProc(LPVOID pParam)   
{   
	TCHAR wcDebug[1024] = {0};

	MyPDebugStringW(L"Enter MonitorCommEventProc");
	SetCommMask(g_hCom, EV_RXCHAR);
	while(!g_bExitMonitorProc)   
	{    
		DWORD   dwErrorFlags;
		COMSTAT ComStat;
		DWORD dwLength;
		DWORD dwEvtMask = 0;   
		DWORD dwRead = 0;

		BOOL bWaitRes = WaitCommEvent(g_hCom, &dwEvtMask, NULL); 
		//		RETAILMSG(TRUE,(TEXT("VSP comm event come %d ,last set is %d\r\n"),dwEvtMask,g_dwWaitMask));
		//MyPDebugStringW(L"Gps com has event come up");
		if(dwEvtMask==0)
		{
			//wait error
			Sleep(30);

			if(g_dwWaitMask)
			{
				continue; //Last set is not null,give up,because exit read thread need null event
			}
		}

		if(bWaitRes == FALSE)   
		{   
			continue;   
		}     

		if(dwEvtMask & EV_RXCHAR)   
		{   
			Sleep(20);

			EnterCriticalSection(&g_csRead);    

			ClearCommError(g_hCom,&dwErrorFlags,&ComStat);
			dwLength=ComStat.cbInQue;

			if(/*dwLength>0*/1)
			{
				ZeroMemory(g_vtBufRead, sizeof(g_vtBufRead));
				ReadFile(g_hCom, &g_vtBufRead, sizeof(g_vtBufRead), &dwRead, NULL);

			 	mbstowcs(wcDebug,  (char*)g_vtBufRead, strlen((char*)g_vtBufRead));
			//	OutputErrorInfo(L"Read data:%s\r\n", wcDebug);
			//	DecodeGpsNema((char*)g_vtBufRead);
				DecodeGpsBuf((char*)g_vtBufRead);

				g_dwLenReadBuf=dwRead;

				if(g_pChanle1)
				{
					g_pChanle1->iIndex = 0;
					g_pChanle1->iTolLen = dwRead;
					memcpy(g_pChanle1->cReadBuf,g_vtBufRead,dwRead);
				}
				if(g_pChanle2)
				{
					g_pChanle2->iIndex = 0;
					g_pChanle2->iTolLen = dwRead;
					memcpy(g_pChanle2->cReadBuf,g_vtBufRead,dwRead);
				}
				if(g_pChanle3)
				{
					g_pChanle3->iIndex = 0;
					g_pChanle3->iTolLen = dwRead;
					memcpy(g_pChanle3->cReadBuf,g_vtBufRead,dwRead);
				}

			}
			else
			{
				RETAILMSG(g_bDbg,(L"[VSP]:ClearCommError(%d): dwLength is 0,continue ......\r\n",dwErrorFlags));
				//	LeaveCriticalSection(&g_csRead);
				//	continue;
			}

			LeaveCriticalSection(&g_csRead);   
		}   
#if 0
		//if(dwEvtMask == EV_RXCHAR && ((g_dwWaitMask & EV_RXCHAR) == 0 || dwRead == 0))   
		if(dwEvtMask == EV_RXCHAR && ((g_dwWaitMask & EV_RXCHAR) == 0 ))   
		{   
			//The return event mask is only EV_RXCHAR and there is not EV_RXCHAR in the wait mask.   
			RETAILMSG(g_bDbg,(L"Skip send event C......\r\n"));
			continue;   
		}   
#endif
		InterlockedExchange((LPLONG)(&g_dwEvtMask),dwEvtMask);   
		PulseEvent(g_hEventComm);
		//	RETAILMSG(TRUE,(TEXT("PulseEvent %d\r\n"),g_dwEvtMask));

		//Sleep for other thread to respond to the event   
		//	Sleep(100);   
		Sleep(20); 

		DEBUGMSG(g_bDbg,(TEXT("[VSP]:PulseEvent! The event-mask is 0x%x\r\n"),dwEvtMask));    

	}   

	MyPDebugStringW(L"Fun:%s; over MonitorCommEventProc", __FUNCTIONW__);

	return 0;   
}   
2、COM_Open

为了让上层的应用程序能实现三次打开此设备而初始化三块COM_DEV内存。

typedef struct
{
	int iIndex;
	int iTolLen;
	BYTE cReadBuf[READ_BUFFER_LENGTH];
}COM_DEV,*PCOM_DEV;


 

DWORD COM_Open(DWORD dwData, DWORD dwAccess, DWORD dwShareMode)   
{   
	PCOM_DEV pComDev = NULL;

	MyPDebugStringW(L"Enter %s", __FUNCTIONW__);
	EnterCriticalSection(&g_csOpen);   
	if(!g_pChanle1)
	{
		g_pChanle1 = new COM_DEV;
		g_pChanle1->iTolLen = g_pChanle1->iIndex = 0;
		pComDev = g_pChanle1;
	}
	else if(!g_pChanle2)
	{
		g_pChanle2 = new COM_DEV;
		g_pChanle2->iTolLen=g_pChanle2->iIndex =0;
		pComDev = g_pChanle2;
	}
	else if(!g_pChanle3)
	{
		g_pChanle3 = new COM_DEV;
		g_pChanle3->iTolLen=g_pChanle3->iIndex =0;
		pComDev = g_pChanle3;
	}
	else
	{
		return 0;
	}

#if 1
	//The variable   
	if(g_uiOpenCount >= MAX_OPEN_CNT)
		return 0;

	g_uiOpenCount ++;  
	pComDev->iIndex = 0;
	//	dwResult = dwData;   

LEAVE_CRITICAL_SECTION:    
#endif
	LeaveCriticalSection(&g_csOpen); 
	return (DWORD)pComDev;   
}   

3、COM_Deinit

主要是关闭读线程,反初始化资源;

关闭线程的方法有几种:

(1)是直接CloseHandle真实的COM口,然后在线程中会WaitCommEvent失败,然后退出,这这种方法太间接;

(2)设备全局变量,采用原子操作函数来变化它的标识。

A、定义变量:BOOL g_bExitMonitorProc = FALSE;   ;

B、在线程中:

DWORD MonitorCommEventProc(LPVOID pParam)   
{   
 TCHAR wcDebug[1024] = {0};

 MyPDebugStringW(L"Enter MonitorCommEventProc");
 SetCommMask(g_hCom, EV_RXCHAR);
 while(!g_bExitMonitorProc)   
 {  

C、在创建线程前使它为FLASE:

InterlockedExchange((LPLONG)(&g_bExitMonitorProc),FALSE);   

D、在要关闭线程时:

BOOL CloseTransmitThr()
{
	DWORD dwMask = 0; 
	//Notify the monitor thread to exit.    
	InterlockedExchange((LPLONG)(&g_bExitMonitorProc),TRUE);   

4、COM_IOControl

为了使应用程序能像使用真实COM口一样的使用虚拟COM口,我们需要给出COM_IOControl,并去case需要的IOCODE,

(1)IOCTL_SERIAL_SET_TIMEOUTS
应用程序设备虚拟COM口的此接口,我们就给真实的COM口通过系统API SetCommTimeouts来设置:

SetCommTimeouts(g_hCom,(LPCOMMTIMEOUTS)(pBufIn));   

(2)IOCTL_SERIAL_GET_TIMEOUTS

类似于(1)

(3)IOCTL_SERIAL_SET_DCB

类似于(1)

(4)IOCTL_SERIAL_GET_DCB

类似于(1)

(5)IOCTL_SERIAL_WAIT_ON_MASK

(5、1)因为我们的读线程中有调用了WaitCommEvent,所以这里我们得做好同步,同步的方法是:

A、初始化事件

g_hEventComm = CreateEvent(NULL,TRUE,FALSE,NULL);   

B、在读取完数据后让事件激活

PulseEvent(g_hEventComm);

C、在case IOCTL_SEARIAL_WAIT_ON_MASK时去等待

case IOCTL_SERIAL_WAIT_ON_MASK:   
		{      
			MyPDebugStringW(L"receive IOCTL_SERIAL_WAIT_ON_MASK");
			if(dwBufOutSize < sizeof(DWORD) ||  WaitForSingleObject(g_hEventComm,INFINITE) == WAIT_TIMEOUT)   
			{   

(5、2)把读线程WaitCommEvent返回的结果返回给应用程序

A、

BOOL bWaitRes = WaitCommEvent(g_hCom, &dwEvtMask, NULL); 

B、

InterlockedExchange((LPLONG)(&g_dwEvtMask),dwEvtMask);   


C、在case IOCTL_SEARIAL_WAIT_ON_MASK等待成功时

InterlockedExchange((LPLONG)(pBufOut),g_dwEvtMask);   

 

(6)IOCTL_SERIAL_SET_WAIT_MASK

g_dwWaitMask = *(DWORD*)(pBufIn);   
			RETAILMSG(g_bDbg,(TEXT("VSP : Set wait mask : %d ......\r\n"),g_dwWaitMask));
			return SetCommMask(g_hCom,g_dwWaitMask | EV_RXCHAR); //The driver need the EV_RXCHAR notify event.   

也是调用了系统的SetCommMask,不过对入口设置的标志或上了EV_RXHCAR,因为我们的驱动需要EX_RXCHAR 通知事件。

 

(7)IOCTL_SERIAL_GET_WAIT_MASK

(8)IOCTL_SERIAL_GET_COMMSTATUS

(9)

 

 

三、实现机制要点

(1)采用文件映射实现共享数据。

(1、1)共享的数据为GPS数据,在COM_Init中去创建文件映射:

	g_pGpsDataMem = (PGPSDATA)ReadShareArea();

	g_pGpsDataMem->iSatNum = 67;


映射文件的大小由SHARE_MEM_SIZE指定,为256。

PVOID ReadShareArea()   
{   
	PBYTE pShareMem=NULL;
	HANDLE hMySharedFile=
		CreateFileMapping((HANDLE)0xFFFFFFFF,NULL,PAGE_READWRITE,0,SHARE_MEM_SIZE,SHARE_MEM_NAME);
	if(hMySharedFile!=NULL)
		pShareMem =(PBYTE)MapViewOfFile(hMySharedFile,FILE_MAP_ALL_ACCESS,0,0,0);
	CloseHandle(hMySharedFile);

	return pShareMem;  
}


(1、2)在COM _Open中为应用程序分析三个内存用于存储在读线程中得到的数据。

其中存储线程中得到的数据为:

DecodeGpsBuf((char*)g_vtBufRead);

				g_dwLenReadBuf=dwRead;

				if(g_pChanle1)
				{
					g_pChanle1->iIndex = 0;
					g_pChanle1->iTolLen = dwRead;
					memcpy(g_pChanle1->cReadBuf,g_vtBufRead,dwRead);
				}
				if(g_pChanle2)
				{
					g_pChanle2->iIndex = 0;
					g_pChanle2->iTolLen = dwRead;
					memcpy(g_pChanle2->cReadBuf,g_vtBufRead,dwRead);
				}
				if(g_pChanle3)
				{
					g_pChanle3->iIndex = 0;
					g_pChanle3->iTolLen = dwRead;
					memcpy(g_pChanle3->cReadBuf,g_vtBufRead,dwRead);
				}


(1、3)在导出给应用程序的接口ReadGpsFromCom中把映射的数据拷到形参中

BOOL ReadGpsFromCom(PVOID pReadBuf)
{
	MyPDebugStringW(L"Enter %s", __FUNCTIONW__);
	PGPSDATA pGpsDataMem= (PGPSDATA)ReadShareArea();;
	memcpy(pReadBuf,pGpsDataMem,sizeof(GPSDATA));
	if(pGpsDataMem)
		UnmapViewOfFile(pGpsDataMem);
	return TRUE;
}


 

 

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

winCE中实现虚拟串口的方法 的相关文章

  • 何时检查未定义以及何时检查 null

    赏金编辑 我正在寻找一个很好的解释 当你应该设置 使用null or undefined以及您需要在哪里进行检查 基本上这两者的常见做法是什么 真的可以在通用的可维护代码中单独对待它们吗 我什么时候可以安全地检查 null 安全地检查 un
  • Linux 仅使用时间/日期戳重命名文件

    我有一个文件 我想将 mv 重命名为year month day h m s 最好的方法是什么 我已尝试以下操作 但它不会动态添加正确的标记 原始文件名称中实际上有一个反斜杠 mv getnw myfilename txt Y m d H
  • 在出错之前如何检查 nilClass 的未定义方法?

    我目前正在使用以下内容 20 p Status p 但是 我仍然收到以下错误 ActionView TemplateError undefined method status for nil NilClass on line 20 of a
  • Mac 终端错误:-bash: /Users/tim/.profile: 没有这样的文件或目录

    每次我打开新的终端窗口时 我都会看到以下内容 bash Users tim profile No such file or directory 我不知道为什么会发生这种情况 也不知道到哪里去解决它 我的个人资料位于 Users tim ba
  • DBNull 怎么会不等于 DBNull

    我有以下代码行 if DBNull Value Equals o o null where o is object o in row ItemArray我不断收到错误 gt Xml type List of xdt untypedAtomi
  • Java 空值检查

    我有一个thread1 if object null object play 和另一个thread2可以写null into object随时参考 我将同时运行这些线程 我知道thread2可以重写object后参考null检查并会抛出Nu
  • 使用转义序列渲染文本(如终端)

    你好 我正在寻找一些库或工具来在文本文件中呈现带有转义序列字符的文本 我不知道如何称呼它 但这是一个例子 echo e abc vdef abc def echo e abc vdef gt tmp xxxxx vi tmp xxxxx 我
  • 将文本粘贴到 Macintosh 上的 emacs 中

    我使用的是 Macintosh 并且使用 终端 作为我的 shell 当我从任何窗口复制文本 通过鼠标拖动 然后鼠标右键菜单 gt 复制 然后将文本 鼠标右键 gt 粘贴 粘贴到运行 emacs 的终端中时 它不会充当粘贴 相反 它就像输入
  • 使用 jq 过滤空值和/或 null 值

    我有一个包含 jsonlines 的文件 想找到空值 name Color TV price 1200 available name DVD player price 200 color null 并希望输出空和 或空值及其键 availa
  • 如何使用 exec.Command 在 golang 中执行 Mysql 脚本

    您好 我正在尝试执行一个脚本以使用 Golang 将数据填充到数据库中 func executeTestScript cmd exec Command usr local mysql bin mysql h127 0 0 1 P3333 u
  • 无法索引空数组

    我正在使用一个模板 该模板根据服务器备份是否成功的条件设置单元格颜色 我有下面的代码 它不断抛出错误 无法索引到空数组 Cannot index into a null array At C Users admin Desktop new
  • 如何在 VS code 上安装 Windows 终端

    一切尽在标题 我也是俄罗斯人 这是谷歌翻译 我在任务管理器中打开该进程并转到文件位置 出现拒绝访问错误 但在计算机控制的帮助下已解决 但我不知道如何在 VS Code 中打开这个特定的终端 我首先介绍了OpenConsole 是的 但它只是
  • C# 中成员访问中的问号是什么意思?

    有人可以向我解释一下以下代码中会员访问中的问号是什么意思吗 它是标准 C 的一部分吗 尝试在 Xamarin Studio 中编译此文件时出现解析错误 this AnalyzerLoadFailed Invoke this new Anal
  • 使用 os.forkpty() 创建一个伪终端以 ssh 到远程服务器并与其通信

    我正在尝试编写一个 python 脚本 它可以 ssh 到远程服务器 并可以从 python 客户端执行 ls cd 等简单命令 但是 在成功 ssh 到服务器后 我无法读取伪终端的输出 任何人都可以在这里帮助我 以便我可以在服务器上执行一
  • 检查 SQL MAX() 函数返回 null

    我的问题是 如果我的表为空或者我使用 max 函数的列没有我指定的值 那么为什么 sqlDataReader hasRows TRUE 它给出了空记录 我该如何解决这个问题 提前致谢 像 MAX 这样的聚合函数将始终为每组返回一行 就您而言
  • 无法使用 Node.JS 将 null 值发送到 MySQL 数据库

    我正在尝试发送null使用 Node JS 到我的 MySQL 数据库 con query INSERT INTO Routes routeTrigger VALUES null title test function err result
  • 在 MacOS 上重新启动终端而不关闭

    如何在不关闭窗口的情况下重新启动当前的 MacOS 终端会话 在Linux中我使用exec bash但在这种环境下它不起作用 我对 bash profile 提示 别名等 我想在不关闭它并再次打开的情况下查看 只需输入命令 exec bas
  • Gulp BrowserSync 在终端中显示“重新加载浏览器”,但没有重新加载实际的浏览器。

    我遇到一个问题 我的任务正在按需要运行 并且 BrowserSync 似乎正在工作 但实际的浏览器没有重新加载 我在终端中收到正确的消息 表明一切都按计划进行 我正在为我的本地服务器使用 MAMP 该服务器正在为 WordPress 构建提
  • 通过 __get() 通过引用返回 null

    快速规格 PHP 5 3 error reporting 1 the highest 我正在使用 get 通过引用技巧神奇地访问对象中任意深度的数组元素 快速示例 public function get key return isset t
  • 向上移动箭头不突出显示文本 emacs iterm2

    我最近有人帮忙修复M left等等 终端元箭头键绑定中的 emacs https stackoverflow com questions 10867199 emacs in terminal meta arrow keybindings 但

随机推荐

  • 参考系列2:优化库——ceres(一)快速概览

    目录 1 ceres快速概览 1 1 问题建模和求解 1 1 1 问题建模 1 1 2 问题求解 1 2 ceres使用流程 1 3 求导方法 构建代价函数 STEP2 1 3 1 解析求导 自定义求导 SLAM中常用的 1 3 2 其他求
  • jmap heap输出解析

    jmap heap输出解析 jmap简介 jmap语法 jmap heap查看jvm参数 堆栈信息 jmap heap输出jvm参数解析 jmap简介 jmap JVM Memory Map 作用一方面是获取dump文件 堆转储快照文件 二
  • [分享] Python实现的基于深度学习的手写数字识别算法

    本文将采用深度学习中的卷积神经网络来训练手写数字识别模型 使用卷积神经网络建立合理的模型结构 利用卷积层中设定一定数目的卷积核 即滤波器 通过训练数据使模型学习到能够反映出十个不同手写提数字特征的卷积核权值 最后通过全连接层使用softma
  • Android studio安装与配置

    1 首先下载Android studio安装包 下载地址为 http www android studio org 这里采用3 0版本进行演示 对应安装包为android studio ide 171 4408382 windows exe
  • 【微服务】Nacos:发现、配置和管理微服务

    Nacos 发现 配置和管理微服务 Nacos 在阿里巴巴起源于 2008 2008 2008 年五彩石项目 完成微服务拆分和业务中台建设 成长于十年双十一的洪峰考验 沉淀了简单易用 稳定可靠 性能卓越的核心竞争力 随着云计算兴起 2018
  • odoo 附件上传的三种姿势

    odoo 附件上传的三种姿势 因公司业务需要实现上传附件功能 一番折腾找到了三种附件上传的姿势 不过好像用处不大 1 下载 odoo 自带模块 在应用里搜索附件列出以及文档索引 安装模块即可 这样在编辑界面就可以看见附件上传按钮 上传即可
  • 使用微软官方工具MediaCreationTool制作Windows10的U盘系统安装盘

    需要重装系Windows10系统 这里介绍使用微软官方工具MediaCreationTool制作Windows10的U盘安装盘的步骤 1 点击链接https www microsoft com zh cn software download
  • [每日两题系列]刷算法题咯~~

    今日题目 最多能完成排序的块II 统计子矩阵 本系列所选题目均来自力扣或者牛客网站 所选题目主要是以其中的简单题为主 中等题为辅 包含少数困难题 原因是 本人目前能力还不够 开展这个系列的目的是督促自己 在暑假的时间里也要保持有一定的刷题量
  • Docker修改默认数据目录Docker Root Dir

    环境 Docker版本 19 03 12 OS版本 CentOS Linux release 7 7 1908 Core docker 默认数据目录 Docker Root Dir 是 var lib docker 可通过 docker i
  • 数组参数:交换数组中最大值和最小值的位置

    题目 定义一个函数 功能 实现数组中最大值和最小值交换位置 解题思路 定义一个数组参数的函数 首先要先找到数组元素中的最大值和最小值 然后用我们常用的方法来将最大值和最小值进行转换 最后在main函数中调用所定义的f函数 include
  • 【Python游戏】Python各大游戏合集(3):飞翔的小鸟、俄罗斯方块、24点小游戏、吃豆豆小游、扫雷

    相关文件 关注小编 私信小编领取哟 当然别忘了一件三连哟 公众号 Python日志 可以关注小编公众号 会不定时的发布一下Python小技巧 还有很多资源可以免费领取哟 源码领取 加Python学习交流群 773162165 可以领取哟 开
  • 前端面试题---框架篇

    Vue面试题 面试题 Vue2 x 生命周期有哪些 Vue生命周期总共可以分为8个阶段 创建前后 载入前后 更新前后 销毁前销毁后 以及一些特殊场景的生命周期 面试题 第一次进入组件或者页面 会执行哪些生命周期 beforeCreate c
  • 7.20黄金涨势是否会延续?今日如何布局

    近期有哪些消息面影响黄金走势 今日黄金多空该如何研判 黄金消息面解析 国际金价周四 7月20日 徘徊在1984美元 盎司附近 投资者继续押注近期公布的美国经济数据让美联储有理由暂停加息 金价上个交易日触及的5月24日以来新高1985 25美
  • python爬取支付宝基金数据_钱袋子往哪走?教你用Python爬取基金数据

    年关将至 钱袋子往哪走 有人买了定期存款 3年 年利率 3 987 按存50w计算 0 0385 50万 3年息 6万 月息 1666 72元0 039785 50万 3年息 6 21万 月息 1724 53元0 04125 50万 3年息
  • 跳跃游戏(两种详细解答)

    第一种 从前开始 class Solution public boolean canJump int nums 定义reach为能够到达的最远距离 int reach 0 for int i 0 i lt reach i temp表示在下标
  • java调用微信支付接口

    https github com binarywang weixin java pay demo pox xml引入依赖
  • 为何AI无法完全理解人类情感?GPT-4能否理解人类的情绪?

    在科幻小说和电影里 我们经常看到超级AI人工智能机器人可以理解 感知甚至模拟人类的情感 但在现实世界中 我们距离这个目标还有一段相当长的距离 即使是强大的GPT 4甚至未来的GPT 5 过高夸大AI的体验和性能 往往并不利于科技的发展 元宇
  • 华为OD流程走完了

    我机试题地址 传送门 huaweiOD机试题 机试过了后 华为上海部HR一面 耗时30分钟左右 问了些家庭 个人工作经历 包括结婚否 为什么辞职之类的 技术二面 同样 自我介绍结束后 问了些项目相关的细节 该环节完后 面试官共享其试题 限时
  • 猿创征文 |万字长文搞定企业中的mysql数据库部署及使用

    文章目录 Mysql 二进制安装及mycat 读写分离 1 学习环境 2 初始化环境 2 1 关闭selinux 防火墙 2 2 修改主机名 2 3 配置域名解析 2 4 时间同步 3 mysql 安装 3 1 二进制包上传服务器 3 2
  • winCE中实现虚拟串口的方法

    转载请标明是引用于 http blog csdn net chenyujing1234 欢迎大家拍砖 环境 wince6 0 ARM Freescell 一 目的 设计一个读GPS串口数据的驱动 并注册为COM口 二 实现过程 1 COM