S 串口编程 详解6 串口调试助手整个程序代码
CSerialPort类的代码见 串口编程 详解2 CSerialPort类 (SerialPort.h头文件和SerialPort.ccp实现文件)http://blog.csdn.net/gdliweibing/article/details/13629129
SCOMMDlg.h : header file
// SCOMMDlg.h : header file // #if !defined(AFX_SCOMMDLG_H__B37E2B99_040C_4C9E_827B_240E2F02C66E__INCLUDED_) #define AFX_SCOMMDLG_H__B37E2B99_040C_4C9E_827B_240E2F02C66E__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #include "SerialPort.h" #include "PushPin.h" ///////////////////////////////////////////////////////////////////////////// // CSCOMMDlg dialog class CSCOMMDlg : public CDialog { // Construction public: char HexChar(char c); int Str2Hex(CString str,char* data); CSCOMMDlg(CWnd* pParent = NULL); // standard constructor // Dialog Data //{{AFX_DATA(CSCOMMDlg) enum { IDD = IDD_SCOMM_DIALOG }; CButton m_ctrlNewLine; CComboBox m_ctrlPartity; CComboBox m_ctrlStopbits; CComboBox m_ctrlDatabits; CComboBox m_ctrlPort; CComboBox m_ctrlBaud; CEdit m_ctrlEditSendFile; CButton m_ctrlSendFile; CButton m_ctrlManualSend; CEdit m_ctrlSavePath; CButton m_ctrlAutoClear; CButton m_ctrlHexReceieve; CButton m_ctrlStopDisp; CStatic m_ctrlRXCOUNT; CStatic m_ctrlTXCount; CButton m_ctrlHexSend; CEdit m_ctrlReciveData; CButton m_ctrlAutoSend; CComboBox m_ctrlDataBits; CComboBox m_ctrlSpeed; CComboBox m_ctrlCom; CStatic m_ctrlIconOpenoff; CStatic m_ctrlPortStatus; CButton m_ctrlOpenPort; CString m_strCom; CString m_strSpeed; CString m_strDataBits; CString m_strReceiveData; CString m_strSendData; int m_nCycleTime; CString m_StrCurPath; CString m_strSendFilePathName; CString m_strEditSendFile; CString m_strBaud; CString m_strPort; CString m_strPartity; CString m_strStopbits; CString m_strDatabits; //}}AFX_DATA // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CSCOMMDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL // Implementation private: BOOL m_bOpenPort; CSerialPort m_Port; UINT m_nCom; UINT m_nBaud; CHAR m_cParity; UINT m_nDatabits; UINT m_nStopbits; DWORD m_dwCommEvents; HICON m_hIconRed; HICON m_hIconOff; BOOL m_bAutoSend; BOOL m_bStopDispRXData; //下面是关于文件发送的一些变量 BOOL m_bSendFile; UINT m_nFileLength; CString m_strTempSendFilePathName; BOOL m_bVisible; protected: HICON m_hIcon; // Generated message map functions //{{AFX_MSG(CSCOMMDlg) virtual BOOL OnInitDialog(); afx_msg void OnSysCommand(UINT nID, LPARAM lParam); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); afx_msg LONG OnCommunication(WPARAM ch,LPARAM port); afx_msg void OnButtonOpenport(); afx_msg void OnDestroy(); afx_msg void OnButtonManualsend(); afx_msg void OnTimer(UINT nIDEvent); afx_msg void OnCheckAutosend(); afx_msg void OnChangeEditCycletime(); afx_msg void OnChangeEditSend(); afx_msg void OnButtonStopdisprxdata(); afx_msg void OnButtonClearreciarea(); afx_msg void OnButtonSavedata(); afx_msg void OnButtonDirbrowser(); afx_msg void OnButtonFilebrowser(); afx_msg void OnButtonSendfile(); afx_msg LONG OnFileSendingEnded(WPARAM wParam,LPARAM port); afx_msg void OnSelendokComboComselect(); afx_msg void OnSelendokComboDatabits(); afx_msg void OnSelendokComboParity(); afx_msg void OnSelendokComboStopbits(); afx_msg void OnButtonCountreset(); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; //{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ will insert additional declarations immediately before the previous line. #endif // !defined(AFX_SCOMMDLG_H__B37E2B99_040C_4C9E_827B_240E2F02C66E__INCLUDED_)
SCOMMDlg.cpp : implementation file
// SCOMMDlg.cpp : implementation file // #include "stdafx.h" #include "SCOMM.h" #include "SCOMMDlg.h" #include <io.h> #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CAboutDlg dialog used for App About class CAboutDlg : public CDialog { public: CAboutDlg(); // Dialog Data //{{AFX_DATA(CAboutDlg) enum { IDD = IDD_ABOUTBOX }; //}}AFX_DATA // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAboutDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL // Implementation protected: //{{AFX_MSG(CAboutDlg) //}}AFX_MSG DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { //{{AFX_DATA_INIT(CAboutDlg) //}}AFX_DATA_INIT } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAboutDlg) //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) //{{AFX_MSG_MAP(CAboutDlg) // No message handlers //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CSCOMMDlg dialog CSCOMMDlg::CSCOMMDlg(CWnd* pParent /*=NULL*/) : CDialog(CSCOMMDlg::IDD, pParent) { //{{AFX_DATA_INIT(CSCOMMDlg) m_strReceiveData = _T(""); m_strSendData = _T(""); m_StrCurPath = _T(""); m_strEditSendFile = _T(""); m_strBaud = _T(""); m_strPort = _T(""); m_strPartity = _T(""); m_strStopbits = _T(""); m_strDatabits = _T(""); //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); m_bOpenPort=FALSE; m_nCom=1; m_nBaud=115200; m_cParity='N'; m_nDatabits=8; m_nStopbits=1; m_dwCommEvents=EV_RXCHAR; m_hIconOff=AfxGetApp()->LoadIcon(IDI_ICON_OFF); m_hIconRed=AfxGetApp()->LoadIcon(IDI_ICON_RED); m_bAutoSend=FALSE; m_nCycleTime=1000; m_bStopDispRXData=FALSE; m_bSendFile=FALSE; // m_ctrlStopDisp.SetWindowText("停止显示");//这句是不能放在这里的。因为对话框还没有建立起来,当然对话框中的按钮等也没有建立 m_StrCurPath="C:\\DataCom"; m_bVisible=FALSE; } void CSCOMMDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //数据映射(按钮、编辑框 与 变量的映射) //{{AFX_DATA_MAP(CSCOMMDlg) DDX_Control(pDX, IDC_CHECK_NEWLINE, m_ctrlNewLine); DDX_Control(pDX, IDC_COMBO_PARITY, m_ctrlPartity); DDX_Control(pDX, IDC_COMBO_STOPBITS, m_ctrlStopbits); DDX_Control(pDX, IDC_COMBO_DATABITS, m_ctrlDatabits); DDX_Control(pDX, IDC_COMBO_COMSELECT, m_ctrlPort); DDX_Control(pDX, IDC_COMBO_SPEED, m_ctrlBaud); DDX_Control(pDX, IDC_EDIT_SENDFILE, m_ctrlEditSendFile); DDX_Control(pDX, IDC_BUTTON_SENDFILE, m_ctrlSendFile); DDX_Control(pDX, IDC_BUTTON_MANUALSEND, m_ctrlManualSend); DDX_Control(pDX, IDC_EDIT_SEND, m_ctrlSavePath); DDX_Control(pDX, IDC_CHECK_AUTOCLEAR, m_ctrlAutoClear); DDX_Control(pDX, IDC_CHECK_HEXRECIEVE, m_ctrlHexReceieve); DDX_Control(pDX, IDC_BUTTON_STOPDISPRXDATA, m_ctrlStopDisp); DDX_Control(pDX, IDC_STATIC_RXCOUNT, m_ctrlRXCOUNT); DDX_Control(pDX, IDC_STATIC_TXCOUNT, m_ctrlTXCount); DDX_Control(pDX, IDC_CHECK_HEXSEND, m_ctrlHexSend); DDX_Control(pDX, IDC_EDIT_RECIEVE, m_ctrlReciveData); DDX_Control(pDX, IDC_CHECK_AUTOSEND, m_ctrlAutoSend); DDX_Control(pDX, IDC_STATIC_OPENOFF, m_ctrlIconOpenoff); DDX_Control(pDX, IDC_STATIC_STATUS, m_ctrlPortStatus); DDX_Control(pDX, IDC_BUTTON_OPENPORT, m_ctrlOpenPort); DDX_Text(pDX, IDC_EDIT_RECIEVE, m_strReceiveData); DDX_Text(pDX, IDC_EDIT_SEND, m_strSendData); DDX_Text(pDX, IDC_EDIT_CYCLETIME, m_nCycleTime); DDX_Text(pDX, IDC_EDIT_SAVE_PATH, m_StrCurPath); DDX_Text(pDX, IDC_EDIT_SENDFILE, m_strEditSendFile); DDX_CBString(pDX, IDC_COMBO_SPEED, m_strBaud); DDX_CBString(pDX, IDC_COMBO_COMSELECT, m_strPort); DDX_CBString(pDX, IDC_COMBO_PARITY, m_strPartity); DDX_CBString(pDX, IDC_COMBO_STOPBITS, m_strStopbits); DDX_CBString(pDX, IDC_COMBO_DATABITS, m_strDatabits); //}}AFX_DATA_MAP } //消息映射 BEGIN_MESSAGE_MAP(CSCOMMDlg, CDialog) //{{AFX_MSG_MAP(CSCOMMDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_MESSAGE(WM_COMM_RXCHAR,OnCommunication) ON_BN_CLICKED(IDC_BUTTON_OPENPORT, OnButtonOpenport) ON_WM_DESTROY() ON_BN_CLICKED(IDC_BUTTON_MANUALSEND, OnButtonManualsend) ON_WM_TIMER() ON_BN_CLICKED(IDC_CHECK_AUTOSEND, OnCheckAutosend) ON_EN_CHANGE(IDC_EDIT_CYCLETIME, OnChangeEditCycletime) ON_EN_CHANGE(IDC_EDIT_SEND, OnChangeEditSend) ON_BN_CLICKED(IDC_BUTTON_STOPDISPRXDATA, OnButtonStopdisprxdata) ON_BN_CLICKED(IDC_BUTTON_CLEARRECIAREA, OnButtonClearreciarea) ON_BN_CLICKED(IDC_BUTTON_SAVEDATA, OnButtonSavedata) ON_BN_CLICKED(IDC_BUTTON_DIRBROWSER, OnButtonDirbrowser) ON_BN_CLICKED(IDC_BUTTON_FILEBROWSER, OnButtonFilebrowser) ON_BN_CLICKED(IDC_BUTTON_SENDFILE, OnButtonSendfile) ON_CBN_SELENDOK(IDC_COMBO_COMSELECT, OnSelendokComboComselect) ON_CBN_SELENDOK(IDC_COMBO_DATABITS, OnSelendokComboDatabits) ON_CBN_SELENDOK(IDC_COMBO_PARITY, OnSelendokComboParity) ON_CBN_SELENDOK(IDC_COMBO_STOPBITS, OnSelendokComboStopbits) ON_BN_CLICKED(IDC_BUTTON_COUNTRESET, OnButtonCountreset) //}}AFX_MSG_MAP END_MESSAGE_MAP() //ON_MESSAGE(WM_COMM_TXEMPTY_DETECTED,OnFileSendingEnded) static long count=0; static long rxdatacount=0; //注意这个 afx_msg LONG OnCommunication(WPARAM ch,LPARAM port); 和ON_MESSAGE(WM_COMM_RXCHAR,OnCommunication)映射的产生 LONG CSCOMMDlg::OnCommunication(WPARAM ch,LPARAM port) { if(port<=0||port>=10) return -1; rxdatacount++;//接收字节计数 CString strTemp; strTemp.Format("%ld",rxdatacount); strTemp="RX:"+strTemp; m_ctrlRXCOUNT.SetWindowText(strTemp);//显示计数 if(m_bStopDispRXData)//如果选择了 停止显示 接收数据,则返回 return -1; //若设置了 自动清空 则达到50行后,自动清空接收编辑框中显示的数据 if((m_ctrlAutoClear.GetCheck())&&(m_ctrlReciveData.GetLineCount()>=50)) { m_strReceiveData.Empty();//?????????????? UpdateData(FALSE); if(count==0) { count++; } } //若没设置了 自动清空 则达到400行后,也自动清空接收编辑框中显示的数据 if(m_ctrlReciveData.GetLineCount()>=400) { m_strReceiveData.Empty();//?????????????? m_strReceiveData="***The Length of the text is too long ,Emptied Automaticly!!!***\r\n"; UpdateData(FALSE); } //如果选择了“十六进制显示”,则显示十六进制值 CString str; if(m_ctrlHexReceieve.GetCheck()) str.Format("%2X",ch); else str.Format("%c",ch); //以下是将接收的字符加在字符串的最后,这里费时多 //但考虑到数据需要保存成文件,所以没有用List Control(); int nLen=m_ctrlReciveData.GetWindowTextLength(); m_ctrlReciveData.SetSel(nLen,nLen);//????????? m_ctrlReciveData.ReplaceSel(str);//?????????? nLen+=str.GetLength(); m_strReceiveData+=str; if(m_ctrlNewLine.GetCheck()) { m_strReceiveData=m_strReceiveData+"\r\n";//自动换行 } UpdateData(FALSE); return 0; } ///////////////////////////////////////////////////////////////////////////// // CSCOMMDlg message handlers BOOL CSCOMMDlg::OnInitDialog() { CDialog::OnInitDialog(); // Add "About..." menu item to system menu. // IDM_ABOUTBOX must be in the system command range. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here //下面初始化串口的 串口号 波特率 奇偶校验 数据位 停止位 m_bOpenPort=FALSE; m_nCom=1; m_nBaud=115200; m_cParity='N'; m_nDatabits=8; m_nStopbits=1; m_dwCommEvents=EV_RXCHAR||EV_RXFLAG;//串口事件 CString strStatus; if(m_Port.InitPort(this,m_nCom,m_nBaud,m_cParity,m_nDatabits,m_nStopbits,m_dwCommEvents,512)) { m_Port.StartMonitoring(); //启动检测辅助线程 m_ctrlIconOpenoff.SetIcon(m_hIconRed); strStatus.Format("STATUS: COM %d OPENED, %d, %c, %d, %d",m_nCom,m_nBaud,m_cParity,m_nDatabits,m_nStopbits); //当前的状态 端口号 奇偶 数据位 停止位 m_ctrlOpenPort.SetWindowText("关闭串口"); m_bOpenPort=TRUE; } else { AfxMessageBox("没有发现该串口或 已被占用"); m_ctrlIconOpenoff.SetIcon(m_hIconOff); m_bOpenPort=FALSE; } m_ctrlPortStatus.SetWindowText(strStatus); m_ctrlStopDisp.SetWindowText("停止显示"); //端口的初始化 m_ctrlPort.SetCurSel(0); m_ctrlPort.GetWindowText(m_strPort); //波特率的初始化 m_ctrlBaud.InsertString(0,_T("4800")); m_ctrlBaud.InsertString(1,_T("14400")); m_ctrlBaud.InsertString(2,_T("19200")); m_ctrlBaud.InsertString(3,_T("38400")); m_ctrlBaud.InsertString(4,_T("56000")); m_ctrlBaud.InsertString(5,_T("57600")); m_ctrlBaud.InsertString(6,_T("115200")); // m_ctrlBaud.InsertString(7,_T("128000")); // m_ctrlBaud.InsertString(8,_T("256000")); m_ctrlBaud.SetCurSel(6); m_ctrlBaud.GetWindowText(m_strBaud); //校验初始化 m_ctrlPartity.SetCurSel(0); m_ctrlPartity.GetWindowText(m_strPartity); //数据位初始化 m_ctrlDatabits.SetCurSel(0); m_ctrlDatabits.GetWindowText(m_strDatabits); //停止位 m_ctrlStopbits.SetCurSel(0); m_ctrlStopbits.GetWindowText(m_strStopbits); return TRUE; // return TRUE unless you set the focus to a control } void CSCOMMDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID, lParam); } } // If you add a minimize button to your dialog, you will need the code below // to draw the icon. For MFC applications using the document/view model, // this is automatically done for you by the framework. void CSCOMMDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); } } // The system calls this to obtain the cursor to display while the user drags // the minimized window. HCURSOR CSCOMMDlg::OnQueryDragIcon() { return (HCURSOR) m_hIcon; } //打开/关闭串口 void CSCOMMDlg::OnButtonOpenport() { if(m_bOpenPort)//串口先是打开的,现在点击按钮进行关闭 { if(m_ctrlAutoSend.GetCheck()) { m_bOpenPort=!m_bOpenPort; AfxMessageBox("请先关掉自动发送"); return; } m_ctrlOpenPort.SetWindowText("打开串口"); m_Port.ClosePort();//关闭串口 m_ctrlPortStatus.SetWindowText("STATUS: COM Port Close"); m_ctrlIconOpenoff.SetIcon(m_hIconOff); m_bOpenPort=FALSE; } else//打开串口 { m_ctrlOpenPort.SetWindowText("关闭串口"); CString strStatus; // BOOL InitPort(CWnd* pPortOwner, UINT portnr = 1, UINT baud = 19200, \ char parity = 'N', UINT databits = 8, UINT stopbits = 1, DWORD dwCommEvents = EV_RXCHAR, UINT writebuffersize = 1024); if(m_Port.InitPort(this,m_nCom,m_nBaud,m_cParity,m_nDatabits,m_nStopbits,m_dwCommEvents,512)) { m_Port.StartMonitoring(); m_ctrlIconOpenoff.SetIcon(m_hIconRed); strStatus.Format("STATUS: COM %d OPENED, %d, %c, %d, %d",m_nCom,m_nBaud,m_cParity,m_nDatabits,m_nStopbits); //当前的状态 端口号 奇偶 数据位 停止位 m_bOpenPort=TRUE; } else { AfxMessageBox("没有发现该串口或 已被占用"); m_ctrlIconOpenoff.SetIcon(m_hIconOff); m_bOpenPort=FALSE; } m_ctrlPortStatus.SetWindowText(strStatus); } } void CSCOMMDlg::OnDestroy() { CDialog::OnDestroy(); m_ctrlAutoSend.SetCheck(0);//强行关闭自动发送 KillTimer(1); KillTimer(4); m_Port.ClosePort();//关闭串口 m_strReceiveData.Empty();//清空接收数据字符串 } //将一个字符串作为十六进制串转化为一个字节数组,字节间可用空格分隔 //返回转换后的字节数组长度,同时字节数组长度自动设置 //将 一串十六进制数转换为字符串(原理:两个十六进制数转化为一个字符 ) int CSCOMMDlg::Str2Hex(CString str, char *data) { int t,t1; int rlen=0,len=str.GetLength(); for (int i=0;i<len;) { char l,h=str[i];//高位 if(h==' ') { i++; continue; } i++; if(i>=len) break; l=str[i];//低位 t=HexChar(h); t1=HexChar(l); if((t==16)||(t1==16)) break; else t=t*16+t1; i++; data[rlen]=(char)t; rlen++; } return rlen; } char CSCOMMDlg::HexChar(char c) { if((c>='0')&&(c<='9')) return c-0x30; else if((c>='A')&&(c<='F')) return c-'A'+10; else if((c>'a')&&(c<'f')) return c-'a'+10; else return 0x10; } void CSCOMMDlg::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default switch (nIDEvent) { case 1: //定时器ID==1为自动发送时间 OnButtonManualsend(); //周期到后自动发送 break; case 2: m_ctrlSavePath.SetWindowText(m_StrCurPath);//重新显示路径 KillTimer(2);//关闭定时器 break; case 3: m_ctrlManualSend.EnableWindow(TRUE); m_ctrlAutoSend.EnableWindow(TRUE); m_ctrlSendFile.EnableWindow(TRUE); m_strSendFilePathName=m_strTempSendFilePathName; KillTimer(3); if(!(m_ctrlAutoSend.GetCheck())) { CString strStatus; if(m_Port.InitPort(this,m_nCom,m_nBaud,m_cParity,m_nDatabits,m_nStopbits,m_dwCommEvents,512)) { m_Port.StartMonitoring(); strStatus.Format("STATUS: COM %d OPENED, %d, %c, %d, %d",m_nCom,m_nBaud,m_cParity,m_nDatabits,m_nStopbits); m_ctrlIconOpenoff.SetIcon(m_hIconRed ); } else { AfxMessageBox("Failed to reset send buffer size!"); m_ctrlIconOpenoff.SetIcon(m_hIconOff); } m_ctrlPortStatus.SetWindowText(strStatus); } break; default: break; } CDialog::OnTimer(nIDEvent); } void CSCOMMDlg::OnCheckAutosend() { m_bAutoSend=!m_bAutoSend; if(m_bAutoSend) { if(m_Port.m_hComm==NULL) { m_bAutoSend=!m_bAutoSend; m_ctrlAutoSend.SetCheck(0); AfxMessageBox("串口没打开,请打开串口"); return ; } else SetTimer(1,m_nCycleTime,NULL); } else { KillTimer(1);//杀掉定时器1 } } void CSCOMMDlg::OnChangeEditCycletime() { CEdit* pEdit=(CEdit*)GetDlgItem(IDC_EDIT_CYCLETIME); CString strText; pEdit->GetWindowText(strText); m_nCycleTime=atoi(strText); } void CSCOMMDlg::OnChangeEditSend() { UpdateData(TRUE); } //停止/继续显示 void CSCOMMDlg::OnButtonStopdisprxdata() { // TODO: Add your control notification handler code here m_bStopDispRXData=!m_bStopDispRXData; if(m_bStopDispRXData) m_ctrlStopDisp.SetWindowText("继续显示"); else m_ctrlStopDisp.SetWindowText("停止显示"); } //清空接收区 void CSCOMMDlg::OnButtonClearreciarea() { // TODO: Add your control notification handler code fere m_strReceiveData.Empty(); UpdateData(FALSE); } //接收到的数据在文件中进行保存 void CSCOMMDlg::OnButtonSavedata() { UpdateData(TRUE);//由屏幕到 内存的 int nLength; nLength=m_StrCurPath.GetLength(); for(int nCount=0;nCount<nLength;nCount++) { if(m_StrCurPath.GetAt(nCount)=='\\') { CreateDirectory(m_StrCurPath.Left(nCount+1),NULL); } } CreateDirectory(m_StrCurPath,NULL); CFile m_rFile; //LPCSTR是Win32和VC++所使用的一种字符串数据类型。LPCSTR被定义成是一个指向以NULL(‘\0’)结尾的常量字符的指针。 LPCSTR lpszPath=m_StrCurPath;// "C:\\comdata" SetCurrentDirectory(lpszPath); //文件为Rec**.txt,一下的代码自动检测文件名是否存在,若存在,则后面序号自动增加 char buf[200]; for(int j=0;j<100;j++) { sprintf(buf,"Rec%02d.txt",j); if((access(buf,0))==-1) break; } if(!m_rFile.Open(buf,CFile::modeCreate|CFile::modeWrite))//我的天呀:这里写成这样的CFile::modeCreate||File::modeWrite { AfxMessageBox("创建文件记录文件失败"); return ; } if((access(buf,0))==-1) { AfxMessageBox("failed"); return ; } //在文件开始处写上保存日期 CTime t=CTime::GetCurrentTime(); CString str=t.Format("%Y年 %m月 %d日 %H时 %M 分 %S秒\r\n"); m_rFile.Write((LPCTSTR)str,str.GetLength()); //保存显示数据 m_rFile.Write((LPCTSTR)m_strReceiveData,m_strReceiveData.GetLength()); m_rFile.Flush();//???????? m_rFile.Close();//关闭文件 str="OK"; for(int i=0;i<5;i++) str+=buf[i]; str+=".txt saved"; m_ctrlSavePath.SetWindowText(str); SetTimer(2,5000,NULL);//在定时器中显示保存文件状态 } void CSCOMMDlg::OnButtonDirbrowser() { static char displayname[MAX_PATH]; static char path[MAX_PATH]; /* typedef LPITEMIDLIST *ITEMIDLIST; typedef struct _ITEMIDLIST { SHITEMID mkid; } ITEMIDLIST; typedef struct _SHITEMID { USHORT cb; BYTE abID[1]; } SHITEMID;*/ LPITEMIDLIST pidlBrowse; //PIDL selected by user BROWSEINFO bi;//???? bi.hwndOwner=this->m_hWnd;//获得窗口自己的句柄 bi.pidlRoot=NULL; bi.pszDisplayName= displayname; bi.lpszTitle ="请选择保存接收数据的文件夹"; bi.ulFlags=BIF_EDITBOX; bi.lpfn=NULL; pidlBrowse=SHBrowseForFolder(&bi); if(pidlBrowse!=NULL) { SHGetPathFromIDList(pidlBrowse,path); } AfxMessageBox("2"); CString str=path;//得到路径 if(str.IsEmpty()) //没选择则返回 return ; m_StrCurPath=str; //接收路径编辑框对应的变量 UpdateData(FALSE); } //下面代码是实现文件的小发送 //选择要发送的文件 void CSCOMMDlg::OnButtonFilebrowser() { // TODO: Add your control notification handler code here LPCTSTR lpszPath="c:\\comdata"; SetCurrentDirectory(lpszPath); static char BASED_CODE szFilter[]="文本文件(*.txt)|*.txt|所有文件(*.*)|*.*||"; CFileDialog FileDlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,szFilter); FileDlg.m_ofn.lpstrInitialDir=lpszPath; if(FileDlg.DoModal()==IDOK) { CString strFileName =FileDlg.GetFileName(); CString strFileExt =FileDlg.GetFileExt(); CString lpstrName =FileDlg.GetPathName(); m_strSendFilePathName=lpstrName; UpdateData(FALSE); } } //发送文件 void CSCOMMDlg::OnButtonSendfile() { // TODO: Add your control notification handler code here CFile fp; if(!(fp.Open((LPCSTR)m_strSendFilePathName,CFile::modeRead))) { AfxMessageBox("Open file failed!"); return ; } fp.SeekToEnd(); unsigned long fplength=fp.GetLength(); m_nFileLength=fplength; char* fpBuff; fpBuff =new char[fplength]; fp.SeekToBegin(); if(fp.Read(fpBuff,fplength)<1) { fp.Close(); return ; } fp.Close(); CString strStatus; if(m_Port.InitPort(this,m_nCom,m_nBaud,m_cParity,m_nDatabits,m_nStopbits,m_dwCommEvents,fplength)) { m_Port.StartMonitoring(); strStatus.Format("STATUS: COM%d OPENED, %d, %c, %d, %d",m_nCom,m_nBaud,m_cParity,m_nDatabits,m_nStopbits); m_ctrlIconOpenoff.SetIcon(m_hIconRed); m_bSendFile=TRUE; // m_strTempSendFilePathName=m_strSendFilePathName; m_ctrlEditSendFile.SetWindowText("正在发送......"); //发送文件时,一下功能不能使用 m_ctrlManualSend.EnableWindow(FALSE); m_ctrlAutoSend.EnableWindow(FALSE); m_ctrlSendFile.EnableWindow(FALSE); m_Port.WriteToPort((LPCSTR)fpBuff,fplength); } else { AfxMessageBox("Failed to send file!"); m_ctrlIconOpenoff.SetIcon(m_hIconOff); } delete fpBuff; } //手动发送 long TX_count=0; void CSCOMMDlg::OnButtonManualsend() { if(m_Port.m_hComm==NULL)//发送数据时要检查串口是否被打开 { m_ctrlAutoSend.SetCheck(0); AfxMessageBox("串口没有打开,请打开串口"); return ; } else { UpdateData(TRUE); if(m_ctrlHexSend.GetCheck())//发送十六进制数 { char data[512]; int len=Str2Hex(m_strSendData,data);//将一个字符串转换为十六进制数 发送 m_Port.WriteToPort(data,len); CString str; str.Format("%d",len); AfxMessageBox(str); for(int i=0;i<len;i++) OnCommunication(data[i],1); TX_count+=(long)((m_strSendData.GetLength()+1)/3);//????????????? } else//发送ASCII文本 { m_Port.WriteToPort((LPCTSTR)m_strSendData);//发送数据 char data[512]; strcpy(data,m_strSendData); int len=m_strSendData.GetLength(); for(int i=0;i<len;i++) OnCommunication(data[i],1); TX_count+=m_strSendData.GetLength(); } CString strTemp; strTemp.Format("TX: %d",TX_count); m_ctrlTXCount.SetWindowText(strTemp);//显示计数 // WPARAM ch='a'; // OnCommunication(ch,1); } CFile m_rFile; //LPCSTR是Win32和VC++所使用的一种字符串数据类型。LPCSTR被定义成是一个指向以NULL(‘\0’)结尾的常量字符的指针。 LPCSTR lpszPath=m_StrCurPath;// "C:\\comdata" SetCurrentDirectory(lpszPath); } LONG CSCOMMDlg::OnFileSendingEnded(WPARAM wParam,LPARAM port) { if(m_bSendFile) { m_ctrlEditSendFile.SetWindowText("发送完毕!");// TX_count+=m_nFileLength; SetTimer(3,3000,NULL); CString strTemp; strTemp.Format("TX: %d ",TX_count); m_ctrlTXCount.SetWindowText(strTemp); } return 0; } /*void CSCOMMDlg::OnButtonPushpin() { // TODO: Add your control notification handler code here // m_ctrlPushPin.ProcessClick(); m_bVisible=!m_bVisible; if(m_bVisible) { SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE); } else { SetWindowPos(&wndBottom,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE|SWP_NOREDRAW); BringWindowToTop(); } }*/ void CSCOMMDlg::OnSelendokComboComselect() { int index=m_ctrlPort.GetCurSel(); m_ctrlPort.SetCurSel(index); m_nCom=index+1; /* if(m_nCom>4) { m_nCom=1; m_ctrlPort.SetCurSel(0); }*/ if( m_bOpenPort==TRUE) { m_bOpenPort=FALSE; OnButtonOpenport(); } } void CSCOMMDlg::OnSelendokComboDatabits() { int index=m_ctrlDatabits.GetCurSel(); m_ctrlDatabits.SetCurSel(index); m_nDatabits=index+5; if( m_bOpenPort==TRUE) { m_bOpenPort=FALSE; OnButtonOpenport(); } } // void CSCOMMDlg::OnSelendokComboParity() { int index=m_ctrlPartity.GetCurSel(); m_ctrlPartity.SetCurSel(index); switch(index) { /* NONE ODD EVEN MARK SPACE*/ case 0: m_cParity='N'; break; case 1: m_cParity='O'; break; case 2: m_cParity='E'; break; case 3: m_cParity='M'; break; case 4: m_cParity='S'; break; default: m_cParity='N'; break; } if( m_bOpenPort==TRUE) { m_bOpenPort=FALSE; OnButtonOpenport(); } } //停止位 void CSCOMMDlg::OnSelendokComboStopbits() { int index=m_ctrlStopbits.GetCurSel(); m_ctrlStopbits.SetCurSel(index); m_ctrlStopbits.GetWindowText(m_strStopbits); m_nStopbits=atoi(m_strStopbits); if( m_bOpenPort==TRUE) { m_bOpenPort=FALSE; OnButtonOpenport(); } } void CSCOMMDlg::OnButtonCountreset() { // TODO: Add your control notification handler code here TX_count=0; rxdatacount=0; }