📄 serialport.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 + -