MFC串口通信编程详解
基于VC6.0MFC的简单串口通信软件编程

基于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串口通信的编写教程

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串口通信编程详解解析

串口的操作可以有两种操作方式:同步操作方式和重叠操作方式(又称为异步操作方式.同步操作时,API函数会阻塞直到操作完成以后才能返回(在多线程方式中,
}
return TRUE;
二配置串口
在打开通讯设备句柄后,常需要对串口进行一些初始化配置工作.这需要通过一个DCB结构来进行.DCB结构包含了诸如波特率、数据位数、奇偶校验和停止位数等信息.在查询或配置串口的属性时,都要用DCB结构来作为缓冲区.
一般用CreateFile打开串口后,可以调用GetCommState函数来获取串口的初始配置.要修改串口的配置,应该先修改DCB结构,然后再调用SetCommState函数设置串口.
//EVENPARITY偶校验NOPARITY无校验
//MARKPARITY标记校验ODDPARITY奇校验
BYTE StopBits;//指定停止位的位数.此成员可以有下列值:
//ONESTOPBIT 1位停止位TWOSTOPBITS 2位停止位
//ONE5STOPBITS 1.5位停止位
………
} DCB;
0,//同步方式
NULL;
if(hCom==(HANDLE-1
{
MessageBox("打开COM失败!";
return FALSE;
}
return TRUE;
重叠I/O打开串口的示例:
HANDLE hCom;//全局变量,串口句柄
hCom =CreateFile("COM1",//串口名称
利用MFC实现串行通信

利用 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控件用于串口通信的几个例子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串口类使用方法一、引言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及其作用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中轻松获取插入串口的详细描述信息,这对于进行串口通信或者设备监控等应用非常有用。
MFC串口通信程序(基于Vc++及Serialport类)

编程步骤
编写按钮控件消息响应处理函数-发送
以同样的方法打开“发送”按钮的消息函数,插入下面语句
void C串口通信程序Dlg::OnBnClickedButton3() { if(!m_bPortOpen) //检测串口是否打开 return ; //如果关闭,则结束函数 else //如果打开,则执行下面语句 UpdateData(TRUE); //读入编辑框的数据(把编辑框中的字符写入变量) m_SerialPort.WriteToPort((LPCTSTR)m_strTxMsg); //调用函数发送数据 }
m_strPairty
Control型变量
m_strTxMsg
m_strRxMsg
Value型变量
编程步骤
对写好的对话框进行一个初始化 在初始化函数OnInitDialog()中添加如下语句:
BOOL C串口通信程序Dlg::OnInitDialog() { CDialogEx::OnInitDialog(); m_ctrlComPort.SetCurSel(0);//设置默认的索引值 m_ctrlBaudRate.SetCurSel(0); m_ctrlPairty.SetCurSel(0); m_ctrlDataBits.SetCurSel(3); m_ctrlStopBits.SetCurSel(0); GetDlgItem(IDC_BUTTON1)->EnableWindow(TRUE); //把窗口中的“打开串口”置为活动的可操作状态 GetDlgItem(IDC_BUTTON2)->EnableWindow(FALSE); //把窗口中的“关闭串口”置为灰色的不可操作状态
编程步骤
• • 在对话框c文件中声明串口类对象 定义一个布尔变量 CSerialPort m_SerialPort BOOL m_bPortOpen //用来表示标志串口是否打开
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
DWORD ReadIntervalTimeout;//读间隔超时 DWORD ReadTotalTimeoutMultiplier;//读时间系数 DWORD ReadTotalTimeoutConstant;//读时间常量 DWORD WriteTotalTimeoutMultiplier;//写时间系数 DWORD WriteTotalTimeoutConstant;//写时间常量 } COMMTIMEOUTS,*LPCOMMTIMEOUTS; COMMTIMEOUTS 结构的成员都以毫秒为单位.总超时的计算公式是: 总超时=时间系数×要求读/写的字符数+时间常量 例如要读入 10 个字符,那么读操作的总超时的计算公式为: 读总超时=ReadTotalTimeoutMultiplier×10+ReadTotalTimeoutConstant 可以看出:间隔超时和总超时的设置是不相关的,这可以方便通信程序灵活地设置 各种超时. 如果所有写超时参数均为 0,那么就不使用写超时.如果 ReadIntervalTimeout 为 0,那么就不使用读间隔超时.如果 ReadTotalTimeoutMultiplier 和 ReadTotalTimeoutConstant 都为 0,则不使用读总超时.如果读间隔超时被设置成 MAXDWORD 并且读时间系数和读时间常量都为 0,那么在读一次输入缓冲区的内容后 读操作就立即返回,而不管是否读入了要求的字符. 在用重叠方式读写串口时,虽然 ReadFile 和 WriteFile 在完成操作以前就可能返 回,但超时仍然是起作用的.在这种情况下,超时规定的是操作的完成时间,而不是 ReadFile 和 WriteFile 的返回时间.
要查询当前的超时设置应调用 GetCommTimeouts 函数,该函数会填充一个 COMMTIMEOUTS 结构.调用 SetCommTimeouts 可以用某一个 COMMTIMEOUTS 结构的内容 来设置超时.
读写串口的超时有两种:间隔超时和总超时.间隔超时是指在接收时两个字符之间 的最大时延.总超时是指读写操作总共花费的最大时间.写操作只支持总超时,而读 操作两种超时均支持.用 COMMTIMEOUTS 结构可以规定读写操作的超时.
无论哪种操作方式,一般都通过四个步骤来完成: (1)打开串口 (2)配置串口 (3)读写串口 (4)关闭串口
一 打开串口
Win32 系统把文件的概念进行了扩展.无论是文件、通信设备、命名管道、邮件 槽、磁盘、还是控制台,都是用 API 函数 CreateFile 来打开或创建的.该函数的 原型 为:
DWORD fParity;//指定奇偶校验使能.若此成员为 1,允许奇偶校验检查 …
BYTE ByteSize;//通信字节位数,4—8
BYTE Parity;//指定奇偶校验方法.此成员可以有下列值: //EVENPARITY 偶校验 NOPARITY 无校验 //MARKPARITY 标记校验 ODDPARITY 奇校验 BYTE StopBits;//指定停止位的位数.此成员可以有下列值: //ONESTOPBIT 1 位停止位 TWOSTOPBITS 2 位停止位 //ONE5STOPBITS 1.5 位停止位
配置串口的示例:
SetupComm(hCom,1024,1024);//输入缓冲区和输出缓冲区的大小都是 1024 COMMTIMEOUTS TimeOuts; //设定读超时 TimeOuts.ReadIntervalTimeout=1000; TimeOuts.ReadTotalTimeoutMultiplier=500; TimeOuts.ReadTotalTimeoutConstant=5000; //设定写超时 TimeOuts.WriteTotalTimeoutMultiplier=500; TimeOuts.WriteTotalTimeoutConstant=2000; SetCommTimeouts(hCom,&TimeOuts);//设置超时 DCB dcb; GetCommState(hCom,&dcb); dcb.BaudRate=9600;//波特率为 9600 dcb.ByteSize=8;//每个字节有 8 位 dcb.Parity=NOPARITY;//无奇偶校验位 dcb.StopBits=TWOSTOPBITS;//两个停止位 SetCommState(hCom,&dcb); PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);
BOOL SetupComm(
HANDLE hFile,
// 通信设备的句柄
DWORD dwInQueue, // 输入缓冲区的大小(字节数)
DWORD dwOutQueue // 输出缓冲区的大小(字节数)
);
在用 ReadFile 和 WriteFile 读写串行口时,需要考虑超时问题.超时的作用是在指 定的时间内没有读入或发送指定数量的字符,ReadFile 或 WriteFile 的操作仍然会 结束.
GetCommState 函数可以获得 COM 口的设备控制块,从而获得相关参数: BOOL GetCommState(
HANDLE hFile, //标识通讯端口的句柄 LPDCB lpDCB //指向一个设备控制块(DCB 结构)的指针 );
SetCommState 函数设置 COM 口的设备控制块: BOOL SetCommState(
OPEN_EXISTING; • dwFlagsAndAttributes:属性描述,用于指定该串口是否进行异步操作,该值
为 FILE_FLAG_OVERLAPPED,表示使用异步的 I/O;该值为 0,表示同步 I/O 操 作; • hTemplateFile:对串口而言该参数必须置为 NULL;
HANDLE CreateFile( LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDistribution,
DWORD dwFlagsAndAttributes, HANDLE hTemplateFile);
• lpFileName:将要打开的串口逻辑名,如“COM1”; • dwDesiredAccess:指定串口访问的类型,可以是读取、写入或二者并列; • dwShareMode:指定共享属性,由于串口不能共享,该参数必须置为 0; • lpSecurityAttributes:引用安全性属性结构,缺省值为 NULL; • dwCreationDistribution:创建标志,对串口操作该参数必须置为
MFC 串口通信编程介绍
主要介绍了用 CreateFile()函数和 WriteFile()函数读写串口的实例,以及设置 串口属性的实例.
在工业控制中,工控机(一般都基于 Windows 平台)经常需要与智能仪表通过串口 进行通信.串口通信方便易行,应用广泛.
一般情况下,工控机和各智能仪表通过 RS485 总线进行通信.RS485 的通信方式是 半双工的,只能由作为主节点的工控 PC 机依次轮询网络上的各智能控制单元子节点. 每次通信都是由 PC 机通过串口向智能控制单元发布命令,智能控制单元在接收到正 确的命令后作出应答.
HANDLE hFile, LPDCB lpDCB );
除了在 BCD 中的设置外,程序一般还需要设置 I/O 缓冲区的大小和超时.Windows
用 I/O 缓冲区来暂存串口输入和输出的数据.如果通信的速率较高,则应该设置较大
的缓冲区.调用 SetupComm 函数可以设置串行口的输入和输出缓冲区的大小.
#define CBR_110
110
#define CBR_300
300
#define CBR_600
600
#define CBR_1200 1200
#define CBR_2400 2400
#define CBR_4800 4800
#define CBR_9600 9600
#define CBR_14400 14400
同步 I/O 方式打开串口的示例:
HANDLE hCom;//全局变量,串口句柄 hCom=CreateFile("COM1",//串口名称
GENERIC_READ|GENERIC_WRITE,//允许读和写 0,//独占方式 NULL, OPEN_EXISTING,//打开而不是创建 0,//同步方式 NULL); if(hCom==(HANDLE)-1) { MessageBox("打开 COM 失败!"); return FALSE; } return TRUE;
在 Win32 下,可以使用两种编程方式实现串口通信,其一是使用 ActiveX 控件,这种 方法程序简单,但欠灵活.其二是调用 Windows 的 API 函数,这种方法可以清楚地掌握 串口通信的机制,并且自由灵活.下面只介绍 API 串口通信部分.
串口的操作可以有两种操作方式:同步操作方式和重叠操作方式(又称为异步操作 方式).同步操作时,API 函数会阻塞直到操作完成以后才能返回(在多线程方式中, 虽然不会阻塞主线程,但是仍然会阻塞监听线程);而重叠操作方式,API 函数会立即 返回,操作在后台进行,避免线程的阻塞.
#define CBR_19200 19200
#define CBR_38400 38400
#define CBR_56000 56000
#define CBR_57600 57600
#define CBR_115200 115200