S 串口编程 详解6 串口调试助手整个程序代码

来源:互联网 发布:魔兽世界巨鹰飞行网络 编辑:程序博客网 时间:2024/04/29 07:48

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 dialogclass CSCOMMDlg : public CDialog{// Constructionpublic: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 };CButtonm_ctrlNewLine;CComboBoxm_ctrlPartity;CComboBoxm_ctrlStopbits;CComboBoxm_ctrlDatabits;CComboBoxm_ctrlPort;CComboBoxm_ctrlBaud;CEditm_ctrlEditSendFile;CButtonm_ctrlSendFile;CButtonm_ctrlManualSend;CEditm_ctrlSavePath;CButtonm_ctrlAutoClear;CButtonm_ctrlHexReceieve;CButtonm_ctrlStopDisp;CStaticm_ctrlRXCOUNT;CStaticm_ctrlTXCount;CButtonm_ctrlHexSend;CEditm_ctrlReciveData;CButtonm_ctrlAutoSend;CComboBoxm_ctrlDataBits;CComboBoxm_ctrlSpeed;CComboBoxm_ctrlCom;CStaticm_ctrlIconOpenoff;CStaticm_ctrlPortStatus;CButtonm_ctrlOpenPort;CStringm_strCom;CStringm_strSpeed;CStringm_strDataBits;CStringm_strReceiveData;CStringm_strSendData;intm_nCycleTime;CStringm_StrCurPath;CStringm_strSendFilePathName;CStringm_strEditSendFile;CStringm_strBaud;CStringm_strPort;CStringm_strPartity;CStringm_strStopbits;CStringm_strDatabits;//}}AFX_DATA// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CSCOMMDlg)protected:virtual void DoDataExchange(CDataExchange* pDX);// DDX/DDV support//}}AFX_VIRTUAL// Implementationprivate: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_MSGDECLARE_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_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////// CAboutDlg dialog used for App Aboutclass 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// Implementationprotected://{{AFX_MSG(CAboutDlg)//}}AFX_MSGDECLARE_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_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CSCOMMDlg dialogCSCOMMDlg::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 Win32m_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_MAPEND_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);elsestr.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 handlersBOOL 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 dialogSetIcon(m_hIcon, TRUE);// Set big iconSetIcon(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 paintingSendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);// Center icon in client rectangleint 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 icondc.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;elset=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 defaultswitch (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 ;}elseSetTimer(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 herem_bStopDispRXData=!m_bStopDispRXData;if(m_bStopDispRXData)m_ctrlStopDisp.SetWindowText("继续显示");elsem_ctrlStopDisp.SetWindowText("停止显示");}//清空接收区void CSCOMMDlg::OnButtonClearreciarea() {// TODO: Add your control notification handler code ferem_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 userBROWSEINFO 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 hereLPCTSTR 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 hereCFile 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){/*NONEODDEVENMARKSPACE*/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 hereTX_count=0;rxdatacount=0;}