VC(MFC)编写串口调试助手 下载本文

int Data_Length; Data_Length = Data.GetLength(); if (Data_Length == 0) return \ char *pchar = new char[Data_Length]; //用了new分配内存空间,要记得释放 strncpy(pchar,Data,Data_Length); for(int i=0; i

//===============函数结束=============================

comm.h编写如下: #ifndef comm_H #define comm_H

#define WM_FOUNDCOMM WM_USER + 1 //自定义消息WM_FOUNDCOMM,收到该消息表示串口已经找到

#define WM_READCOMM WM_USER + 2 //自定义消息WM_READCOMM,收到该消息缓冲区有数据,可以读取 extern void FindComm(); //申明为外部函数 extern void OpenComm(int nBaud, int nData, int nStop, int nCal); extern void CloseComm();

extern UINT ThreadFunc(LPVOID pParam); //申明全局线程处理函数 extern CString DisplayCString2Hex(CString Data, bool Blank_allow); extern CString DisplayHex2CString(CString Data);

extern int ConvertHexC2String(CString str, CByteArray &senddata); extern bool ComIsOK; //申明为外部变量 extern HANDLE hCom; extern CString strcomname;

#endif

在commassistDlg.h中包含MyButton.h文件 在#endif // _MSC_VER > 1000后加入 #include \

在// Construction后加入变量及函数

第 21 页 共 37 页

CWinThread* pReceiveThread; void ShowStatus(); int m_intTxCnt; int m_intRxCnt; BOOL m_bAutoSend; DWORD ReadComm();

在commassistDlg.cpp中 加入头文件comm.h #include \加入全局变量 CString strIn; CString strOut; CString m_strFile;

变量初始化如

///////////////////////////////////////////////////////////////////////////// // CCommassistDlg dialog

CCommassistDlg::CCommassistDlg(CWnd* pParent /*=NULL*/) : CDialog(CCommassistDlg::IDD, pParent) { //{{AFX_DATA_INIT(CCommassistDlg) m_strTimer = _T(\ m_strFilePath = _T(\ m_strOut = _T(\ m_strStatus = _T(\ m_check_hexrx = FALSE; m_check_hextx = FALSE; //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); //下面就是自己添加的变量初始化 m_strTimer = \ m_strFilePath = \请选择要发送的文件\ m_intTxCnt = 0; m_intRxCnt = 0; m_bAutoSend = 0; strIn = \ strOut = \}

第 22 页 共 37 页

在OnInitDialog函数中添加代码如下 // TODO: Add extra initialization here m_comcontrol.SetForeColor(RGB(255,0,0)); FindComm(); //调用自动找串口函数 m_comlist.SetCurSel(0); //设置串口号下拉框默认值为第一个 m_baud.SetCurSel(6); //设置波特率下拉框默认值为9600 m_bdata.SetCurSel(3); //设置数据位下拉框默认值为8位 m_bstop.SetCurSel(0); //设置停止位下拉框默认值为1 m_cal.SetCurSel(0); //设置校验位下拉框默认值为None无 GetDlgItem(IDC_BTN_HANDSEND)->EnableWindow(false); //设置手动发送按钮不可用 GetDlgItem(IDC_BTN_AUTOSEND)->EnableWindow(false); //设置自动发送按钮不可用 GetDlgItem(IDC_EDIT_TIMER)->EnableWindow(false); //设置发送间隔按钮不可用 GetDlgItem(IDC_BTN_SELCTFILE)->EnableWindow(false); //设置选择文件按钮不可用 GetDlgItem(IDC_BTN_SENDFILE)->EnableWindow(false); //设置发送文件按钮不可用 ShowStatus(); //下面语句用于解决程序运行后初始化EDIT框内容被默认自动选中状态 //返回值需更改为FALSE GetFocus(); //获取焦点 SetFocus(); //设置焦点 m_CEditStatus.SetSel(-1,-1,FALSE); //设置 // PostMessage(EM_SETSEL,-1,0); return FALSE; // return TRUE unless you set the focus to a control

用ClassWizard添加WindowProc函数来处理自定义消息

第 23 页 共 37 页

函数内容如下:

//=====================消息处理函数=========================== //功能:处理自定义消息=========================================

LRESULT CCommassistDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) { // TODO: Add your specialized code here and/or call the base class switch(message) { case WM_FOUNDCOMM : //已找到串口,串口号以字符串形式由wParam传递 m_comlist.AddString((LPCTSTR)wParam); //用AddString添加一个字符串即COM号到m_comlist列表框中 break; case WM_READCOMM : //读串口消息 ReadComm(); break; } return CDialog::WindowProc(message, wParam, lParam); }

//=====================消息处理函数结束===================== 双击“打开串口”按钮编辑代码如下: void CCommassistDlg::OnComcontrol() { // TODO: Add your control notification handler code here int nBaud,nData,nStop,nCal,nTemp; CString sTemp,siTemp; //波特率下拉框设置================= nTemp=m_baud.GetCurSel(); switch(nTemp) { case 0: nBaud = CBR_110; break; case 1: nBaud = CBR_300; break; case 2: nBaud = CBR_600; break; case 3: nBaud = CBR_1200; break; case 4: nBaud = CBR_2400; break; case 5: nBaud = CBR_4800; break; case 6: nBaud = CBR_9600; break;

第 24 页 共 37 页