MFC串口通信编程详解
- 格式:pdf
- 大小:197.89 KB
- 文档页数:13
基于VC6.0MFC的简单串⼝通信软件编程(⼀)基于对话框编程基本步骤:1.新建基于对话框的⼯程;2.拖曳所需的基本控件,构成界⾯;3.使⽤类向导(CLASS WIZARD)创建与基本控件对应的成员变量、成员函数,确定与函数相应的消息或事件——即触礁发该函数执⾏的条件(如单击等)。
(⼆)使⽤mscomm控件:1.基本设置:m_com.SetCommPort(1); //选择COM1m_com.SetInBufferSize(1024); //设置输⼊缓冲区的⼤⼩,Bytesm_com.SetOutBufferSize(256); //设置输出缓冲区的⼤⼩,Bytesif(!m_com.GetPortOpen()) //打开串⼝m_com.SetPortOpen(TRUE);m_com.SetInputMode(1); //设置输⼊⽅式为⼆进制⽅式m_com.SetSettings("4800,s,8,1");m_com.SetRThreshold(1); //为1表⽰有⼀个字符引发⼀个事件 m_com.SetInputLen(0);2.似乎每次设置m_com.SetSettings("4800,s,8,1"),必须先关再开串⼝才有效。
设置的校验位似乎只对发送数据有效,对接收数据⽆效。
3.虽然m_com.SetRThreshold(1)设置接收到⼀个字符就引发⼀个事件(触发执⾏函数),但执⾏函数读取到的数据可能不⽌1Byte,如另⼀串⼝连续发送多个字节,当串接收到第⼀个字节后就触发函数,但在函数去输⼊缓冲区读取数据时可以读到8Byte。
(三)MFC的⼀些基本使⽤:1.Unsigned char 与char不同,在执⾏加减时,char型当作带符号数(可能为负)。
2.当控件对应的变量是控件类时,可能通过该类的成员函数来获取数据或执⾏操作:如m_com是mscomm控件的变量,可以执⾏m_com.SetPortOpen(FALSE)来关闭串⼝。
VS2021之MFC串口通信教程说明:本人也是方才入门MFC,参照一些资料和源代码就实验做了这么一个串口通信工具!资料来源要紧有鸡啄米博客网站,里面有详细的学习教程!网上的VS2021源代码都比较少,建议大伙儿先明白得一个源代码的构架和结构再深切学习!本文档能够一步一步教你从成立工程到实验调试,是一个超级完整的教程!超级适合新手练习!——贺州学院大学生创新基地实验室在制作串口通信所碰着的问题:编辑框的转动条可不能随着数据的更新维持在最后一行!接下来咱们开始讲解MFC串口通信的制作:一、打开VS2021软件,然后新建一个项目,如以下图所示;咱们要用到确实是对话框模块,因此选择如以下图所示最大化框最好别选,因为本人此刻也没弄出来;点击完成绩新建好一个工程了,等资源就绪以后咱们就可以够够进行制作了;咱们能够看到就绪以后的界面如以下图所示,依照步骤把原先的静态文本框和确信按钮、取消按钮删掉;二、为咱们的对话框添加控件添加两个组合边框,并放置好位置;修改组合边框显示的名称;在组合边框里面添加编辑文本框;在这一步必然要警戒选择右边的属性;这一步是把串口控件添加到对话框中来;选择咱们需要的串口控件如以下图所示;三、为编辑框,Combox框,串口控件添加变量;四、为按钮和串口控件添加程序函数void C串口V2Dlg::OnBnClickedButtonOpen()//打开串口按钮程序{// TODO: 在此添加控件通知处置程序代码?CString str,str1,n; //概念字符串GetDlgItemText(IDC_BUTTON_OPEN,str);CWnd *h1;h1=GetDlgItem(IDC_BUTTON_OPEN); //指向控件的captionif(!m_mscom.get_PortOpen()){m_comb2.GetLBText(m_comb2.GetCurSel(),str1);//取得所选的字符串,并寄放在str1里面str1=str1+','+'n'+','+'8'+','+'1'; //这句话很关键m_mscom.put_CommPort((m_comb1.GetCurSel()+1)); //选择串口m_mscom.put_InputMode(1); //设置输入方式为二进制方式m_mscom.put_Settings(str1); //波特率为(波特率组Á合框)无校验,8数据位,1个停止位m_mscom.put_InputLen(1024); //设置当前接收区数据长度为1024m_mscom.put_RThreshold(1); //缓冲区一个字符引发事件m_mscom.put_RTSEnable(1); //设置RT许诺m_mscom.put_PortOpen(true); //打开串口if(m_mscom.get_PortOpen()){str=_T("关闭串口");UpdateData(true);h1->SetWindowText(str); //改变按钮名称为‘’关闭串口”}}else{m_mscom.put_PortOpen(false);if(str!=_T("打开串口)){str=_T("打开串口");UpdateData(true);h1->SetWindowText(str); //改变按钮名称为打开串口}}}void C串口V2Dlg::OnBnClickedButtonSend()//发送数据按钮程{// TODO: 在此添加控件通知处置程序代码?UpdateData(true); //更新控件数据m_mscom.put_Output(COleVariant(m_Editsend));//把发送编辑框的数据发送出去}void C串口V2Dlg::OnBnClickedButtonClean()//清除数据按钮程序{// TODO: 在此添加控件通知处置程序代码m_EditReceive=_T(""); //给接收编辑框发送空格符UpdateData(false); //更新数据}void C串口V2Dlg::OnBnClickedButtonClose()//退出按钮程序{// TODO: 在此添加控件通知处置程序代码if(m_mscom.get_PortOpen())m_mscom.put_PortOpen(false);CDialogEx::OnCancel();}void C串口V2Dlg::OnCommMscomm1()//串口控件程序{// TODO: 在此处添加消息处置程序代码if(m_mscom.get_CommEvent()==2){char str[1024]={0};long k;VARIANT InputData=m_mscom.get_Input(); //读缓冲区COleSafeArray fs;fs=InputData; //VARIANT型变À量转换为COleSafeArray型变量for(k=0;k<fs.GetOneDimSize();k++)fs.GetElement(&k,str+k); //转换为BYTE型数组m_EditReceive+=str; // 接收到编辑框里面//SetTimer(1,10,NULL); //延时10msUpdateData(false);}}// 串口选择组合框CString str;int i;for(i=0;i<15;i++){str.Format(_T("com %d"),i+1);m_comb1.InsertString(i,str); }m_comb1.SetCurSel(0);//预置COM口//波特率选择组合框CString str1[]={_T("300"),_T("600"),_T("1200"),_T("2400"),_T("4800"),_T("9600"), _T("19200"),_T("38400"),_T("43000"),_T("56000"),_T("57600"),_T("115200")};for(int i=0;i<12;i++){int judge_tf=m_comb2.AddString(str1[i]);if((judge_tf==CB_ERR)||(judge_tf==CB_ERRSPACE))MessageBox(_T("build baud error!"));}m_comb2.SetCurSel(5);//预置波特率为"9600"写完以后编译程序五、调试咱们写好的串口工具咱们下面用51单片机调试一下,结果也是成功的;m_Edit.SetSel(-1, -1);this->SetDlgItemTextW(IDC_EDIT1,m_EditReceive);//将m_EditReceive内容显示到ID为IDC_EDIT1的编辑框的最后位置m_Edit.LineScroll(m_Edit.GetLineCount()-1,0);//将垂直转动条转动到最后一修改一下接收编辑框的属性,发送编辑框不用做修改;再调试一下觉察问题解决了!六、修改图标和软件信息咱们去到项目所在的文件夹中,如以下图所示;The End!刘小二2021年5月2日礼拜五。
利用 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下的MSCOMM控件用于串口通信的几个例子MFC下的MSCOMM控件用于串口通信的几个例子VC基于MSCOMM控件串口通讯(转)/hanhaitianyu/blog/item/0c4cc0ef5d344 ef7b3fb9526.html在mfc中进行串口通讯最简单的方法莫过于在对话框中使用MSCOMM控件了,MSComm通信控件提供了一系列标准通信命令的接口,它允许建立串口连接,可以连接到其他通信设备(如Modem).还可以发送命令、进行数据交换以及监视和响应在通信过程中可能发生的各种错误和事件,从而可以用它创建全双工、事件驱动的、高效实用的通信程序。
一、用MSComm控件通信1.串口通信基础知识一般悦来,计算机都有一个或多个串行端口,它们依次为com1、Com2、…,这些串口还提供了外部设备与pC进行数据传输和通信的通道。
这些串口在CPU和外设之间充当解释器的角色。
当字符数据从CPU发送给外设时,这些字符数据将被转换成串行比特流数据;当接收数据时,比特流数据被转换为字符数据传递给CPU,再进一步说,在操作系统方面,Windows用通信驱动程序(COMM.DRV)调用API函数发送和接收数据,当用通信控件或声明调用API函数时,它门由COMM. DRV解释并传递给设备驱动程序,作为一个程序员,要编写通信程序.只需知道通信控件提供给Windows通信AP1函数的接口即可.换句话说,只需设定和监视通信控件的属性和事件即可。
2.使用Mscomm控件在开始使用MSComm控件之前。
需要先了解其属性、事件或错误属性描述CommPort 设置或返回通信端口号Settings 以字符串的形式设置或返回波特率、奇偶校验、数据位和停止位PortOpen 设置或返回通信端口的状态。
也可以打开和关闭端口Input 返回和删除接收缓冲区中的字符Output 将字符串写入发送缓冲区CommEvent属性为通信事件或错误返回下列值之一。
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 提供了强大的串口通信功能,通过例程的方式,帮助开发者快速实现串口通信功能。