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

case 7: nBaud = CBR_14400; break; case 8: nBaud = CBR_19200; break; case 9: nBaud = CBR_38400; break; case 10: nBaud = CBR_56000; break; case 11: nBaud = CBR_57600; break; case 12: nBaud = CBR_115200; break; case 13: nBaud = CBR_128000; break; case 14: nBaud = CBR_256000; break; }

//数据位下拉框设置================= nTemp=m_bdata.GetCurSel(); switch(nTemp) {

case 0: nData = 5; break; case 1: nData = 6; break; case 2: nData = 7; break; case 3: nData = 8; break; }

//停止位下拉框设置================= nTemp=m_bstop.GetCurSel(); switch(nTemp) {

case 0: nStop = ONESTOPBIT; break; case 1: nStop = ONE5STOPBITS; break; case 2: nStop = TWOSTOPBITS; break; }

//校验位下拉框设置================= nTemp=m_cal.GetCurSel(); switch(nTemp)

第 25 页 共 37 页

{ case 0: nCal = NOPARITY; break; case 1: nCal = ODDPARITY; break; case 2: nCal = EVENPARITY; break; case 3: nCal = MARKPARITY; break; case 4: nCal = SPACEPARITY; break; } int commnum_buf; commnum_buf = m_comlist.GetCurSel(); if(commnum_buf < 0) { MessageBox(\获取串口错误\错误\ ComIsOK = FALSE; return; } m_comlist.GetLBText(commnum_buf,strcomname); if(!ComIsOK) { OpenComm(nBaud,nData,nStop,nCal); //调用打开串口函数OpenComm() if(ComIsOK)

pReceiveThread=AfxBeginThread(ThreadFunc,this,THREAD_PRIORITY_LOWEST); //启动接收线程 ShowStatus(); if(!ComIsOK) m_comcontrol.SetWindowText(\打开串口\ else { m_comcontrol.SetText(\关闭串口\//按钮显示状态改变 m_comcontrol.SetForeColor(RGB(0,155,0)); //串口打开后文本颜色变绿 m_ctrlIcon.SetIcon((HICON)LoadImage(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(IDI_ICON_OPEN), IMAGE_ICON, GetSystemMetrics(SM_CXICON), GetSystemMetrics(SM_CXICON), 0)); //显示打开icon m_comlist.EnableWindow(false); //设置串口号下拉框不可用 m_baud.EnableWindow(false); //设置波特率下拉框不可用 m_bdata.EnableWindow(false); //设置数据位下拉框不可用 m_bstop.EnableWindow(false); //设置停止位下拉框不可用

第 26 页 共 37 页

m_cal.EnableWindow(false); //设置校验位下拉框不可用 GetDlgItem(IDC_BTN_HANDSEND)-> EnableWindow(true); //设置手动发送按钮不可用 GetDlgItem(IDC_BTN_AUTOSEND)-> EnableWindow(true); //设置自动发送按钮可用 GetDlgItem(IDC_EDIT_TIMER) -> EnableWindow(true); //设置发送间隔按钮可用 GetDlgItem(IDC_BTN_SELCTFILE)->EnableWindow(true); //设置选择文件按钮可用 GetDlgItem(IDC_BTN_SENDFILE)-> EnableWindow(true); //设置发送文件按钮可用 } return; } else { CloseComm(); //调用关闭串口函数CloseComm() // TerminateThread(pReceiveThread,0); ShowStatus(); m_comcontrol.SetText(\打开串口\ m_comcontrol.SetForeColor(RGB(255,0,0)); m_ctrlIcon.SetIcon((HICON)LoadImage(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(IDI_ICON_CLOSE), IMAGE_ICON, GetSystemMetrics(SM_CXICON), GetSystemMetrics(SM_CXICON), 0)); //显示关闭icon m_comlist.EnableWindow(true); //设置串口号下拉框可用 m_baud.EnableWindow(true); //设置波特率下拉框可用 m_bdata.EnableWindow(true); //设置数据位下拉框可用 m_bstop.EnableWindow(true); //设置停止位下拉框可用 m_cal.EnableWindow(true); //设置校验位下拉框可用 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); //设置发送文件按钮不可用 return;

第 27 页 共 37 页

} }

添加读串口函数,代码如下:

DWORD CCommassistDlg::ReadComm() { CString strTemp; OVERLAPPED m_osRead; memset(&m_osRead,0,sizeof(OVERLAPPED)); m_osRead.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL); char lpInBuffer[1024]; DWORD dwBytesRead=1024; BOOL bReadStatus; bReadStatus=ReadFile(hCom,lpInBuffer,dwBytesRead,&dwBytesRead,&m_osRead); if(!bReadStatus) //如果ReadFile函数返回FALSE { if(GetLastError()==ERROR_IO_PENDING) //GetLastError()函数返回ERROR_IO_PENDING,表明串口正在进行读操作 { WaitForSingleObject(m_osRead.hEvent,2000); //使用WaitForSingleObject函数等待,直到读操作完成或延时已达到2000ms //当串口读操作进行完毕后,m_osRead的hEvent事件会变为有信号 PurgeComm(hCom,

PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR); return dwBytesRead; } return 0; } lpInBuffer[dwBytesRead] = NULL; strTemp = lpInBuffer; m_intRxCnt += strTemp.GetLength(); //接收到字节数统计 // GetDlgItemText(IDC_EDIT_RX,strIn); strIn += strTemp; OnCheckHexrx(); ShowStatus(); return 1; }

添加OnClose函数

第 28 页 共 37 页