文档库 最新最全的文档下载
当前位置:文档库 › VC串口编程API详解

VC串口编程API详解

VC串口编程API详解
VC串口编程API详解

V C串口编程A P I详解集团企业公司编码:(LL3698-KKI1269-TM2483-LUI12689-ITT289-

V C++串口编程主要A P I详解该文档是本人在刚刚接触到VC++下的串口编程时,总结归纳的一些主要的API函数,可以帮助初学者更好的理解串口编程的方法。

1.打开串口

HANDLECreateFile(LPCTSTRlpFileName, DWORDdwDesiredAccess,

DWORDdwShareMode,

LPSECURITY_ATTRIBUTESlpSecurityAttributes,

DWORDdwCreationDistribution,

DWORDdwFlagsAndAttributes,

HANDLEhTemplateFile);

参数:

lpFileName:将要打开的串口逻辑名,如“COM1”;dwDesiredAccess:指定串口访问的类型,可以是读取、写入或二者并列;

dwShareMode:指定共享属性,由于串口不能共享,该参数必须置为0;lpSecurityAttributes:引用安全性属性结构,缺省值为NULL;

dwCreationDistribution:创建标志,对串口操作该参数必须置为OPEN_EXISTING;

dwFlagsAndAttributes:属性描述,用于指定该串口是否进行异步操作,该值为FILE_FLAG_OVERLAPPED,表示使用异步的I/O;该值为0,表示同步I/O操作,本工程采用异步方式;

hTemplateFile:对串口而言该参数必须置为NULL;

2.获取串口设备控制块DCB

BOOLGetCommState(

HANDLEhFile, //标识通讯端口的句柄,由CreateFile()函数返回的句柄

LPDCBlpDCB //指向一个设备控制块(DCB结构)的指针

);

3.设置串口设备控制块DCB

BOOLSetCommState(

HANDLEhFile,//标识通讯端口的句柄,由CreateFile()函数返回的句柄LPDCBlpDCB//指向一个设备控制块(DCB结构)的指针

);

4.设置串口输入输出缓冲区大小

BOOLSetupComm(

HANDLEhFile, //通信设备的句柄DWORDdwInQueue, //输入缓冲区的大小(字节数)DWORDdwOutQueue //输出缓冲区的大小(字节数)

);

5.清空读写缓冲区内容

BOOLPurgeComm(

HANDLEhFile, //串口句柄

DWORDdwFlags //需要完成的操作

);

参数dwFlags指定要完成的操作,可以是下列值的组合:

PURGE_TXABORT 中断所有写操作并立即返回,即使写操作还没有完成。

PURGE_RXABORT 中断所有读操作并立即返回,即使读操作还没有完成。

PURGE_TXCLEAR 清除输出缓冲区

PURGE_RXCLEAR 清除输入缓冲区

6.超时时间获取与设置

BOOLGetCommTimeouts( //获取串口超时设置HANDLEhFile, //标识通信设备,CreateFile()函数返回该句柄;LPCOMMTIMEOUTSlpCommTimeouts //指向COMMTIMEOUTS结构。);

BOOLSetCommTimeouts(//设置串口超时时间

HANDLEhFile, //标识通信设备,CreateFile()函数返回该句柄;LPCOMMTIMEOUTSlpCommTimeouts //指向COMMTIMEOUTS结构。);

COMMTIMEOUTS结构的定义为:

typedefstruct_COMMTIMEOUTS{

DWORDReadIntervalTimeout;//读间隔超时,单位ms DWORDReadTotalTimeoutMultiplier;//读时间系数,单位ms DWORDReadTotalTimeoutConstant;//读时间常量,单位ms DWORDWriteTotalTimeoutMultiplier;//写时间系数,单位ms DWORDWriteTotalTimeoutConstant;//写时间常量,单位ms

}COMMTIMEOUTS,*LPCOMMTIMEOUTS;

参数详解:

·ReadIntervalTimeout:以ms为单位指定通信线路上两个字符到达之间的最大时间间隔。在ReadFile()操作期间,从接收到第一个字符时开始计时。如果任意两个字符到达之间的时间间隔超过这个最大值,则ReadFile()操作完成,并返回缓冲数据。如果被置为0,则表示不使用间隔超时。

Windows使用下面的式子计算总超时时间:

ReadTotalTimeout=(ReadTotalTimeoutMultiplier*bytes_to_read)+Rea dTotalTimeoutConstant;

WriteTotalTimeout=(WriteTotalTimeoutMultiplier*bytes_to_write)+ WriteTotalTimeoutConstant;

超时有两种类型。第一种类型叫区间超时(intervaltimeout),它仅适应于从端口读取数据

它指定在读取两个字符之间要经历多长时间。接收一个字符时,Windows 就启动一个内部计

时器。在下一个字符到达之前,如果定时器超过了区间超时设定时间,读函数就会放弃。第

二种类型的超时叫做总超时(totaltimeout),它适于读和写端口。当读或写特定字节数需

要的总时间超过某一阈值时,该超时即被触发。

当超时的常数和系数都设置为0,则没有总超时时间。如果读间隔超时被设置成MAXDWORD并且读时间系数和读时间常量都为0,那么在读一次输入缓冲区的内容后读操作就立即返回而不管是否读入了要求的字符。

在用异步方式读写串口时,虽然ReadFile和WriteFile在完成操作以前就可能返回,但超时仍然是起作用的。在这种情况下,超时规定的是操作的完成时间,而不是ReadFile和WriteFile的返回时间。

7.关闭串口

BOOLCloseHandle(

HANDLEhObject;//串口句柄

);

8.读写串口

BOOLReadFile(

HANDLEhFile, //串口的句柄LPVOIDlpBuffer, //读入的数据存储的地址,DWORDnNumberOfBytesToRead, //要读入的数据的字节数LPDWORDlpNumberOfBytesRead,//指向一个DWORD数值,该数值返回读操作实际读入的字节数

LPOVERLAPPEDlpOverlapped //异步操作时,该参数指向一个OVERLAPPED结构,同步操作时,该参数为NULL。

);

BOOLWriteFile(

HANDLEhFile, //串口的句柄LPCVOIDlpBuffer, //写入的数据存储的地址,DWORDnNumberOfBytesToWrite, //要写入的数据的字节数LPDWORDlpNumberOfBytesWritten,//指向指向一个DWORD数值,该数值返回实际写入的字节数

LPOVERLAPPEDlpOverlapped //重叠操作时,该参数指向一个OVERLAPPED结构,同步操作时,该参数为NULL。

);

在同步执行时,函数直到操作完成后才返回。这意味着同步执行时线程会被阻塞,从而导致效率下降。在异步执行时,即使操作还未完成,这两个函数也会立即返回,费时的I/O操作在后台进行。

如果操作成功,这两个函数都返回TRUE。需要注意的是,当ReadFile和WriteFile返回FALSE时,不一定就是操作失败,应该调用GetLastError函数分析返回的结果。例如,在异步操作时如果操作还未完成函数就返回,那么函数就返回FALSE,而且GetLastError函数返回ERROR_IO_PENDING。这说明异步操作还未完成。

9.清除错误

BOOLClearCommError(

HANDLEhFile, //串口句柄

LPDWORDlpErrors, //指向接收错误码的变量

LPCOMSTATlpStat //指向通讯状态缓冲区

);

该函数获得通信错误并报告串口的当前状态,同时,该函数清除串口的错误标志以便继续输入、输出操作。

在使用ReadFile函数进行读操作前,应先使用ClearCommError函数清除错误。

参数lpStat指向一个COMSTAT结构,该结构返回串口状态信息。COMSTAT结构COMSTAT结构包含串口的信息,结构定义如下:typedefstruct_COMSTAT{//cst

DWORDfCtsHold:1;//TxwaitingforCTSsignal DWORDfDsrHold:1;//TxwaitingforDSRsignal DWORDfRlsdHold:1;//TxwaitingforRLSDsignal DWORDfXoffHold:1;//Txwaiting,XOFFcharrec''d DWORDfXoffSent:1;//Txwaiting,XOFFcharsent

DWORDfEof:1;//EOFcharactersent

DWORDfTxim:1;//characterwaitingforTx DWORDfReserved:25;//reserved

DWORDcbInQue;//bytesininputbuffer

DWORDcbOutQue;//bytesinoutputbuffer

}COMSTAT,*LPCOMSTAT;

10.设置通讯端口监听事件

BOOLSetCommMask(

HANDLEhFile,//标识通信端口的句柄

DWORDdwEvtMask//能够使能的通信事件

);

通讯端口的事件由dwEvtMask变量来设置,其可取如下值:

EV_BREAK 检测到输入为止

EV_CTSCTS (清除发送)信号改变状态

EV_DSRDSR (数据设置就绪)信号改变状态

EV_ERR发生了线路状态错误.

线路状态错误为:

CE_FRAME(帧错误)

CE_OVERRUN(接收缓冲区超限)

CE_RXPARITY(奇偶校验错误)

EV_RING检测到振铃

EV_RLSDRLSD(接收线路信号检测)信号改变状态

EV_RXCHAR接收到一个字符,并放入输入缓冲区

EV_RXFLAG使用SetCommState()函数设置的DCB结构中的等待字符

已被传入输入缓冲区中。

EV_TXEMPTY输出缓冲区中最后一个字符发送出去

在用SetCommMask指定了有用的事件后,应用程序可调用WaitCommEvent()来等待事件发生。

11.获取端口监听事件

BOOLGetCommMask(

HANDLEhFile,//标识通信端口的句柄

LPDWORDlpEvtMask//存储监控的通信事件

);

12.等待监听事件发生

BOOLWaitCommEvent(

HANDLEhFile, //标识通信端口的句柄LPDWORDlpEvtMask, //指向存放事件标识变量的指针LPOVERLAPPEDlpOverlapped //指向overlapped结构

);

该函数调用成功返回TURE,若失败则返回FALSE。

若函数返回FALSE,可调用GetLastError()查看错误类型,如过错误类型是ERROR_IO_PENDING,表明没有检测到事件发生,程序继续在后台进行监听,并且LPOVERLAPPED结构的hEvent成员变量被设置为无信号状态;若返回成功,表示检测到某个事件发生,具体是哪个类型的事件发生可通过查看lpEvtMask参数获知。

lpEvtMask参数的值只可能是SetCommMask()函数设置的的监听通讯端口事件。此时LPOVERLAPPED 结构的hEvent成员变量被设置为有信号状态。

VC与c51串口通讯程序

跟着步骤学习 1.建立项目:打开VC++6.0,建立一个基于对话框的MFC应用程序SCommTest 2.在项目中插入MSComm控件选择Project菜单下Add To Project子菜单中的 Components and Controls…选项,在弹出的对话框中双击Registered ActiveX Controls项(稍等一会,这个过程较慢),则所有注册过的ActiveX控件出现在列表框中。选择Microsoft Communications Control, version 6.0,,单击Insert按钮将它插入到我们的Project中来,接受缺省的选项。(如果你在控件列表中看不到Microsoft Communications Control, version 6.0,那可能是你在安装VC6时没有把ActiveX一项选上,重新安装VC6,选上ActiveX就可以了), 这时在ClassView视窗中就可以看到CMSComm类了,(注意:此类在ClassWizard中看不到,重构clw 文件也一样),并且在控件工具栏Controls中出现了电话图标(如图1所示),现在要做的是用鼠标 将此图标拖到对话框中,程序运行后,这个图标是看不到的。 3.利用ClassWizard定义CMSComm类控制对象打开ClassWizard ->Member Viariables选项卡,选择CSCommTestDlg类,为IDC_MSCOMM1 添加控制变量:m_ctrlComm,这时你可以看一看,在对话框头文件中自动 加入了//{{AFX_INCLUDES() #include "mscomm.h" //}}AFX_INCLUDES (这时运行程序,如果有错,那就再从头开始)。 4.在对话框中添加控件向主对话框中添加两个编辑框,一个用于接收显 示数据ID为IDC_EDIT_RXDATA,另一个用于输入发送数据,ID为 IDC_EDIT_TXDATA,再添加一个按钮,功能是按一次就把发送编辑框中的内 容发送一次,将其ID设为IDC_BUTTON_MANUALSEND。别忘记了将接收编辑 框的Properties->Styles中把Miltiline和Vertical Scroll属性选上,发送编辑框若你想输入多行文字,也可选上Miltiline。 再打开ClassWizard->Member Viariables选项卡,选择CSCommTestDlg类,为IDC_EDIT_RXDATA 添加CString变量m_strRXData,为IDC_EDIT_TXDATA添加CString变量m_strTXData。说明: m_strRXData和m_strTXData分别用来放入接收和发送的字符数据。 5.添加串口事件消息处理函数OnComm()打开ClassWizard->Message Maps,选择类CSCommTestDlg,选择IDC_MSCOMM1,双击消息OnComm,将弹出的对话框中将函数名改为OnComm,(好记而已)OK。 这个函数是用来处理串口消息事件的,如每当串口接收到数据,就会产生一个串口接收数据缓冲区中有字符的消息事件,我们刚才添加的函数就会执行,我们在OnComm()函数加入相应的处理代码就能实现自已想要的功能了。请你在函数中加入如下代码: void CSCommTestDlg::OnComm() { // TODO: Add your control notification handler code here VARIANT variant_inp; COleSafeArray safearray_inp; LONG len,k; BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed. CString strtemp; if(m_ctrlComm.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符 { ////////以下你可以根据自己的通信协议加入处理代码 variant_inp=m_ctrlComm.GetInput(); //读缓冲区 safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量 len=safearray_inp.GetOneDimSize(); //得到有效数据长度 for(k=0;k

VC6.0MFC串口通信编写全过程(DOC)

其于MFC 的串口调试助手编辑过程 一、新建 打开 VC6.0 文件 新建 工程 MFC AppWiard(exe) 位置(选择保存工程位置) 工程名称(输入工程名XXXX ) 确定 选择基本对话框 下一步 下一步 下一步 选择(CXXXXDlg ) 完成 确定 在生成的基本对话框内将不需要按钮及提示框(自动生成的“确定”“取消” 及提示框)删除或修改使用,至此基本框架完成如下图: 二、往生成的基本框架中添加控件 1、因为控件列表框内没有串口通信用到的通信控件,所以要先添加到控件列表框内再将控件添加到基本框内使用,步骤如下: 菜单栏 工程 添加到工程 Components and controls … Registered ActiveX Controls 选择“Microsoft Communications Control, version 6.0” Insert 确定 OK 关闭此子窗口完成添加操作标志如上图所示。 2、将刚才添加添加到控件列表框内的串口控件添加到基本框架内 点击控件列表框内的串口控件,此时光标变为“十”形,在基本框架内随意划取一矩 形区域,即可以添加串口控件,不需要修改此控件的大小及位置,因为程编译运行后此控件是看不到的,步骤结果如下图:

3、继续往基本框架内添加用于编辑发送数据的输入编辑框及输出编辑框,同理选择控件列表框内的“编辑框控件”,以相同的操作即可添加两个编辑窗口及一个按纽控件如下图所示: 这两个窗口需要修改大小及位置,因为程序运行后将会显示而串口通信控件则不显示,上图是运行后的效果。 4、对以上四个控件编程步骤如下: a 、右击串口通信控件 建立类向导 Member variables Control IDS 中选择IDC_MSCOMM1 add variable … Member variable name 中输入控件变量名m_ctrlComm (变量名可以随意选取,但程序中应与所取变量名一致) OK 确定

VC++_串口上位机编程实例

VC++串口上位机简单例程(源码及详细步骤) (4.33MB) VC++编写简单串口上位机程序 2010年4月13日10:23:40 串口通信,MCU跟PC通信经常用到的一种通信方式,做界面、写上位机程序的编程语言、编译环境等不少,VB、C#、LABVIEW等等,我会的语言很少,C语言用得比较多,但是还没有找到如何用C语言来写串口通信上位机程序的资料,在图书管理找到了用VC++编写串口上位机的资料,参考书籍,用自己相当蹩脚的C++写出了一个简单的串口上位机程序,分享一下,体验一下单片机和PC通信的乐趣。 编译环境:VC++6.0 操作系统:VMWare虚拟出来的Windows XP 程序实现功能: 1、PC初始化COM1口,使用n81方式,波特率57600与单片机通信。PC的COM口编号可以通过如下方式修改: 当然也可以通过上位机软件编写,通过按钮来选择COM端口号,但是此次仅仅是简单的例程,就没有弄那么复杂了。COM1口可用的话,会提示串口初始化完毕。否则会提示串口已经打开Port already open,表示串口已经打开,被占用了。 2、点击开始转换,串口会向单片机发送0xaa,单片机串口中断接收到0xaa后启动ADC转

换一次,并把转换结果ADCL、ADCH共两个字节的结果发送至PC,PC进行数值转换后在窗口里显示。(见文章末尾图) 3、为防止串口被一只占用,点击关闭串口可以关闭COM1,供其它程序使用,点击后按钮变为打开串口,点击可重新打开COM1。 程序的编写: 1、打开VC++6.0建立基于对话框的MFC应用程序Test,

2、在项目中插入MSComm控件:工程->增加到工程->Components and Controls->双击Registered ActiveX Controls->选择Microsoft Communications Control,version6.0->Insert,按

(完整版)VC6.0MFC串口通信编写全过程

其于MFC的串口调试助手编辑过程 一、新建 打开VC6.0 文件新建工程MFC AppWiard(exe) 位置(选择保存工程位置)工程名称(输入工程名XXXX)确定选择基本对话框下一步下一步下一步选择(CXXXXDlg)完成确定在生成的基本对话框内将不需要按钮及提示框(自动生成的“确定”“取消”及提示框)删除或修改使用,至此基本框架完成如下图: 二、往生成的基本框架中添加控件 1、因为控件列表框内没有串口通信用到的通信控件,所以要先添加到控件列表框内再 将控件添加到基本框内使用,步骤如下: 菜单栏工程添加到工程Components and controls…Registered ActiveX Controls 选择“Microsoft Communications Control, version 6.0”Insert 确定OK 关闭此子窗口完成添加操作标志如上图所示。 2、将刚才添加添加到控件列表框内的串口控件添加到基本框架内 点击控件列表框内的串口控件,此时光标变为“十”形,在基本框架内随意划取一矩形区域,即可以添加串口控件,不需要修改此控件的大小及位置,因为程编译运行后此控件是看不到的,步骤结果如下图:此控件(标志)是下面步骤添加进来的串口控件 基本框架

3、继续往基本框架内添加用于编辑发送数据的输入编辑框及输出编辑框,同理选择控 件列表框内的“编辑框控件”,以相同的操作即可添加两个编辑窗口及一个按纽控件如 下图所示: 选择其中任 意一个作为 输入编辑框 及输出编辑 框 这两个窗口需要修改大小及位置,因为程序运行后将会显示而串口通信控件则不显示, 上图是运行后的效果。 4、对以上四个控件编程步骤如下: a、右击串口通信控件建立类向导Member variables Control IDS中选 择IDC_MSCOMM1 add variable…Member variable name中输入控件变量名 m_ctrlComm(变量名可以随意选取,但程序中应与所取变量名一致)OK 确 定

VCMSComm串口发送与接收上位机制做总结

VC++MSComm串口发送与接收上位机本设计用VC编写的一个简单的上位机软件,实现功能为:简单的串口数据发送与接收。 具体步骤如下: 一.建立应用程序工程“串口通信_韩季方01” 1.打开VC++6.0—》建立对话框MFC应用程序:串口通信_韩季方01—》 添加基本控件如图1.0。 图1.0 2.添加MSComm控件:Add To Project—》Components and Controls…打开如图1.1,双击“Registered ActiveX Contronls”项—》出现如图1.2—》选择“Microsoft Communications Control,version 6.0”控件—》点击“Insert”—》提示“…”确认即可—》弹出图1.3—》点击“OK”—》再点击“Close”。 下一步,将对话框资源控件中的电话状控件托到对话框中即可,如图1.4。

图1.1 图1.2

图1.3 图1.4 3.编辑控件及其属性设置:如表1.0

4.添加变量及其类型方法如图1.5 图1.5 二.初始化串口:设置MSComm控件属性 打开Class Wizard—》Member Variables—》选IDC_MSCOMM1—》点击“Add Varialbe…”—》添加变量m_ctrlComm。如图1.5。 之后,在工作空间打开文件如图2.0—》在函数OnInitDialog中添加代码如图2.1。

图2.0

图2.1 三.添加串口事件消息处理函数OnComm() 打开Class Wizard—》Member Maps—》Class Name中选择C_01Dlg—》在Object Ids中选择IDC_MSCOMM1—》在Message中选中OnComm—》单击“Add Function”按钮—》将函数名改为OnComm(好记而已)—》单击OK,完成后如图3.0 同理在函数OnComm()中添加代码如图3.1

如何用VC++实现串口通信

用VC 6.0实现串行通信的三种方法 中国科学院王颖 ---- 摘要:本文介绍了在Windows平台下串行通信的实现机制,讨论了根据不同的条件用Visual C++ 设计串行通信程序的三种方法,并结合实际,实现对温度数据的接收监控。 ---- 在实验室和工业应用中,串口是常用的计算机与外部串行设备之间的数据传输通道,由于串行通信方便易行,所以应用广泛。依据不同的条件实现对串口的灵活编程控制是我们所需要的。 ---- 在光学镜片镀膜工艺中,用单片机进行多路温度数据采集控制,采集结果以串行方式进入主机,每隔10S向主机发送一次采样数据,主机向单片机发送相关的控制命令,实现串行数据接收,处理,记录,显示,实时绘制曲线。串行通信程序开发环境为VC++ 6.0。 ---- Windows下串行通信 ---- 与以往DOS下串行通信程序不同的是,Windows不提倡应用程序直接控制硬件,而是通过Windows 操作系统提供的设备驱动程序来进行数据传递。串行口在Win 32中是作为文件来进行处理的,而不是直接对端口进行操作,对于串行通信,Win 32 提供了相应的文件I/O函数与通信函数,通过了解这些函数的使用,可以编制出符合不同需要的通信程序。与通信设备相关的结构有COMMCONFIG ,COMMPROP,COMMTIMEOUTS,COMSTAT,DCB,MODEMDEVCAPS,MODEMSETTINGS共7个,与通信有关的Windows API函数共有26个,详细说明可参考MSDN帮助文件。以下将结合实例,给出实现串行通信的三种方法。 ---- 实现串行通信的三种方法 ---- 方法一:使用VC++提供的串行通信控件MSComm 首先,在对话框中创建通信控件,若Control 工具栏中缺少该控件,可通过菜单Project --> Add to Project --> Components and Control插入即可,再将该控件从工具箱中拉到对话框中。此时,你只需要关心控件提供的对Windows 通讯驱动程序的API 函数的接口。换句话说,只需要设置和监视MSComm控件的属性和事件。 ---- 在ClassWizard中为新创建的通信控件定义成员对象(CMSComm m_Serial),通过该对象便可以对串口属性进行设置,MSComm 控件共有27个属性,这里只介绍其中几个常用属性: ---- CommPort 设置并返回通讯端口号,缺省为COM1。 ---- Settings 以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位。 ---- PortOpen 设置并返回通讯端口的状态,也可以打开和关闭端口。 ---- Input 从接收缓冲区返回和删除字符。 ---- Output 向发送缓冲区写一个字符串。 ---- InputLen 设置每次Input读入的字符个数,缺省值为0,表明读取接收缓冲区中的全部内

VC串口通信实例 MSComm

VC串口通信实例 MSComm 计算机与外界的信息交换称为通信。基本的通信方式有并行通信和串行通信两种。串行通信是指一条信息额各位数据被逐位按顺序传送的通信方式。随着计算机技术的发展和推广,利用串口进行数据通讯在通讯领域中占有着重要的地位。串行通信的特点是:数据位传送,按位顺序进行,最少只需要一根传输线即可完成,成本低但传送速度慢。串行通信的距离可以从几米到几千米。利用串口进行数据通讯在通讯领域中占有着重要的地位,串口通讯在通讯软件中有着十分广泛的应用。如电话、传真、视频和各种控制等。串口通讯目前流行的方法大概有三种:一是利用Microsoft提供的CMSCOMM控件进行通讯,不过现在很多程序员都觉应该放弃这种方式。二是利用WINAPI函数进行编程,这种编程的难度高,要求掌握很多的API 函数。三是利用现在网络上面提供的一些串口通讯控件进行编写。这三种方法都没有同Windows服务联系起来。 串行接口输入输出过程描述 串行接口包括4个主要寄存器,即控制寄存器、状态寄存器、数据输入寄存器及数据输出寄存器。控制寄存器用来接收CPU送给此接口的各种控制信息,而控制信息决定接口的工作方式。状态寄存器的各位叫状态位,每一个状态位都可以用来指示传输过程中的某一种错误或当前传输状态。数据输入寄存器总是和串行输入/并行输出移位寄存器配对使用的。在输入过程中,数据一位一位从外部设备进入接口的寄存器,当接收完一个数据后,数据就从移位寄存器送到输入寄存器,再等待CPU来取走。输出的情况与输入过程类似,在输出过程中,数据输出寄存器与并行输入/串行输出移位寄存器配对使用。当CPU往数据输出寄存器中输出一个数据后,数据便传输到移位寄存器,然后一位一位地通过输出线送到外设。串行通信数据的收发方式分为异步通信方式与同步通信方式。

MFC串口通信编程详解解析

MFC串口通信编程介绍 主要介绍了用CreateFile(函数和WriteFile(函数读写串口的实例,以及设置串口属性的实例. 在工业控制中,工控机(一般都基于Windows平台经常需要与智能仪表通过串口 进行通信.串口通信方便易行,应用广泛. 一般情况下,工控机和各智能仪表通过RS485总线进行通信.RS485的通信方式是半双工的,只能由作为主节点的工控PC机依次轮询网络上的各智能控制单元子节点.每次通信都是由PC机通过串口向智能控制单元发布命令,智能控制单元在接收到正确的命令后作出应答. 在Win32下,可以使用两种编程方式实现串口通信,其一是使用ActiveX控件,这种方法程序简单,但欠灵活.其二是调用Windows的API函数,这种方法可以清楚地掌握串口通信的机制,并且自由灵活.下面只介绍API串口通信部分. 串口的操作可以有两种操作方式:同步操作方式和重叠操作方式(又称为异步操作方式.同步操作时,API函数会阻塞直到操作完成以后才能返回(在多线程方式中, 虽然不会阻塞主线程,但是仍然会阻塞监听线程;而重叠操作方式,API函数会立即返回,操作在后台进行,避免线程的阻塞. 无论哪种操作方式,一般都通过四个步骤来完成: (1打开串口 (2配置串口 (3读写串口 (4关闭串口

一打开串口 Win32系统把文件的概念进行了扩展.无论是文件、通信设备、命名管道、邮件槽、磁盘、还是控制台,都是用API函数CreateFile来打开或创建的.该函数的原型为: 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:创建标志,对串口操作该参数必须置为 OPEN_EXISTING; ?dwFlagsAndAttributes:属性描述,用于指定该串口是否进行异步操作,该值为FILE_FLAG_OVERLAPPED,表示使用异步的I/O;该值为0,表示同步I/O操 作;

VC++串口通信编程

在工业控制中,工控机(一般都基于Windows平台)经常需要与智能仪表通过串口进行通信。串口通信方便易行,应用广泛。 一般情况下,工控机和各智能仪表通过RS485总线进行通信。RS485的通信方式是半双工的,只能由作为主节点的工控PC机依次轮询网络上的各智能控制单元子节点。每次通信都是由PC机通过串口向智能控制单元发布命令,智能控制单元在接收到正确的命令后作出应答。 在Win32下,可以使用两种编程方式实现串口通信,其一是使用ActiveX 控件,这种方法程序简单,但欠灵活。其二是调用Windows的API函数,这种方法可以清楚地掌握串口通信的机制,并且自由灵活。本文我们只介绍API串口通信部分。 串口的操作可以有两种操作方式:同步操作方式和重叠操作方式(又称为异步操作方式)。同步操作时,API函数会阻塞直到操作完成以后才能返回(在多线程方式中,虽然不会阻塞主线程,但是仍然会阻塞监听线程);而重叠操作方式,API函数会立即返回,操作在后台进行,避免线程的阻塞。 无论那种操作方式,一般都通过四个步骤来完成: (1)打开串口 (2)配置串口 (3)读写串口 (4)关闭串口 (1)打开串口 Win32系统把文件的概念进行了扩展。无论是文件、通信设备、命名管道、邮件槽、磁盘、还是控制台,都是用API函数CreateFile来打开或创建的。该函数的原型为: 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:创建标志,对串口操作该参数必须置为OPEN_EXISTING; ?dwFlagsAndAttributes:属性描述,用于指定该串口是否进行异步操作,该值为FILE_FLAG_OVERLAPPED,表示使用异步的I/O;该值为0,表示同 步I/O操作; ?hTemplateFile:对串口而言该参数必须置为NULL;

VC串口编程API详解

V C串口编程A P I详解集团企业公司编码:(LL3698-KKI1269-TM2483-LUI12689-ITT289-

V C++串口编程主要A P I详解该文档是本人在刚刚接触到VC++下的串口编程时,总结归纳的一些主要的API函数,可以帮助初学者更好的理解串口编程的方法。 1.打开串口 HANDLECreateFile(LPCTSTRlpFileName, DWORDdwDesiredAccess, DWORDdwShareMode, LPSECURITY_ATTRIBUTESlpSecurityAttributes, DWORDdwCreationDistribution, DWORDdwFlagsAndAttributes, HANDLEhTemplateFile); 参数: lpFileName:将要打开的串口逻辑名,如“COM1”;dwDesiredAccess:指定串口访问的类型,可以是读取、写入或二者并列; dwShareMode:指定共享属性,由于串口不能共享,该参数必须置为0;lpSecurityAttributes:引用安全性属性结构,缺省值为NULL;

dwCreationDistribution:创建标志,对串口操作该参数必须置为OPEN_EXISTING; dwFlagsAndAttributes:属性描述,用于指定该串口是否进行异步操作,该值为FILE_FLAG_OVERLAPPED,表示使用异步的I/O;该值为0,表示同步I/O操作,本工程采用异步方式; hTemplateFile:对串口而言该参数必须置为NULL; 2.获取串口设备控制块DCB BOOLGetCommState( HANDLEhFile, //标识通讯端口的句柄,由CreateFile()函数返回的句柄 LPDCBlpDCB //指向一个设备控制块(DCB结构)的指针 ); 3.设置串口设备控制块DCB BOOLSetCommState( HANDLEhFile,//标识通讯端口的句柄,由CreateFile()函数返回的句柄LPDCBlpDCB//指向一个设备控制块(DCB结构)的指针 ); 4.设置串口输入输出缓冲区大小 BOOLSetupComm( HANDLEhFile, //通信设备的句柄DWORDdwInQueue, //输入缓冲区的大小(字节数)DWORDdwOutQueue //输出缓冲区的大小(字节数)

用MFC实现串口编程

用MFC实现串口编程 龚建伟评论:本文既写了在Windows中怎样用VC控件MSComm,又说明了API技术编程方法,在写用MSComm控件时,数据类型的转换说得不是太明白,初次涉猎串口编程的朋友恐怕看了还是编不出来;直接从底层编写的部分值得一读,说得较为详细,但你得先从VC教本上看一看什么是线程。 一.串行通信的基本原理 二.串口信号线的接法 三.16位串口应用程序的简单回顾 四.在MFC下的32位串口应用程序 ㈠使用ActiveX控件 ㈡使用32位的API 通信函数 本文详细介绍了串行通信的基本原理,以及在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)下,串口是系统资源的一部分。 应用程序要使用串口进行通信,必须在使用之前向操作系统提出资源申请要求(打开串口),通信完成后必须释放资源(关闭串口)。

串口通信vc实例

Vc 程序串口通信实例 #include "stdafx.h" #include"resource.h" #include"stdio.h" #include #include"malloc.h" #include #include #include"MAPIGUID.H" HINSTANCE g_hInstance = 0; HWND hwnd=0; HANDLE hCom=0; double W=0,H=0; int Tnum=0,Pnum=0,Anum=0,Jt=0,Mnum=0; int OnTimer(HWND hWnd); unsigned char buf[8]={0}; void Oncreate(HWND hWnd,WPARAM wParam){ char sztext[10]={0}; CreateWindowEx(0,"STATIC","#108",SS_ICON|WS_CHILD|WS_VISIBLE,30*W,5*H,20, 20,hWnd,(HMENU)1137,g_hInstance,NULL); HWND butt=CreateWindowEx(0,"Button","确定发送",WS_CHILD|WS_VISIBLE,1250*W,1*H,100*W,40*H,hWnd,(HMENU)1003,g_hInstance,NU LL); HWND sim=CreateWindowEx(WS_EX_CLIENTEDGE,"COMBOBOX","Simple",WS_CHILD|CBS_DR OPDOWN|WS_VISIBLE|WS_BORDER|ES_AUTOHSCROLL|ES_MULTILINE|ES_AUTOVS CROLL|WS_VSCROLL,280*W,100*H,200*W,200,hWnd,(HMENU)1001,g_hInstance,NULL); HWND dro=CreateWindowEx(0,"COMBOBOX","DropDown",WS_CHILD|WS_VISIBLE|CBS_DROP DOWN|WS_VSCROLL,870*W,100*H,200*W,200,hWnd,(HMENU)1002,g_hInstance,NULL); HWND sim1=CreateWindowEx(WS_EX_CLIENTEDGE,"COMBOBOX","Simple",WS_CHILD|CBS_D

基于VC++串口通信的设计及实现

课程论文首页

基于VC++串口通信的设计与实现 陈建福 中文摘要:随着现代信息技术的发展以及计算机网络的广泛应用,计算机通信技术已经日趋成熟,串口通信作为一种灵活、方便、可靠的通信方式,被广泛应用于工业控制中,用PC机对工程实现实时监控,通常要求PC机能在用户界面上具有数据采集、数据处理以及控制信号的产生与传输等功能。同时串行通信还应用于交通控制、分布数据采集系统、通信距离扩展、电力系统数据采集与控制系统、高速公路收费系统、远程控制、保密通信系统和教学实验等等。在实践中,使用Visual C++串口控件MSComm实现通信的方法比调用API动态链接库的方法更加方便、快捷,而且用较少的代码可以实现相同的功能,从而大大提高了编程效率,也减少了因编程不当而导致的系统不稳定。 采用C++的MFC思路的方法较为繁琐,不仅要了解Win32串行通信的API函数,还要掌握多线程编程,但控制灵活,既涉及到底层编程、纠错能力强,又有C++风格,一般多为专业C++开发人员所采用。 关键词:串行通信单线程多线程 c++ 1.引言 串口通信在工业中应用十分广泛。现在尽管有很多速度更快、效率更高的端口(如USB接口)的出现,但是这些新的端口可以通过转换电路实现与传统串口通信的转换,从而灵活的满足工业生产多方面的需求。因此串口通信的未来会更加美好。 在本论文中,讨论了使用VC++的开发环境实现两台PC机间的串口通信。就是通过一个MSComm 控件,用一个串口线将两台机子间的串口连接起来,从而建立物理连接进行字符仿真终端的测试。而使用WinAPI进行串口通信不像使用MSComm控件那么容易,需要设置多个参数。 2.串行接口 串行接口一般包括RS232/422/485,其技术简单成熟,性能可靠,价格低廉,所要求的软硬件环境或条件都很低,广泛应用于计算机及相关领域,遍及调制解调器(Modem)、串行打印机、各种监控模块、PLC、摄像头云台、数控机床、单片机及相关智能设备,甚至路由器也不例外(通过串口设置参数)。 2.11 串口通信的基本概念 终端与其他设备(例如,其他终端、计算机和外部设备)通过数据传输进行通信。数据传输可以通过两种方式进行,即并行通信和串行通信。 (1)并行通信。 在计算机和终端之间的数据传输通常是靠电缆或信道上的电流或电压变化实现的。如果一组数据的各数据位在多条线上同时被传送,这种传输方式称为并行通信 (2)串行通信。

VC实现串口通信例程

VC实现串口通信例程 作者:阮帮秋(2001.4) 摘要:WIN95界面下的VC++串口通讯程序在WIN32下是不建议对端口进行操作的,在WIN32中所有的设备都被看成是文件,串行口也不例外也是作为文件来进行处理的。 关键词串行口,DWORD,缓冲区 WIN95界面下的VC++串口通讯程序在WIN32下是不建议对端口进行操作的,在WIN32中所有的设备都被看成是文件,串行口也不例外也是作为文件来进行处理的。这是我的一份关于串口编程的读书笔记,对于使用VC进行编程的同行应该有一定的帮助。 1.打开串口: 在Window 95下串行口作为文件处理,使用文件操作对串行口进行处理。使用CreateFile()打开串口,CreateFile()将返回串口的句柄。 HANDLE CreateFile( LPCTSTR lpFileName, // pointer to name of the file DWORD dwDesiredAccess, // access (read-write) mode DWORD dwShareMode, // share mode LPSECURITY_ATTRIBUTES lpSecurityAttributes, // pointer to security attributes DWORD dwCreationDistribution, // how to create DWORD dwFlagsAndAttributes, // file attributes HANDLE hTemplateFile // handle to file with attributes to copy ); lpFileName: 指明串口制备,例:COM1,COM2 dwDesiredAccess: 指明串口存取方式,例:GENERIC_READ|GENERIC_WRITE dwShareMode: 指明串口共享方式 lpSecurityAttributes: 指明串口的安全属性结构,NULL为缺省安全属性 dwCreateionDistribution: 必须为OPEN_EXISTIN dwFlagAndAttributes: 对串口唯一有意义的是FILE_FLAG_OVERLAPPED hTemplateFile: 必须为NULL 2.关闭串口: CloseHandle(hCommDev); 3.设置缓冲区长度: BOOL SetupComm( HANDLE hFile, // handle of communications device

VS2010之MFC串口通信的编写教程66623

VS2010之MFC串口通信教程 说明:本人也是刚刚入门MFC,参照一些资料和源代码就实验做了这么一个串口通信工具!资料来源主要有鸡啄米博客网站,里面有详细的学习教程!网上的VS2010源代码都比较少,建议大家先理解一个源代码的构架和结构再深入学习!本文档可以一步一步教你从建立工程到实验调试,是一个非常完整的教程!非常适合新手练习! ——贺州学院大学生创新基地实验室 在制作串口通信所遇到的问题:编辑框的滚动条不会随着数据的更新保持在最后一行! 接下来我们开始讲解MFC串口通信的制作: 一、打开VS2010软件,然后新建一个项目,如下图所示; 我们要用到就是对话框模块,所以选择如下图所示 最大化框最好别选,因为本人现在也没搞出来; 点击完成就新建好一个工程了,等资源就绪之后我们就可以进行制作了; 我们可以看到就绪之后的界面如下图所示,按照步骤把原来的静态文本框和确定按钮、取消按钮删掉; 二、为我们的对话框添加控件 添加两个组合边框,并放置好位置; 修改组合边框显示的名称; 在组合边框里面添加编辑文本框; 在这一步一定要小心选择右边的属性; 这一步是把串口控件添加到对话框中来; 选择我们需要的串口控件如下图所示; 三、为编辑框,Combox框,串口控件添加变量; 四、为按钮和串口控件添加程序函数 void C串口V2Dlg::OnBnClickedButtonOpen()//打开串口按钮程序 { // TODO: 在此添加控件通知处理程序代码? CString str,str1,n; //定义字符串 GetDlgItemText(IDC_BUTTON_OPEN,str); CWnd *h1; h1=GetDlgItem(IDC_BUTTON_OPEN); //指向控件的caption if(!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)); //选择串口

基于VC++ 6.0的串口通信实验报告

网络与通信实验报告 题目:串口通行实验班级:0309103 学号:030910338 姓名:田静 指导老师:付大丰 日期:2012-10-21

一、实验要求 把两台计算机的串口通过串口线连在一起,通过串口实现两台计算机通讯。可以利用高级语言、C语言编程实现,要求程序界面友好,有发送和接收功能,其接收和发送内容可在屏幕上显示。 二、实验原理 串口通讯把数据的字节分解成单个的二进制比特流依次传输,其结构简单, 连接线少,应用非常广泛。实现串口通信的方法很多。如:利用标准通信函数实现串口通信、利用API实现串口通信和利用ActiveX控件实现。 本文主要采用ActiveX控件Microsoft CommunicationsControl(MSComm)编程,Windows平台先进的ActiveX技术使得对串口编程不再需要处理烦琐的细节。利用已有的AxtiveX控件,只需要编写少量的代码,就可以轻松高效地完成任务。 以下对ActiveX控件属性进行简单介绍,在ClassWizard中为新创建的通信控件定义成员对象(CMSComm m_comm),通过该对象便可以对串口属性进行设置,MSComm控件共有27个属性,这里只介绍其中几个常用属性: CommPort:设置并回通讯端口号,缺省为COMl。 Settings:以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位。 PortOpen:设置并返回通讯端口的状态,也可以打开和关闭端口。 Input:从接收缓冲区返回和删除字符。 Output:向发送缓冲区写一个字符串。 InputLen:设置每次Input读入的字符个数,缺省值为0,表明读取接收缓冲区中的全部内容。 InBufferCount:返回接收缓冲区中已接收到的字符数,将其置0可以清除接收缓冲区。 InputMode:定义Input属性获取数据的方式(为0:文本方式;为1:二进制方式)。 RThreshold和SThreshold:表示在OnComm事件发生之前,接收缓冲区或发送缓冲区中可以接收的字符数。 三、实验步骤 1、建立应用工程 启动VC++6.0,创建一个基于对话框的MFC应用程序项目,选择Project菜单下Add to Project子菜单中的Components and Controls选项,在弹出的对话框中双击Registered ActiveX Controls项,则所有注册过的ActiveX控件出现在列表框中。选择Microsoft Communications Con—trol version 6.0,单击insert 按钮即可将通信控件插入该工程。添加该控件到对话框中,设置控件ID号为IDC _MSCOMM. 2、添加界面控件 将对话框中的按钮“取消”删除,将“确定”按钮改为“退出”。在对话框中添加适当的界面控件。本实验中需添加的标注用的静态控件、用于选择串口和设置波特率的组合框分别设置控件ID号为IDC_COMBO_SELECT和IDC _COMBO_BTL SET、添加控制开始发送/接收按钮控件并设置控件ID号为IDC_BUTTON_START,添加用于输入发送数据和输出接收数据的编辑框并设置控件ID号为IDC_EDIT_SEND

用VC++写上位机软件实现与单片机通信

用VC++写上位机软件实现单片机串口通讯 2007年05月30日星期三 23:40 工业控制领域(如DCS系统),经常涉及到串行通信问题。为了实现微机和单片机之间的数据交换,人们用各种不同方法实现串行通信,如DOS下采用汇编语言或C语言,但在Windows 环境下却存在一些困难和不足。在Windows操作系统已经占据统治地位的情况下(何况有些系统根本不支持DOS如Windows2000)开发Windows 环境下串行通信技术就显得日益重要。VC++6.0是微软公司于1998年推出的一种开发环境,以其强大的功能,友好的界面,32位面向对象的程序设计及Active X的灵活性而受广大软件开发者的青睐,被广泛应用于各个领域。应用VC++开发串行通信目前通常有如下几种方法:一是利用Windows API通信函数;二是利用VC的标准通信函数inp、inpw、inpd、outp、outpw、outpd等直接对串口进行操作;三是使用Microsoft Visual C++的通信控件(MSComm);四是利用第三方编写的通信类。以上几种方法中第一种使用面较广,但由于比较复杂,专业化程度较高,使用较困难;第二种需要了解硬件电路结构原理;第三种方法看来较简单,只需要对串口进行简单配置,但是由于使用令人费解的VARIANT 类,使用也不是很容易;第四种方法是利用一种用于串行通信的CSerial类(这种类是由第三方提供),只要理解这种类的几个成员函数,就能方便的使用。笔者利用CSerial类很方便地实现了在固定式EBM气溶胶灭火系统分区启动器(单片机系统)与上位机的通信。以下将结合实例, 给出实现串行通信的几种方法。 1 Windows API通信函数方法 与通信有关的Windows API函数共有26个,但主要有关的有: CreateFile() 用“comn”(n为串口号)作为文件名就可以打开串口。 ReadFile() 读串口。 WriteFile() 写串口。 CloseHandle() 关闭串口句柄。 初始化时应注意CreateFile()函数中串口共享方式应设为0,串口为不可共享设备,其它与一般文件读写类似。以下给出API实现的源代码。 1.1 发送的例程 //声明全局变量 HANDLE m_hIDComDev; OVERLAPPED m_OverlappedRead, m_Over lappedWrite; //初始化串口 void CSerialAPIView::OnInitialUpdate() { CView::OnInitialUpdate(); Char szComParams[50]; DCB dcb; Memset(&m_OverlappedRead, 0, sizeof (OVERLAPPED)); Memset(&m_OverlappedWrite, 0, sizeof (OVERLAPPED)); m_hIDComDev = NULL; m_hIDComDev = CreateFile(“COM2”,GENERIC_READ│GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORM AL│FILE_FLAG_OVERLAPPED, NULL); if (m_hIDComDev == NULL) {

相关文档
相关文档 最新文档