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

📄 serialport.cpp

📁 串口调试程序,包含完整的客户端和服务端
💻 CPP
字号:
// SerialPort.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#include "SerialPort.h"

#include "PSerialPort.h"

//Global Variables:
HWND					g_hwndCB; 		
HINSTANCE				g_hInst;

//串口类
CPSerialPort *pSerialPort;

//串口相关变量
BOOL Open;
BOOL Receive;
int PortNo,BaudRate,DataBits,StopBits,Parity;

//串口数据消息
#define WM_NEW_DATA_ARRIVE WM_USER+105

//串口数据接收回调函数
void OnDataArrive(char *data,int length,DWORD userdata)
{
	HWND pWnd=(HWND )userdata;
	::SendMessage(pWnd,WM_NEW_DATA_ARRIVE,(WPARAM)data,LPARAM(length));
}

static SHACTIVATEINFO s_sai;

// Forward declarations of functions included in this code module:
LRESULT CALLBACK	MainDlgProc		(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK	Setup			(HWND, UINT, WPARAM, LPARAM);
HWND				CreateRpCommandBar(HWND);

int WINAPI WinMain(	HINSTANCE hInstance,
					HINSTANCE hPrevInstance,
					LPTSTR    lpCmdLine,
					int       nCmdShow)
{
 	g_hInst = hInstance;

	//申请串口类
	pSerialPort=new CPSerialPort();

	DialogBox(hInstance, (LPCTSTR)IDD_MAIN, NULL, (DLGPROC)MainDlgProc);

	//释放
	if(pSerialPort)
	{
		delete pSerialPort;
	}

	return 0;
}

// Mesage handler for the SerialPort
LRESULT CALLBACK MainDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	SHINITDLGINFO shidi;

	TCHAR Port[16];

	unsigned char Send[256];
	unsigned short SendText[256];
	DWORD dwCharToWrite,dwBytesWritten;
	int i;

	unsigned char Rece[1024];
	unsigned short ReceText[1024];
	int BytesReceived;
	int TextLength;
	unsigned char *receive;

	HWND hEdit;
	
	switch (message)
	{
	case WM_INITDIALOG:
		// Create a Done button and size it.  
		shidi.dwMask = SHIDIM_FLAGS;
		shidi.dwFlags = SHIDIF_DONEBUTTON | SHIDIF_SIPDOWN | SHIDIF_SIZEDLGFULLSCREEN;
		shidi.hDlg = hDlg;
		SHInitDialog(&shidi);

		g_hwndCB = CreateRpCommandBar(hDlg);

		//初始化变量
		PortNo=1;
		BaudRate=9600;
		DataBits=8;
		StopBits=ONESTOPBIT;
		Parity=NOPARITY;
		
		Open=FALSE;
		Receive=FALSE;

		return TRUE;
		
	case WM_COMMAND:
		{
			switch(LOWORD(wParam)) 
			{
			case IDOK:	
				pSerialPort->ClosePort();
				EndDialog(hDlg, LOWORD(wParam));
				return TRUE;
				break;
			case IDC_BUTTON_SETUP:
				DialogBox(g_hInst, (LPCTSTR)IDD_SETUPDLG, hDlg, (DLGPROC)Setup);
				break;	
			case IDC_BUTTON_OPEN:
				if(!Open)
				{
					wsprintf(Port,TEXT("COM%d:"),PortNo);
					Open=pSerialPort->OpenPort(Port,BaudRate,DataBits,StopBits,Parity,OnDataArrive,(DWORD)(hDlg));
					if(Open)
					{
						SetDlgItemText(hDlg,IDC_BUTTON_OPEN,_T("关闭端口"));
					}
				}
				else
				{
					pSerialPort->ClosePort();
					Open=FALSE;
					Receive=FALSE;
					SetDlgItemText(hDlg,IDC_BUTTON_RECE,_T("接收"));
					SetDlgItemText(hDlg,IDC_BUTTON_OPEN,_T("打开端口"));
				}
				break;
			case IDC_BUTTON_SEND:
				dwCharToWrite=GetDlgItemText(hDlg,IDC_EDIT_SEND,(LPWSTR)SendText,256);
				if(Open&&dwCharToWrite!=0)
				{
					for(i=0;i<(int)dwCharToWrite;i++)
					{
						Send[i]=(unsigned char)SendText[i];
					}
					dwBytesWritten=pSerialPort->WritePort((char*)Send,dwCharToWrite);
					if(dwBytesWritten==0)
					{
						MessageBox(hDlg,_T("无法向端口写入数据!"),_T("错误"),MB_OK);
					}
				}

				break;
			case IDC_BUTTON_RECE:
				if(!Receive)
				{
					Receive=pSerialPort->Activate();
					if(Receive)
					{
						SetDlgItemText(hDlg,IDC_BUTTON_RECE,_T("不接收"));
					}
				}
				else
				{
					pSerialPort->Deactivate();
					Receive=FALSE;
					SetDlgItemText(hDlg,IDC_BUTTON_RECE,_T("接收"));
				}
				break;
			case IDC_BUTTON_CLEAR_RECE:
				SetDlgItemText(hDlg,IDC_EDIT_RECEIVE,TEXT(""));
				break;
			case IDC_BUTTON_CLEAR_SEND:
				SetDlgItemText(hDlg,IDC_EDIT_SEND,TEXT(""));
				break;
			default:
				break;
			}
		}
		break;

	case WM_NEW_DATA_ARRIVE:
		receive=(unsigned char *)wParam;
		BytesReceived=(int)lParam;
		//更新接收区显示
		ZeroMemory(ReceText,sizeof(ReceText));
		TextLength=GetDlgItemText(hDlg,IDC_EDIT_RECEIVE,(LPWSTR)ReceText,1024);
		if(TextLength+BytesReceived>1024)
		{
			if(BytesReceived>1024)
			{
				BytesReceived=1024;
			}
			for(i=0;i<BytesReceived;i++)
			{
				ReceText[i]=receive[i];
			}
			SetDlgItemText(hDlg,IDC_EDIT_RECEIVE,(LPWSTR)ReceText);
			TextLength=BytesReceived;
		}
		else
		{
			for(i=0;i<BytesReceived;i++)
			{
				ReceText[i+TextLength]=receive[i];
			}
			SetDlgItemText(hDlg,IDC_EDIT_RECEIVE,(LPWSTR)ReceText);
			TextLength=TextLength+BytesReceived;
		}
		//卷动
		hEdit=GetDlgItem(hDlg,IDC_EDIT_RECEIVE);
		SendMessage(hEdit,EM_SETSEL,(WPARAM)((INT)TextLength),(LPARAM)((INT)TextLength));
		SendMessage(hEdit,EM_SCROLLCARET,NULL,NULL);
		break;
	}
	return FALSE;
}

HWND CreateRpCommandBar(HWND hwnd)
{
	SHMENUBARINFO mbi;
	
	memset(&mbi, 0, sizeof(SHMENUBARINFO));
	mbi.cbSize	   = sizeof(SHMENUBARINFO);
	mbi.hwndParent = hwnd;
	mbi.nToolBarId = NULL;
	mbi.hInstRes   = g_hInst;
	mbi.nBmpId	   = 0;
	mbi.cBmpImages = 0;
	mbi.dwFlags = SHCMBF_EMPTYBAR;
	
	if (!SHCreateMenuBar(&mbi)) 
		return NULL;
	
	return mbi.hwndMB;
}

// Mesage handler for the Setup Dialog.
LRESULT CALLBACK Setup(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	SHINITDLGINFO shidi;

	HWND hCombo;
	int iIndex;

	switch (message)
	{
		case WM_INITDIALOG:
			// Create a Done button and size it.  
			shidi.dwMask = SHIDIM_FLAGS;
			shidi.dwFlags = SHIDIF_DONEBUTTON | SHIDIF_SIPDOWN | SHIDIF_SIZEDLGFULLSCREEN;
			shidi.hDlg = hDlg;
			SHInitDialog(&shidi);

			//向串口号添加选项
			hCombo=GetDlgItem(hDlg,IDC_COMBO_PORT);
			iIndex=SendMessage(hCombo,CB_ADDSTRING, NULL, (LPARAM)(LPTSTR)TEXT("COM1"));
			SendMessage(hCombo, CB_SETITEMDATA, (WPARAM)iIndex, (LPARAM)1);
			iIndex=SendMessage(hCombo,CB_ADDSTRING, NULL, (LPARAM)(LPTSTR)TEXT("COM2"));
			SendMessage(hCombo, CB_SETITEMDATA, (WPARAM)iIndex, (LPARAM)2);
			iIndex=SendMessage(hCombo,CB_ADDSTRING, NULL, (LPARAM)(LPTSTR)TEXT("COM3"));
			SendMessage(hCombo, CB_SETITEMDATA, (WPARAM)iIndex, (LPARAM)3);
			iIndex=SendMessage(hCombo,CB_ADDSTRING, NULL, (LPARAM)(LPTSTR)TEXT("COM4"));
			SendMessage(hCombo, CB_SETITEMDATA, (WPARAM)iIndex, (LPARAM)4);
			iIndex=SendMessage(hCombo,CB_ADDSTRING, NULL, (LPARAM)(LPTSTR)TEXT("COM5"));
			SendMessage(hCombo, CB_SETITEMDATA, (WPARAM)iIndex, (LPARAM)5);
			iIndex=SendMessage(hCombo,CB_ADDSTRING, NULL, (LPARAM)(LPTSTR)TEXT("COM6"));
			SendMessage(hCombo, CB_SETITEMDATA, (WPARAM)iIndex, (LPARAM)6);
			iIndex=SendMessage(hCombo,CB_ADDSTRING, NULL, (LPARAM)(LPTSTR)TEXT("COM7"));
			SendMessage(hCombo, CB_SETITEMDATA, (WPARAM)iIndex, (LPARAM)7);
			iIndex=SendMessage(hCombo,CB_ADDSTRING, NULL, (LPARAM)(LPTSTR)TEXT("COM8"));
			SendMessage(hCombo, CB_SETITEMDATA, (WPARAM)iIndex, (LPARAM)8);
			iIndex=SendMessage(hCombo,CB_ADDSTRING, NULL, (LPARAM)(LPTSTR)TEXT("COM9"));
			SendMessage(hCombo, CB_SETITEMDATA, (WPARAM)iIndex, (LPARAM)9);
			//设置默认选择
			SendMessage(hCombo, CB_SETCURSEL, (WPARAM)0, NULL);

			//向波特率添加选项
			hCombo=GetDlgItem(hDlg,IDC_COMBO_BAUD);
			iIndex=SendMessage(hCombo,CB_ADDSTRING, NULL, (LPARAM)(LPTSTR)TEXT("1200"));
			SendMessage(hCombo, CB_SETITEMDATA, (WPARAM)iIndex, (LPARAM)1200);
			iIndex=SendMessage(hCombo,CB_ADDSTRING, NULL, (LPARAM)(LPTSTR)TEXT("2400"));
			SendMessage(hCombo, CB_SETITEMDATA, (WPARAM)iIndex, (LPARAM)2400);
			iIndex=SendMessage(hCombo,CB_ADDSTRING, NULL, (LPARAM)(LPTSTR)TEXT("4800"));
			SendMessage(hCombo, CB_SETITEMDATA, (WPARAM)iIndex, (LPARAM)4800);
			iIndex=SendMessage(hCombo,CB_ADDSTRING, NULL, (LPARAM)(LPTSTR)TEXT("9600"));
			SendMessage(hCombo, CB_SETITEMDATA, (WPARAM)iIndex, (LPARAM)9600);
			iIndex=SendMessage(hCombo,CB_ADDSTRING, NULL, (LPARAM)(LPTSTR)TEXT("19200"));
			SendMessage(hCombo, CB_SETITEMDATA, (WPARAM)iIndex, (LPARAM)19200);
			iIndex=SendMessage(hCombo,CB_ADDSTRING, NULL, (LPARAM)(LPTSTR)TEXT("38400"));
			SendMessage(hCombo, CB_SETITEMDATA, (WPARAM)iIndex, (LPARAM)38400);
			iIndex=SendMessage(hCombo,CB_ADDSTRING, NULL, (LPARAM)(LPTSTR)TEXT("57600"));
			SendMessage(hCombo, CB_SETITEMDATA, (WPARAM)iIndex, (LPARAM)57600);
			iIndex=SendMessage(hCombo,CB_ADDSTRING, NULL, (LPARAM)(LPTSTR)TEXT("115200"));
			SendMessage(hCombo, CB_SETITEMDATA, (WPARAM)iIndex, (LPARAM)115200);
			//设置默认选择
			SendMessage(hCombo, CB_SETCURSEL, (WPARAM)3, NULL);

			//向数据位添加选项
			hCombo=GetDlgItem(hDlg,IDC_COMBO_DATA);
			iIndex=SendMessage(hCombo,CB_ADDSTRING, NULL, (LPARAM)(LPTSTR)TEXT("7"));
			SendMessage(hCombo, CB_SETITEMDATA, (WPARAM)iIndex, (LPARAM)7);
			iIndex=SendMessage(hCombo,CB_ADDSTRING, NULL, (LPARAM)(LPTSTR)TEXT("8"));
			SendMessage(hCombo, CB_SETITEMDATA, (WPARAM)iIndex, (LPARAM)8);
			//设置默认选择
			SendMessage(hCombo, CB_SETCURSEL, (WPARAM)1, NULL);

			//向停止位添加选项
			hCombo=GetDlgItem(hDlg,IDC_COMBO_STOP);
			iIndex=SendMessage(hCombo,CB_ADDSTRING, NULL, (LPARAM)(LPTSTR)TEXT("1"));
			SendMessage(hCombo, CB_SETITEMDATA, (WPARAM)iIndex, (LPARAM)ONESTOPBIT);
			iIndex=SendMessage(hCombo,CB_ADDSTRING, NULL, (LPARAM)(LPTSTR)TEXT("1.5"));
			SendMessage(hCombo, CB_SETITEMDATA, (WPARAM)iIndex, (LPARAM)ONE5STOPBITS);
			iIndex=SendMessage(hCombo,CB_ADDSTRING, NULL, (LPARAM)(LPTSTR)TEXT("2"));
			SendMessage(hCombo, CB_SETITEMDATA, (WPARAM)iIndex, (LPARAM)TWOSTOPBITS);
			//设置默认选择
			SendMessage(hCombo, CB_SETCURSEL, (WPARAM)0, NULL);

			//向校验位添加选项
			hCombo=GetDlgItem(hDlg,IDC_COMBO_PARITY);
			iIndex=SendMessage(hCombo,CB_ADDSTRING, NULL, (LPARAM)(LPTSTR)TEXT("无"));
			SendMessage(hCombo, CB_SETITEMDATA, (WPARAM)iIndex, (LPARAM)NOPARITY);
			iIndex=SendMessage(hCombo,CB_ADDSTRING, NULL, (LPARAM)(LPTSTR)TEXT("奇"));
			SendMessage(hCombo, CB_SETITEMDATA, (WPARAM)iIndex, (LPARAM)ODDPARITY);
			iIndex=SendMessage(hCombo,CB_ADDSTRING, NULL, (LPARAM)(LPTSTR)TEXT("偶"));
			SendMessage(hCombo, CB_SETITEMDATA, (WPARAM)iIndex, (LPARAM)EVENPARITY);
			iIndex=SendMessage(hCombo,CB_ADDSTRING, NULL, (LPARAM)(LPTSTR)TEXT("Mark"));
			SendMessage(hCombo, CB_SETITEMDATA, (WPARAM)iIndex, (LPARAM)MARKPARITY);
			iIndex=SendMessage(hCombo,CB_ADDSTRING, NULL, (LPARAM)(LPTSTR)TEXT("Space"));
			SendMessage(hCombo, CB_SETITEMDATA, (WPARAM)iIndex, (LPARAM)SPACEPARITY);
			//设置默认选择
			SendMessage(hCombo, CB_SETCURSEL, (WPARAM)0, NULL);

			return TRUE; 

		case WM_COMMAND:
			switch(LOWORD(wParam))
			{
			case IDOK:		
				//改变串口参数
				//取得串口号
				hCombo=GetDlgItem(hDlg,IDC_COMBO_PORT);
				iIndex=SendMessage(hCombo,CB_GETCURSEL, NULL, NULL);
				PortNo=SendMessage(hCombo, CB_GETITEMDATA, (WPARAM)iIndex, NULL);
				//取得波特率
				hCombo=GetDlgItem(hDlg,IDC_COMBO_BAUD);
				iIndex=SendMessage(hCombo,CB_GETCURSEL, NULL, NULL);
				BaudRate=SendMessage(hCombo, CB_GETITEMDATA, (WPARAM)iIndex, NULL);
				//取得数据位
				hCombo=GetDlgItem(hDlg,IDC_COMBO_DATA);
				iIndex=SendMessage(hCombo,CB_GETCURSEL, NULL, NULL);
				DataBits=SendMessage(hCombo, CB_GETITEMDATA, (WPARAM)iIndex, NULL);
				//取得停止位
				hCombo=GetDlgItem(hDlg,IDC_COMBO_STOP);
				iIndex=SendMessage(hCombo,CB_GETCURSEL, NULL, NULL);
				StopBits=SendMessage(hCombo, CB_GETITEMDATA, (WPARAM)iIndex, NULL);
				//取得校验位
				hCombo=GetDlgItem(hDlg,IDC_COMBO_PARITY);
				iIndex=SendMessage(hCombo,CB_GETCURSEL, NULL, NULL);
				Parity=SendMessage(hCombo, CB_GETITEMDATA, (WPARAM)iIndex, NULL);

				EndDialog(hDlg, LOWORD(wParam));
				return TRUE;
				break;
			case IDCANCEL:
				EndDialog(hDlg, LOWORD(wParam));
				return TRUE;
				break;
			}
			break;
	}
    return FALSE;
}

⌨️ 快捷键说明

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