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

📄 comm.cpp

📁 串口测试程序源码.rar
💻 CPP
📖 第 1 页 / 共 2 页
字号:
				EndDialog(hDlg, LOWORD(wParam));
				return TRUE;
			}
			break;
	}
    return FALSE;
}

HANDLE ComOpen(uint32 com,uint32 baud)
{
	HANDLE hCom;
	DCB dcb;
	TCHAR port[5];
	HANDLE  hReturn;
	//char* szCOM[]= {{"COM1"},{"COM2"},{"COM3"},{"CMO4"}};
	//char* szBAUD[]= {{"2400"},{"4800"},{"9600"},{"19200"},{"38400"},{"57600"},{"115200"}};
	if(com==0)
		wsprintf(port, _T("%s"), _T("COM1:"));	
	else if(com==1)
		wsprintf(port, _T("%s"), _T("COM2:"));	
	else if(com==2)
		wsprintf(port, _T("%s"), _T("COM3:"));
	else if(com==3)
		wsprintf(port, _T("%s"), _T("COM4:"));
	else if(com==4)
		wsprintf(port, _T("%s"), _T("COM5:"));
	else if(com==5)
		wsprintf(port, _T("%s"), _T("COM6:"));
	else if(com==6)
		wsprintf(port, _T("%s"), _T("COM7:"));
	else if(com==7)
		wsprintf(port, _T("%s"), _T("COM8:"));
	
	if(baud==0)
		baud=CBR_2400 ;
	else if(baud==1)
		baud=CBR_4800 ;
	else if(baud==2)
		baud=CBR_9600 ;
	else if(baud==3)
		baud=CBR_19200;
	else if(baud==4)
		baud=CBR_38400;
	else if(baud==5)
		baud=CBR_57600;
	else if(baud==6)
		baud=CBR_115200 ;
	else if(baud==7)
		baud=230400 ;
	else if(baud==8)
		baud=460800 ;
	

	hCom= CreateFile( port,
						GENERIC_READ | GENERIC_WRITE,
						0,    // comm devices must be opened w/exclusive-access 
						NULL, // no security attributes 
						OPEN_EXISTING, // comm devices must use OPEN_EXISTING 
						0,    // not overlapped I/O 
						NULL  // hTemplate must be NULL for comm devices 
						);
	if (hCom == INVALID_HANDLE_VALUE)
	{
		return hCom;	
	}
	
	GetCommState(hCom, &dcb);
	dcb.BaudRate = baud;
	dcb.ByteSize = 8;
	dcb.Parity = NOPARITY;
	dcb.StopBits = ONESTOPBIT;

	if(DTR)
		dcb.fDtrControl = DTR_CONTROL_ENABLE;
	else 
		dcb.fDtrControl = DTR_CONTROL_DISABLE;	

	if(RTS)
		dcb.fRtsControl = RTS_CONTROL_ENABLE;
	else 
		dcb.fRtsControl = RTS_CONTROL_DISABLE;

	dcb.fParity = 0;
	dcb.fInX = 0;
	dcb.fOutX = 0;
	dcb.fDsrSensitivity = 0;
	dcb.fTXContinueOnXoff  = 0;
	dcb.fOutxDsrFlow = 0;
	dcb.fOutxCtsFlow = 0;
	SetCommState(hCom, &dcb);

	hReturn = CreateThread(NULL,0, ReadThread,NULL, 0,NULL);
	
    if ( hReturn == NULL )
	{        
			
    }

	return hCom;
}
void ComClose(HANDLE hCom)
{
	CloseHandle(hCom);
}

static unsigned char RecvBuffer[1024];
unsigned long RecvBufferLen;
static unsigned char SendBuffer[1024];
unsigned long SendBufferLen;

unsigned char jy;

static TCHAR RecvBufferW[1024];

void ComSendACK()
{
	int i;
	unsigned char jy=0;
	char tempbuffer[1024];
	unsigned long len=0; 
	tempbuffer[0]=0x5A;
	for(i=0;i<SendBuffer[1]+2;i++)
	{
		tempbuffer[i+1]=SendBuffer[i];
		jy+=SendBuffer[i];
	}
	tempbuffer[i+1]=jy;
	tempbuffer[i+2]=0xA5;
	SendBufferLen=i+3;
	WriteFile(m_hComPort, tempbuffer, SendBufferLen, &len, NULL);
}

void ProcessCmd()
{
	unsigned char ch;
	TCHAR * buf;
	//Process com command
	switch(RecvBuffer[0])
	{
		case CmdTest:
			SendBuffer[0]=CmdTest;						
			SendBuffer[1]=0;
			ComSendACK();
			break;
		case CmdCreateFile:
			buf = (TCHAR *)malloc((RecvBuffer[1] + 1) * 2);
			for(ch=0;ch<RecvBuffer[1];ch++)
			{
				buf[ch]=RecvBuffer[2+ch];
			}
			buf[ch]=0;
			gFile.Open(buf,CFile::modeCreate|CFile::modeReadWrite);
			free(buf);
			SendBuffer[0]=CmdCreateFile;						
			SendBuffer[1]=0;
			ComSendACK();
			break;
		case CmdOpenFile:
			buf = (TCHAR *)malloc((RecvBuffer[1] + 1) * 2);
			for(ch=0;ch<RecvBuffer[1];ch++)
			{
				buf[ch]=RecvBuffer[2+ch];
			}
			buf[ch]=0;
			gFile.Open(buf,CFile::modeCreate|CFile::modeReadWrite);
			free(buf);
			SendBuffer[0]=CmdOpenFile;						
			SendBuffer[1]=0;
			ComSendACK();
			break;
		case CmdWriteFile:
			SendBuffer[0]=CmdWriteFile;						
			SendBuffer[1]=0;
			ComSendACK();
			gFile.Write(&(RecvBuffer[2]),RecvBuffer[1]);
			break;
		case CmdReadFile:
			break;
		case CmdFileSeek:
			break;
		case CmdCloseFile:
			gFile.Close();			
			SendBuffer[0]=CmdCloseFile;						
			SendBuffer[1]=0;
			ComSendACK();
			break;
		case CmdEnd:
			break;
		case CmdGetFileAttr:
			break;
		case CmdSetFileAttr:
			break;
		case CmdGetFileSize:
			break;
		case CmdGetFileTime:
			break;
		case CmdSetFileTime:
			break;
		case CmdCreateDir:
			buf = (TCHAR *)malloc((RecvBuffer[1] + 1) * 2);
			for(ch=0;ch<RecvBuffer[1];ch++)
			{
				buf[ch]=RecvBuffer[2+ch];
			}
			buf[ch]=0;
			if(!CreateDirectory(buf,NULL))
			{
				SendBuffer[0]=CmdCreateDir;						
				SendBuffer[1]=0;
			}
			else
			{
				SendBuffer[0]=0xFE;						
				SendBuffer[1]=0;
			}
			free(buf);
			ComSendACK();
			break;
		case CmdRemoveDir:
			buf = (TCHAR *)malloc((RecvBuffer[1] + 1) * 2);
			for(ch=0;ch<RecvBuffer[1];ch++)
			{
				buf[ch]=RecvBuffer[2+ch];
			}
			buf[ch]=0;
			if(!RemoveDirectory(buf))
			{
				SendBuffer[0]=CmdCreateDir;						
				SendBuffer[1]=0;
			}
			else
			{
				SendBuffer[0]=0xFE;						
				SendBuffer[1]=0;
			}
			free(buf);
			ComSendACK();
			break;
		case CmdCopyFile:
			break;
		case CmdDeleteFile:
			buf = (TCHAR *)malloc((RecvBuffer[1] + 1) * 2);
			for(ch=0;ch<RecvBuffer[1];ch++)
			{
				buf[ch]=RecvBuffer[2+ch];
			}
			buf[ch]=0;
			if(!DeleteFile(buf))
			{
				SendBuffer[0]=CmdCreateDir;						
				SendBuffer[1]=0;
			}
			else
			{
				SendBuffer[0]=0xFE;						
				SendBuffer[1]=0;
			}
			free(buf);
			ComSendACK();
			break;
		case CmdFdFirstFile:
			break;
		case CmdFdNextFile:
			break;
		case CmdFdClose:
			break;
		default:
			SendBuffer[0]=0xFF;
			SendBuffer[1]=0;
			ComSendACK();
			break;
	}
}

static DWORD WINAPI
ReadThread(
                    PVOID   pContext    /* @parm [IN] Pointer to main data structure. */
                    )
{
	HWND	hWnd = NULL;	
	TCHAR	szTitle[] = _T("Com test");			// The title bar text
	TCHAR	szWindowClass[] = _T("Com test");		// The window class name
	unsigned long len=0,len1; 
	char buf[2];
	HWND hEdit;
	uint32 textlen;

	RecvBufferLen=0xFF;
	while(1)
	{
		Sleep(1);
		hWnd = FindWindow(szWindowClass, szTitle);
		if (!hWnd) 
			break;

		if(m_hComPort)
		{
			len=1;
			while(len)
			{
				ReadFile(m_hComPort, buf,1, &len, NULL);
				if(len)
				{
					if(RecvBufferLen==0xFF || RecvBufferLen==0xFE)
					{
						if(buf[0]==0x55)
						{
							RecvBufferLen=0;
							jy=0;
						}
						else
						{
							RecvBufferLen=0xFE;
							hEdit = GetDlgItem(hWnd, ID_SEND_DATA);
							SetWindowText(hEdit, _T("Expect 0x55!"));				
						}
						continue;
					}
				
					if(RecvBufferLen==0)
					{
						RecvBuffer[RecvBufferLen]=buf[0];
						RecvBufferLen++;
						jy+=(unsigned char)(buf[0]);
						continue;
					}
				
					if(RecvBufferLen==1)
					{
						RecvBuffer[RecvBufferLen]=buf[0];
						RecvBufferLen++;
						jy+=(unsigned char)(buf[0]);
						continue;
					}
					
					if(RecvBuffer[1]>RecvBufferLen-2)
					{
						RecvBuffer[RecvBufferLen]=buf[0];
						RecvBufferLen++;
						jy+=(unsigned char)(buf[0]);
						continue;
					}

					if(RecvBuffer[1]==RecvBufferLen-2)
					{
						if((unsigned char)(buf[0])==jy)
						{
							RecvBufferLen++;
							continue;
						}
						else
						{
							RecvBufferLen=0xFE;   //Command Error
							hEdit = GetDlgItem(hWnd, ID_SEND_DATA);
							SetWindowText(hEdit, _T("JY Error!"));				
							continue;
						}
					}
				
					if(RecvBuffer[1]==RecvBufferLen-3)
					{
						if((unsigned char)(buf[0])==0xAA)
						{
							RecvBufferLen=0xFF;  //Get Command OK
						}
						else
						{
							RecvBufferLen=0xFE;  //Command Error

							hEdit = GetDlgItem(hWnd, ID_SEND_DATA);
							SetWindowText(hEdit, _T("Expect 0xAA!"));				
							continue;
						}
					}
					else
					{
						//Get command error!
						RecvBufferLen=0xFE;  //Command Error
						//Never to here
						continue;
					}
					if(RecvBufferLen==0xFF)
					{
						ProcessCmd();
					}
					else if(RecvBufferLen==0xFE)
					{
						//SendBuffer[0]=0xFE;						
						//SendBuffer[1]=0;
						//ComSendACK();
					}
				}
				else
				{
					break;
				}
			}
		}
	}
    return(0);
}

LPWSTR str2Wstr(char *str, TCHAR* buf)
{
	MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, str, -1, buf, 1024);
	return buf;
}
char* Wstr2str(TCHAR *wstr, char* str)
{
	WideCharToMultiByte(CP_ACP, WC_COMPOSITECHECK, wstr, -1, str, 1024, NULL, NULL);
	return str;
}

⌨️ 快捷键说明

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