⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cechat.cpp

📁 基于WINCE的硬件ID转换程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	// Set event so that sender thread will send the text.
	SetEvent (g_hEnterEvent);
//	SetFocus (GetDlgItem (hWnd, hRecStarSNRInfo0));
	return 0;
}
//----------------------------------------------------------------------
// DoMainCommandSendText - Process the Send text button.
//
LPARAM DoMainCommandSendText (HWND hWnd, WORD idItem, HWND hwndCtl,
							  WORD wNotifyCode) {

	// Set event so that sender thread will send the text.
	SetEvent (g_hSendEvent);
	SetFocus (GetDlgItem (hWnd, ID_SENDTEXT));
	return 0;
}
//----------------------------------------------------------------------
// DoMainCommandAbout - Process the Help | About menu command.
//
LPARAM DoMainCommandAbout(HWND hWnd, WORD idItem, HWND hwndCtl,
						  WORD wNotifyCode) {
	// Use DialogBox to create modal dialog.
	DialogBox (hInst, TEXT ("aboutbox"), hWnd, AboutDlgProc);
	return 0;
}
//======================================================================
// About Dialog procedure
//
BOOL CALLBACK AboutDlgProc (HWND hWnd, UINT wMsg, WPARAM wParam,
							LPARAM lParam) {
	switch (wMsg) {
		case WM_COMMAND:
			switch (LOWORD (wParam)) {
				case IDOK:
				case IDCANCEL:
					EndDialog (hWnd, 0);
					return TRUE;
}
		break;
	}
	return FALSE;
}
//----------------------------------------------------------------------
// FillComComboBox - Fills the COM port combo box
//
int FillComComboBox (HWND hWnd) {
	int rc;
	WIN32_FIND_DATA fd;
	HANDLE hFind;

	hFind = FindFirstFileEx (TEXT ("COM?:"), FindExInfoStandard, &fd, 
							 FindExSearchLimitToDevices, NULL, 0);
	if (hFind != INVALID_HANDLE_VALUE) {
		do {
			SendDlgItemMessage (GetDlgItem (hWnd, IDC_CMDBAR),
								IDC_COMPORT, CB_INSERTSTRING,
								-1, (LPARAM)fd.cFileName);
			rc = FindNextFile (hFind, &fd);
		} while (rc);

		rc = FindClose (hFind);
	}
	SendDlgItemMessage (GetDlgItem (hWnd, IDC_CMDBAR), IDC_COMPORT,
						CB_SETCURSEL, 0, 0);
	return 0;
}
//----------------------------------------------------------------------
// InitCommunication - Open and initialize selected COM port.
//
HANDLE InitCommunication (HWND hWnd, LPTSTR pszDevName) {
	DCB dcb;
	TCHAR szDbg[128];
	COMMTIMEOUTS cto;
	HANDLE hLocal;
	DWORD dwTStat;
	hLocal = hComPort;
	hComPort = INVALID_HANDLE_VALUE;

	if (hLocal != INVALID_HANDLE_VALUE)
		CloseHandle (hLocal);  // This causes WaitCommEvent to return.

	hLocal = CreateFile (pszDevName, GENERIC_READ | GENERIC_WRITE,
						 0, NULL, OPEN_EXISTING, 0, NULL);

	if (hLocal != INVALID_HANDLE_VALUE) {
		// Configure port.
		dcb.DCBlength = sizeof (dcb);
		GetCommState (hLocal, &dcb);
		dcb.BaudRate = nSpeed;
		dcb.fParity = FALSE;
		dcb.fNull = FALSE;
		dcb.StopBits = ONESTOPBIT;
		dcb.Parity = NOPARITY;
		dcb.ByteSize = 8;
		SetCommState (hLocal, &dcb);

		// Set the timeouts. Set infinite read timeout.
		cto.ReadIntervalTimeout = 0;
		cto.ReadTotalTimeoutMultiplier = 0;
		cto.ReadTotalTimeoutConstant = 0;
		cto.WriteTotalTimeoutMultiplier = 0;
		cto.WriteTotalTimeoutConstant = 0;
		SetCommTimeouts (hLocal, &cto);

		wsprintf (szDbg, TEXT ("Port %s opened\r\n"), pszDevName);
		SendDlgItemMessage (hWnd, ID_RCVTEXT, EM_REPLACESEL, 0,
							(LPARAM)szDbg);

		// Start read thread if not already started.
		hComPort = hLocal;
		if (!GetExitCodeThread (hReadThread, &dwTStat) ||
			(dwTStat != STILL_ACTIVE)) {
			hReadThread = CreateThread (NULL, 0, ReadThread, hWnd,
										0, &dwTStat);
			if (hReadThread)
				CloseHandle (hReadThread);

			hShowGPSInfoThread = CreateThread (NULL, 0, ShowGPSInfoThread, hWnd,
										0, &dwTStat);
			if (hShowGPSInfoThread)
				CloseHandle (hShowGPSInfoThread);

		}
	} else {
		wsprintf (szDbg, TEXT ("Couldn\'t open port %s. rc=%d\r\n"),
				  pszDevName, GetLastError());
		SendDlgItemMessage (hWnd, ID_RCVTEXT, EM_REPLACESEL,
							0, (LPARAM)szDbg);
	}

	return hComPort;
}
//======================================================================
// SendThread - Sends characters to the serial port
//
DWORD WINAPI SendThread (PVOID pArg) {
	HWND hWnd, hwndSText;
	int rc;
	DWORD cBytes;
	TCHAR szText[TEXTSIZE];

	hWnd = (HWND)pArg;
	hwndSText = GetDlgItem (hWnd, ID_SENDTEXT);
	while (1) {
		rc = WaitForSingleObject (g_hSendEvent, INFINITE);
		if (rc == WAIT_OBJECT_0) {
			if (!fContinue)
				break;
			// Disable send button while sending.
			EnableWindow (GetDlgItem (hWnd, ID_SENDBTN), FALSE);
			GetWindowText (hwndSText, szText, dim(szText));
			lstrcat (szText, TEXT ("\r\n"));
			rc = WriteFile (hComPort, szText, 
							lstrlen (szText)*sizeof (TCHAR),&cBytes, 0);
			if (rc) {
				// Copy sent text to output window. 
				SendDlgItemMessage (hWnd, ID_RCVTEXT, EM_REPLACESEL, 0,
									(LPARAM)TEXT (" >"));
				SetWindowText (hwndSText, TEXT (""));  // Clear text box
			} else {
				// Else, print error message.
				wsprintf (szText, TEXT ("Send failed rc=%d\r\n"), 
						  GetLastError());
				DWORD dwErr = 0;
				COMSTAT Stat;
				
				if (ClearCommError (hComPort, &dwErr, &Stat)) {
					printf ("fail\n");
				}
			}
			// Put text in receive text box.
			SendDlgItemMessage (hWnd, ID_RCVTEXT, EM_REPLACESEL, 0,
								(LPARAM)szText);
			EnableWindow (GetDlgItem (hWnd, ID_SENDBTN), TRUE);
		} else
			break;
	}
	return 0;
}
//======================================================================
// ReadThread - Receives characters from the serial port
//
///////////////////////////////////////////////////////////////////////////////////////
//GPS数据接收处理线程
DWORD WINAPI ReadThread (PVOID pArg) {

	HWND hWnd;
//	DWORD cBytes, i;
//	BYTE szText[TEXTSIZE], *pPtr;
//	TCHAR tch;

	hWnd = (HWND)pArg;

    DWORD BytestoRead;

	while (fContinue) {
		dr_ReadCom( hWnd,m_hCom, BytestoRead, 0 );
		Sleep(1);
	}
	return 0;
}

//======================================================================
// ReadThread - Receives characters from the serial port
//
///////////////////////////////////////////////////////////////////////////////////////
//GPS数据接收处理线程
DWORD WINAPI ShowGPSInfoThread (PVOID pArg) {
	int rc;
	HWND hWnd;
	LPSTR pstr = new char[20];   
	LPWSTR wpstr = new WORD[20];
	TCHAR szText[20];
	unsigned char cHWID[6];
	char string[20]={0} ;

	hWnd = (HWND)pArg;

	while (fContinue) {
		//获取GPS信息
		rc = WaitForSingleObject (g_hEnterEvent, INFINITE);
		
		memset(string,0,sizeof(string));

		if (rc == WAIT_OBJECT_0) {
			if (!fContinue)
				break;
			
			GetWindowText (hRecStarPRNInfo0, szText, dim(szText));
			if(wcslen(szText)!=12)
			{
				MessageBox(hWnd,_T("Error message:\n   The length of String is not equal 12! "),0,MB_OK);
				SetWindowText(hRecStarSNRInfo0, _T(""));
				continue;
			}

			wcstombs(string,szText,wcslen(szText) );

			//cHWID[0] = atoi(string);
			cHWID[0] = CHARtoINT(string[0])*16 + CHARtoINT(string[1]);
			cHWID[1] = CHARtoINT(string[2])*16 + CHARtoINT(string[3]);
			cHWID[2] = CHARtoINT(string[4])*16 + CHARtoINT(string[5]);
			cHWID[3] = CHARtoINT(string[6])*16 + CHARtoINT(string[7]);
			cHWID[4] = CHARtoINT(string[8])*16 + CHARtoINT(string[9]);
			cHWID[5] = CHARtoINT(string[10])*16 + CHARtoINT(string[11]);
			
			if(iFlagError==1)
			{
				MessageBox(hWnd,_T("Error message:\n   Invalid character!"),0,MB_OK);
				SetWindowText(hRecStarSNRInfo0, _T(""));
				iFlagError = 0;
				continue;
			}

			ConvertHWID_to_DeviceID(cHWID);
		} else
			break;
	}
	return 0;
}

//读串口操作
int dr_ReadCom(HWND hWnd, HANDLE hComm, DWORD &nBytesRead, int ReadTime)
{
    int ReadNumber=0;    
    int numCount=0 ;                             //控制读取的数目
	DWORD cBytes;    

	{
		{
		while (!ReadFile (hComPort, gps_uart_reg_rec_value, 1, &cBytes, 0))
			if (hComPort == INVALID_HANDLE_VALUE)
				return 0;

//***********************************************************************
			{
				if((gps_uart_reg_rec_value[numCount])=='$') //判断帧头"$"
				{
					//清接收字节数
					gps_rec_num=0;
					//清接收缓冲区
					memset(gps_rec_buffer,0,GPS_BUF_SIZE);
#ifdef DEBUG_GPS
					wsprintf (sShowGPS_Byte, TEXT ("Get GPS Head Byte\r\n"));
					SendDlgItemMessage (hWnd, ID_RCVTEXT, EM_REPLACESEL, 0,	(LPARAM)sShowGPS_Byte);
#endif
				}

				//保存当前数据到数据接收缓冲区
				gps_rec_buffer[gps_rec_num]=gps_uart_reg_rec_value[numCount];  //保存接收的字节

				//判断帧尾
				if(gps_uart_reg_rec_value[numCount] == 0x0A && gps_rec_buffer[gps_rec_num-1] == 0x0D)
				{
#ifdef DEBUG_GPS
					wsprintf (sShowGPS_Byte, TEXT ("Get GPS Last Byte\r\n"));
					SendDlgItemMessage (hWnd, ID_RCVTEXT, EM_REPLACESEL, 0,	(LPARAM)sShowGPS_Byte);
#endif
					if(Calc_checksum(gps_rec_buffer,gps_rec_num)==1)
					{
						//解析GPS数据
						dr_vGPS_DataProcess(hWnd,gps_rec_buffer); 
						i_ShowGpsData(hWnd,gps_rec_buffer);
#ifdef DEBUG_GPS
						wsprintf (sShowGPS_Byte, TEXT ("Get FINAL GPS MSG\r\n"));
						SendDlgItemMessage (hWnd, ID_RCVTEXT, EM_REPLACESEL, 0,	(LPARAM)sShowGPS_Byte);
#endif
					}

					//接收字节数清0
					gps_rec_num = 0;
					//清接收缓冲区
					memset(gps_rec_buffer,0,GPS_BUF_SIZE);

				}
				//接收字节数加1
				gps_rec_num++;	
				
				numCount++;
			}

			//清接收字节数
			numCount=0;
			//清接收缓冲区
			memset(gps_uart_reg_rec_value,0,GPS_BUF_SIZE);
		}
	}

    return 1;    

}



//GPS数据协议解析
//调用【导航单元】高端程序
//该函数获取GPS传感器的数据,Parking参数没有使用。
//unsigned int dr_iLP_GetGpsSensorData(ORI_GPSMsg_t	*pstGpsMsg,	OUCHAR ucParking ){}
void dr_vGPS_DataProcess(HWND hWnd,char *GPS_DATA){
	char GGA_Head[]="$GPGGA";
	char GLL_Head[]="$GPGLL";
	char GSA_Head[]="$GPGSA";
	char GSV_Head[]="$GPGSV";
	char RMC_Head[]="$GPRMC";
	char VTG_Head[]="$GPVTG";
	char ZDA_Head[]="$GPZDA";
	
//	RTC_timeFormat NRtc_Time;
	int Message_flag=0;
	int i,j;
	static int temp = 0;

	if(strstr(GPS_DATA,GGA_Head)) Message_flag=1; // GGA Message
	else 
		if(strstr(GPS_DATA,GLL_Head)) Message_flag=2; //GLL Message
		else 
			if(strstr(GPS_DATA,GSA_Head)) Message_flag=3; //GSA Message
			else
				if(strstr(GPS_DATA,GSV_Head)) Message_flag=4; //GSV Message
				else
					if(strstr(GPS_DATA,RMC_Head)) Message_flag=5; //RMC Message
					else
						if(strstr(GPS_DATA,VTG_Head)) Message_flag=6; // VTG Message
						else
							if(strstr(GPS_DATA,ZDA_Head)) Message_flag=7; // ZDA Message

// 新GPS OME板驱动

	switch(Message_flag)
	{
		case 1:							// 处理 GGA Message
			i = 0;
			// find first ','
			while(GPS_DATA[i] != ',') 	// skip "$GPGGA" 
			{
				i++;
			}
			i++;  						// skip ','

			ORI_Gps.UTC = 0;
									//calculate UTC
			while(GPS_DATA[i] != ',')  	// 获取 UTC
			{
				if(GPS_DATA[i]!='.')
				 ORI_Gps.UTC = ORI_Gps.UTC * 10 + (GPS_DATA[i]-48);
				 i++;
			}
			ORI_Gps.UTC = ORI_Gps.UTC * 10; // 乘10,保持与SIRF一致
			i++;  						// skip ','
			
			ORI_Gps.Latitude = 0;
			while(GPS_DATA[i] != ',')	// 获取 Latitude
			{
				if(GPS_DATA[i] != '.')
				ORI_Gps.Latitude = ORI_Gps.Latitude *10 + (GPS_DATA[i]-48);
				i++;
			}
			i++;						//skip ','
			ORI_Gps.N_S = GPS_DATA[i];	// 获取 N_S 北纬/南纬 标志
			i += 2;						//skip N_S & ','
			ORI_Gps.Longitude = 0;
			while(GPS_DATA[i] != ',')	// 获取 Longitude
			{
				if(GPS_DATA[i] != '.')
				ORI_Gps.Longitude = ORI_Gps.Longitude *10 + (GPS_DATA[i]-48);
				i++;
			}
			i++;		//skip ','
			ORI_Gps.E_W = GPS_DATA[i];	// get E_W
			i+=2;
			while(GPS_DATA[i]!=',')  // get FIX valid
			{
				ORI_Gps.FixValid = GPS_DATA[i] - 48;
				i++;
			}
			i++;
			ORI_Gps.StarNum = (GPS_DATA[i] - 48)*10 +(GPS_DATA[i+1] - 48); // StarNum 
			for(j=0;j<2;j++)
			{
				while(GPS_DATA[i]!=',')
				{
					i++;
				}
				i++;
			}
			ORI_Gps.Altitude = 0;
			while(GPS_DATA[i] != ',')  //1% meter
			{
				if(GPS_DATA[i] == '-')
				{
					j = 1;
					i++;
				}
				else
				{
					j = 0;
				}
				if(GPS_DATA[i] != '.')
				ORI_Gps.Altitude = ORI_Gps.Altitude *10 + (GPS_DATA[i]-48);
				i++;
			}
			if(j == 1)
			{
				ORI_Gps.Altitude = 0 - ORI_Gps.Altitude;
			}
			
			//ORI_Gps.Altitude = ORI_Gps.Altitude 
			wsprintf (sShowGPS_Byte, TEXT ("\r\n"));
			SendDlgItemMessage (hWnd, ID_RCVTEXT, WM_SETTEXT, 0, (LPARAM)sShowGPS_Byte);

#ifdef DEBUG_GPS
			wsprintf (sShowGPS_Byte, TEXT ("GGA\r\n"));
			SendDlgItemMessage (hWnd, ID_RCVTEXT, EM_REPLACESEL, 0,	(LPARAM)sShowGPS_Byte);
#endif
			break;

		case 2:		//GLL Message
#ifdef DEBUG_GPS
			wsprintf (sShowGPS_Byte, TEXT ("GLL\r\n"));
			SendDlgItemMessage (hWnd, ID_RCVTEXT, EM_REPLACESEL, 0,	(LPARAM)sShowGPS_Byte);
#endif
			break;

		case 3:		//GSA Message
		    i = strlen(GPS_DATA);
		    while(GPS_DATA[i] != '*')
		    {
		    	i--;
		    }
		    i--;
		    ORI_Gps.vdop = 0;
		    j = 0;
		    while(GPS_DATA[i] != ',')
		    {
		    	if(GPS_DATA[i] != '.')
		    	{
		    		switch(j)
		    		{
		    		case  0:
		    			ORI_Gps.vdop = GPS_DATA[i] - 48;
		    			j++;
		    			break;
		    		case 1:
		    			ORI_Gps.vdop = ORI_Gps.vdop + (GPS_DATA[i] -48) * 10;
		    			j++;
		    			break;
		    		case 3:
		    			ORI_Gps.vdop = ORI_Gps.vdop + (GPS_DATA[i] -48) * 100;
		    			j++;
		    			break;
		    		}
		    	}
		    	i--;
		    }
		    i--;
		    j=0;
		    ORI_Gps.hdop = 0;
		    while(GPS_DATA[i] != ',')
		    {
		    	if(GPS_DATA[i] != '.')
		    	{
		    		switch(j)
		    		{
		    		case  0:
		    			ORI_Gps.hdop = GPS_DATA[i] - 48;
		    			j++;
		    			break;
		    		case 1:
		    			ORI_Gps.hdop = ORI_Gps.hdop + (GPS_DATA[i] -48) * 10;
		    			j++;
		    			break;
		    		case 3:
		    			ORI_Gps.hdop = ORI_Gps.hdop + (GPS_DATA[i] -48) * 100;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -