📄 cechat.cpp
字号:
// 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 + -