MFC串口通信编程详解解析
- 格式:doc
- 大小:54.50 KB
- 文档页数:28
API串口编程资料(1)在用ReadFile 和WriteFile读写串行口时,需要考虑超时问题。
如果在指定时间内没有读出或写入指定数量的字节,那么ReadFile或WriteFIle的操作就会结束。
要查询当前的超时设置应调用GetCommTimeouts函数,该函数会填充一个COMMTIMEOUTS结构。
调用SetCommTimeouts函数可以用某一个COMMTIMEOUTS结构的内容来设置超时。
typedef struct _COMMTIMEOUTS (DWORD ReadIntervalTimeout; //读时间间隔超时DWORD ReadTotalTimeoutMultiplier; //读时间系数DWORD ReadTotalTimeoutConstant; //读时间常数DWORD WriteTotalTimeoutMultiplier; //写时间系数DWORD WriteTotalTimeoutConstant; //写时间常量) COMMTIMEOUTS,*LPCOMMTIMEOUTS;(1)CreateFile打开串口:HANDLE hCom;DWORD dwError;hCom=CreateFile("COM1",GENERIC_READ|GENERIC_WRITE, //允许读和写0, //独占方式NULLOPEN_EXITSTING, //FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, //重叠方式 NULL)if(hCom==INVALID_HANDLE_VALUE){dwError=GetLastError(); //得到错误信息//。
//处理错误}//重叠I/O操作就是异步操作或非阻塞操作,即在执行一项操作时,若系统有别的操作请求,可以立即返回执行其他任务,这样程序就不会类似死机一样停在那里。
而NomOverLapped方式则正好相反,程序应该在于同步方式下如果有一个API函数在操作中,另一个会阻塞直到上一个操作完成,所以当读数据的线程停留在WaitCommEvent的时候,写操作WriteFile 就停在原地等待。
利用 MFC 实现串行通信吉林大学尚金瑞01-7-30 上午 11:51:21--------------------------------------------------------------------------------在微软公司推出的Visual C++中,不仅可以利用串行通信控件或调用Windows API来进行串行通信,而且可以利用MFC CFile类来实现串行通讯。
这种通信方式与访问磁盘普通文件没有太大不同。
较简单的实现方式是利用VC++中的MFC向导建立一个支持MFC的工作台工程,添入如下相关代码即可。
1)打开一个串口需使用:CFile file;CFileException e;file.Open (portName, //example "COM1","COM2"CFile::modeReadWrite,&e);2)关闭一个串口需使用:file.Close();3)从端口进行读操作,需使用:char m_ReadBuff[UINTn];UINT nByte=file.Read (&m_ReadBuff, //buffer to store byteUINT nCount //number of bytes to read);4)从端口进行写操作,需使用:char m_WriteBuff[UINTn];file.Write (&m_WriteBuff, //buffer to store byteUINT nCount //number of bytes to write);5)配置串口串行端口创建时,必须对其进行设置以匹配与其对话的设备。
虽然可以通过操作系统设置这些参数,但也可以用Windows API 中的SetCommState()函数来设置它们。
一般地,可用如下程序设置它们:DCB dcb;::GetCommState( (HANDLE)file.m_hFile, &dcb );dcb.BaudRate = 1200,…;dcb.ByteSize = 7 or 8;dcb.StopBits = 0,1,2=0,1.5,2;dcb.Parity = 0-4=no,odd,even,mark,space;::SetCommState((HANDLE)file.m_hFile, &dcb );为了更好地控制端口可以利用SetCommTimeouts()函数打开或关闭超时功能,具体程序如下:COMMTIMEOUTS cto;::GetCommTimeouts((HANDLE)file.m_hFile , &cto );cto.ReadIntervalTimeout =0;cto.ReadTotalTimeoutMultiplier =0;cto.ReadTotalTimeoutConstant =0;cto.WriteTotalTimeoutMultiplier=0;cto.WriteTotalTimeoutConstant =0;::SetCommTimeouts((HANDLE)file.m_hFile , &cto );采用上面的程序,利用MFC CFile类进行串行通信,代码简单、编程量小,可应用于在线监测、自动化控制等许多方面,对科研、生产有着广泛的实用价值。
mfc串口类使用方法MFC串口类使用方法一、引言MFC(Microsoft Foundation Classes)是微软公司为Windows操作系统开发的一套C++类库,提供了一系列的类和函数,简化了Windows程序的开发。
MFC串口类是其中的一个重要组成部分,用于实现在Windows平台下对串口进行读写操作。
本文将介绍MFC串口类的使用方法,帮助读者快速上手并实现串口通信功能。
二、MFC串口类的基本介绍MFC提供了一个名为CSerialPort的串口类,通过该类可以方便地进行串口的打开、关闭、读写等操作。
在使用MFC串口类之前,需要在代码中包含相应的头文件:#include "afxwin.h"三、打开串口在使用串口之前,首先需要打开串口。
打开串口的函数原型如下:BOOL CSerialPort::Open(int nPort, int nBaud, char nParity, int nDatabits, int nStopbits, DWORD dwCommEvents, UINT nBufferSize = 512);参数说明:nPort:串口号,例如1代表COM1;nBaud:波特率,例如9600;nParity:奇偶校验位,可以选择'N'(无校验)、'E'(偶校验)或'O'(奇校验);nDatabits:数据位,可以选择5、6、7或8;nStopbits:停止位,可以选择1或2;dwCommEvents:串口事件,可以选择EV_RXCHAR(接收到字符时触发)或EV_RXFLAG(接收到指定标志位时触发);nBufferSize:缓冲区大小,默认为512。
示例代码如下:CSerialPort serial;if (serial.Open(1, 9600, 'N', 8, 1, EV_RXCHAR)){// 串口打开成功}else{// 串口打开失败}四、关闭串口在使用完串口后,需要关闭串口。
一、介绍MFC及其作用MFC(Microsoft Foundation Class)是微软公司提供的用于Windows应用程序开发的类库,它为C++程序员提供了一套面向对象的编程接口,使得开发Windows应用程序变得更加简单和高效。
MFC可以用来创建图形用户界面(GUI)、处理消息和事件、管理窗口和控件等,是Windows下开发桌面应用程序的重要工具之一。
其中,串口通信在许多实际应用中具有重要的作用,而MFC提供了方便的类库来实现串口通信。
二、串口通信的基本概念1. 串口通信是指通过串行端口进行数据交换的一种通信方式,主要包括RS-232、RS-485、USB串口等。
2. 串口通信中,数据是按照一定的位序列依次传输的,通常包括起始位、数据位、校验位和停止位。
3. 串口通信分为同步串口和异步串口两种,其中异步串口通信最为常见,其数据传输不需要时钟信号。
4. 串口通信常用于嵌入式系统、传感器、工业自动化等领域,以及一些老旧设备上。
三、在MFC中获取插入串口的详细描述1. MFC提供了CSerialPort类来实现串口通信,其中获取插入串口的详细描述是一个重要的功能。
2. 获取插入串口的详细描述可以包括串口的端口号、设备名称、设备描述等信息。
3. 在MFC中,可以通过遍历系统中的串口端口来获取插入串口的详细描述信息。
四、具体步骤1. 需要包含头文件,引入CSerialPort类的定义和相关函数。
2. 通过查询注册表或WMI(Windows Management Instrumentation)来获取系统中已插入的串口端口信息。
3. 每个串口端口在注册表中都有对应的注册表项,可以通过遍历注册表的方式来获取插入串口的详细描述信息。
4. 对于WMI,可以调用相关接口来获取串口设备的详细信息。
五、代码示例下面是一个简单的代码示例,展示了如何在MFC中获取插入串口的详细描述信息:```C++void CMyDlg::EnumSerialPorts(){CString str;HKEY hKey;LONG lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE,_T("HARDWARE\\DEVICEMAP\\SERIALCOMM"), 0, KEY_READ,hKey);if(lResult != ERROR_SUCCESS){AfxMessageBox(_T("Error opening SerialComm Key!"));return;}TCHAR lpValueName[256];DWORD dwValueNameSize = 256;BYTE lpData[256];DWORD dwDataSize = 256;DWORD dwIndex = 0;lResult = RegEnumValue(hKey, dwIndex, lpValueName, dwValueNameSize, NULL, NULL, lpData, dwDataSize);while(lResult == ERROR_SUCCESS){CString strPortName(reinterpret_cast<LPCTSTR>(lpData)); str.Format(_T("s - s"), lpValueName, strPortName);m_lbPorts.AddString(str);dwValueNameSize = 256;dwDataSize = 256;dwIndex++;lResult = RegEnumValue(hKey, dwIndex, lpValueName, dwValueNameSize, NULL, NULL, lpData, dwDataSize);}RegCloseKey(hKey);}```六、总结通过上述步骤和代码示例,我们可以在MFC中轻松获取插入串口的详细描述信息,这对于进行串口通信或者设备监控等应用非常有用。
本文详细介绍了串行通信的基本原理,以及在Windows NT、Win98环境下用MFC实现串口(COM)通信的方法:使用ActiveX控件或Win API.并给出用Visual C++6.0编写的相应MFC32位应用程序。
关键词:串行通信、VC++6.0、ActiveX控件、Win API、MFC32位应用程序、事件驱动、非阻塞通信、多线程.在Windows应用程序的开发中,我们常常需要面临与外围数据源设备通信的问题。
计算机和单片机(如MCS-51)都具有串行通信口,可以设计相应的串口通信程序,完成二者之间的数据通信任务。
实际工作中利用串口完成通信任务的时候非常之多。
已有一些文章介绍串口编程的文章在计算机杂志上发表。
但总的感觉说来不太全面,特别是介绍32位下编程的更少,且很不详细。
笔者在实际工作中积累了较多经验,结合硬件、软件,重点提及比较新的技术,及需要注意的要点作一番探讨。
希望对各位需要编写串口通信程序的朋友有一些帮助。
一.串行通信的基本原理回到页顶串行端口的本质功能是作为CPU和串行设备间的编码转换器。
当数据从CPU经过串行端口发送出去时,字节数据转换为串行的位。
在接收数据时,串行的位被转换为字节数据。
在Windows环境(Windows NT、Win98、Windows2000)下,串口是系统资源的一部分。
应用程序要使用串口进行通信,必须在使用之前向操作系统提出资源申请要求(打开串口),通信完成后必须释放资源(关闭串口)。
二.串口信号线的接法回到页顶一个完整的RS-232C接口有22根线,采用标准的25芯插头座(或者9芯插头座)。
25芯和9芯的主要信号线相同。
以下的介绍是以25芯的RS-232C为例。
①主要信号线定义:2脚:发送数据TXD;3脚:接收数据RXD;4脚:请求发送RTS;5脚:清除发送CTS;6脚:数据设备就绪DSR;20脚:数据终端就绪DTR;8脚:数据载波检测DCD;1脚:保护地;7脚:信号地。
mfc 2010 串口例程摘要:1.MFC 2010 简介2.串口通信基本概念3.串口通信例程介绍4.例程功能及应用场景5.总结与展望正文:MFC(Microsoft Foundation Class)2010 是微软提供的一款用于开发Windows 应用程序的类库。
它可以帮助开发者更轻松地创建高质量的Windows 应用程序。
在众多功能中,MFC 2010 也提供了串口通信相关的类和方法,以便开发者能够方便地进行串口通信。
串口通信(Serial Communication)是一种在两个设备之间传输数据的方式。
它通过串行传输数据,即将数据位逐个传输,而非并行传输。
串口通信在电子设备、计算机外设、通信设备等领域有着广泛的应用。
MFC 2010 提供了丰富的串口通信例程,可以帮助开发者轻松实现串口通信功能。
这些例程包括了串口配置、数据发送与接收、异常处理等功能。
通过这些例程,开发者可以快速地搭建起一个串口通信程序,并对其进行调试和优化。
以下是使用MFC 2010 串口例程的一个简单示例:首先,需要创建一个串口对象,并配置串口参数,如波特率、数据位、停止位等。
接着,可以通过打开或关闭串口对象来开启或关闭串口通信。
在通信过程中,可以使用发送和接收数据的方法,将数据从串口发送到其他设备,或从其他设备接收数据。
同时,需要对串口通信过程中的异常情况进行处理,以保证程序的稳定性和可靠性。
MFC 2010 串口例程广泛应用于各种需要进行串口通信的场合,如工业自动化、数据采集、通信设备等。
通过使用这些例程,开发者可以节省大量的开发时间,专注于实现应用程序的核心功能。
总结来说,MFC 2010 提供了强大的串口通信功能,通过例程的方式,帮助开发者快速实现串口通信功能。
Vc++串口通信(加密解密以及反馈协议)一.主要功能:实现两台计算机通过串口进行数据通信。
二.软件特色:与本软件传输协议不同的串口信息接收到之后不做显示,发送过程中经过数据包加首部尾部来确定数据是否为同一个协议,之后再经过加密发送,接受时先解密,然后经过除去首部跟尾部来得到本来的数据。
三.加密原理:发送时先加首部跟尾部,然后再将所有字符串转换成字符数组,进而对数组中的每个字符进行处理,具体方法是首先获得本次发送的数据总长度,单个字符减去本次字符串总长度的数字,再将数组转换成字符串发送出去,解码时先将受到的字符串转换成字符数组,再将每个字符加上本次接收到的字符串总长度,然后除去首部跟尾部,得到实际有用的数据。
四.协议原理:在每次收到数据之后进行判断,是否为预先设定的反馈数据,如果是,则不做处理,如果不是,则进行发送反馈数据操作。
每次发送完数据对话框有提示“数据已发送“,当收到反馈数据时,提示”数据已成功接收“。
五.主要问题:单次发送的数据不能大于33个字符,否则会接收不正常。
波特率已加到程序里面固定为“115200“,如果太小了可能会出现接收不到信息或者接收速度慢等情况。
六.界面图示:1.发送完数据,但是对方未收到。
2.发送完数据,对方已经成功接收。
七.部分代码界面设计类向导中的函数设计“serilDlg.cpp”文件内部代码#include "stdafx.h"#include "seril.h"#include "serilDlg.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endifint comseril;///////////////////////////////////////////////////////////////////////////// // 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()/////////////////////////////////////////////////////////////////////////////// CSerilDlg dialogCSerilDlg::CSerilDlg(CWnd* pParent /*=NULL*/): CDialog(CSerilDlg::IDD, pParent){//{{AFX_DATA_INIT(CSerilDlg)m_strRXData = _T("");m_strTXData = _T("");m_TestFlag = _T("");//}}AFX_DATA_INIT// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);}void CSerilDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CSerilDlg)DDX_Control(pDX, IDC_OPENSERIL, m_Opensril);DDX_Control(pDX, IDC_COM, m_serilcom);DDX_Text(pDX, IDC_EDIT_RXDATA, m_strRXData);DDX_Text(pDX, IDC_EDIT_TXDATA, m_strTXData);DDX_Control(pDX, IDC_MSCOMM1, m_ctrlComm);DDX_Text(pDX, IDC_TESTFLAG, m_TestFlag);//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CSerilDlg, CDialog)//{{AFX_MSG_MAP(CSerilDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_CLEAR, OnClear)ON_BN_CLICKED(IDC_CLEARSEND, OnClearsend)ON_CBN_CLOSEUP(IDC_COM, OnCloseupCom)ON_BN_CLICKED(IDC_FASONG, OnFasong)ON_BN_CLICKED(IDC_OPENSERIL, OnOpenseril)//}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CSerilDlg message handlersBOOL CSerilDlg::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 herereturn TRUE; // return TRUE unless you set the focus to a control}void CSerilDlg::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 CSerilDlg::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 CSerilDlg::OnQueryDragIcon(){return (HCURSOR) m_hIcon;}BEGIN_EVENTSINK_MAP(CSerilDlg, CDialog)//{{AFX_EVENTSINK_MAP(CSerilDlg)ON_EVENT(CSerilDlg, IDC_MSCOMM1, 1 /* OnComm */, OnComm, VTS_NONE)//}}AFX_EVENTSINK_MAPEND_EVENTSINK_MAP()void CSerilDlg::OnComm(){// TODO: Add your control notification handler code hereVARIANT variant_inp;COleSafeArray safearray_inp;LONG len,k;BYTE rxdata[20480],rxtemp[20480]={0},top[20480],down[20480],jm[20480],jm1[20480]; //设置BYTE数组An 8-bit integerthat is not signed.CString strtemp,test,test1;if (m_ctrlComm.GetCommEvent() == 2) //事件值为2表示接收缓冲区内有字符{ // CString rw="rw";////////以下你可以根据自己的通信协议加入处理代码variant_inp = m_ctrlComm.GetInput(); //读缓冲区safearray_inp = variant_inp; //VARIANT型变量转换为ColeSafeArray型变量len = safearray_inp.GetOneDimSize(); //得到有效数据长度for(k = 0;k < len;k++){safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组}if(rxdata[0] == 'r'&&rxdata[1] == 'e'&&rxdata[2] == 'c'&&rxdata[3] == 'i'&&rxdata[4] == 'v'&&rxdata[5] == 'e'){m_TestFlag = "已被成功接收";}else{m_ctrlComm.SetOutput(COleVariant("recive"));}for (k=0;k<5;k++){top[k]=rxdata[k];}for(k=0;k<4;k++){down[k]=rxdata[len-4+k];}if(top[0] == 'b' && top[1] == 'e' && top[2] == 'g' && top[3] == 'i' && top[4] == 'n' && down[0] == 'o' && down[1] == 'v' && down[2] == 'e' && down[3] == 'r'){for(k=0;k<len-9;k++){rxtemp[k] = rxdata[k+5];}for(k=0;k<len-9;k++){jm1[k] = (rxtemp[k] -len+9);}for(k = 0;k < len-9;k++) //将数组转换为Cstring型变量{BYTE bt = *(char*)(jm1+k); //字符型strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放m_strRXData += strtemp;}}}UpdateData(FALSE); //更新编辑框内容(主要是接收编辑框中的)}void CSerilDlg::OnFasong(){long siz,k;CString SendAll,sendal;UpdateData(TRUE); //读取编辑框内容siz = strlen( m_strTXData) ;char cha[20480] ;char cha1[20480];char cha2[20480];strcpy(cha, m_strTXData);for (k=0;k<siz;k++){cha1[k] = cha[k] +siz ;}CString str(cha1,siz);SendAll = "begin" + str + "over";m_ctrlComm.SetOutput(COleVariant(SendAll)); //发送数据m_TestFlag = "数据已发送";UpdateData(FALSE); //读取编辑框内容}void CSerilDlg::OnOpenseril(){// TODO: Add your control notification handler code herem_ctrlComm.SetCommPort(comseril); //选择com口if ( m_ctrlComm.GetPortOpen() ){m_ctrlComm.SetPortOpen(FALSE);// 关闭串口// AfxMessageBox("cannot open serial port");AfxMessageBox("串口已关闭");}else{m_ctrlComm.SetPortOpen(TRUE);//打开串口AfxMessageBox("串口打开成功");SetDlgItemText(IDC_OPENSERIL,"关闭串口"); //显示串口已经关闭m_ctrlComm.SetSettings("115200,n,8,1"); //波特率9600,无校验,8个数据位,1个停止位m_ctrlComm.SetInputMode(1); //1:表示以二进制方式检取数据m_ctrlComm.SetRThreshold(1); //参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件m_ctrlComm.SetInputLen(0); //设置当前接收区数据长度为0m_ctrlComm.GetInput(); //先预读缓冲区以清除残留数据// m_TestFlag = "未测试";UpdateData(FALSE);}}void CSerilDlg::OnCloseupCom(){comseril = m_serilcom.GetCurSel();}void CSerilDlg::OnClear(){m_strRXData = "";UpdateData(FALSE); //更新编辑框内容// TODO: Add your control notification handler code here}void CSerilDlg::OnClearsend(){// TODO: Add your control notification handler code herem_strTXData = "";UpdateData(FALSE);}、Seril.h内代码// serilDlg.h : header file////{{AFX_INCLUDES()#include "mscomm.h"//}}AFX_INCLUDES#if !defined(AFX_SERILDLG_H__1B7176B4_DDC7_45B3_B636_2597E461F275__INCLUDED_) #define AFX_SERILDLG_H__1B7176B4_DDC7_45B3_B636_2597E461F275__INCLUDED_#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000/////////////////////////////////////////////////////////////////////////////// CSerilDlg dialogclass CSerilDlg : public CDialog{// Constructionpublic:CSerilDlg(CWnd* pParent = NULL); // standard constructor// Dialog Data//{{AFX_DATA(CSerilDlg)enum { IDD = IDD_SERIL_DIALOG };CButton m_Opensril;CComboBox m_serilcom;CString m_strRXData;CString m_strTXData;CMSComm m_ctrlComm;CString m_TestFlag;//}}AFX_DATA// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CSerilDlg)protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support//}}AFX_VIRTUAL// Implementationprotected:HICON m_hIcon;// Generated message map functions//{{AFX_MSG(CSerilDlg)virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();afx_msg void OnClear();afx_msg void OnClearsend();afx_msg void OnCloseupCom();afx_msg void OnFasong();afx_msg void OnComm();afx_msg void OnOpenseril();DECLARE_EVENTSINK_MAP()//}}AFX_MSGDECLARE_MESSAGE_MAP()};//{{AFX_INSERT_LOCATION}}// Microsoft Visual C++ will insert additional declarations immediately before the previous line.#endif// !defined(AFX_SERILDLG_H__1B7176B4_DDC7_45B3_B636_2597E461F275__INCLUDED_)日期:2013-4-10。