`

(二) 串口通信的一般步骤

阅读更多
2.1打开串口

在32位Windows中,串口和其他通信设备(如磁盘等)都被作为文件进行处理,在使用前必须先将其打开,为保证串口通信数据传输的可靠性,串口一般以非共享模式打开,也就是在被串口打开后,其他程序不能在去打开此设备。

2.2配置串口

在使用串口进行数据通信前必须对其进行正确的配置,串口需要配置的主要参数有波特率、数据位、停止位、奇偶校验、收发数据缓冲区大小。除此之外还要对串口进行超时设置,以防止在串口通信时数据传输突然中断而导致读写操作进入无限期等待的状态,设置了超时,如果在指定时间内没有完成所进行的操作,则此操作被自动放弃。

2.3读写串口

在串口被打开并设置好后,就可以使用串口进行读写数据了,读写数据可以采用同步、异步及事件驱动等多种方式。

2.4关闭串口

在使用完串口后应该将其关闭,如果没有关闭,该串口会处于打开状态,其他的应用程序便无法打开使用该串口。

3利用API函数实现串口通信

3.1打开串口

Win32系统把文件的概念进行了扩展。无论是文件、通信设备、命名管道、邮件槽、磁盘、还是控制台,都是用API函数CreateFile来打开或创建的。该函数的原型为:

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;

3.2配置串口

在打开通讯设备句柄后,常常需要对串口进行一些初始化配置工作。这需要通过一个DCB结构来进行。DCB结构包含了诸如波特率、数据位数、奇偶校验和停止位数等信息。在查询或配置串口的属性时,都要用DCB结构来作为缓冲区。在打开串口后,可以调用GetCommState函数来获取串口的默认配置,该函数获取一个DCB结构体,只要在该结构内对应该先修改DCB结构,然后再调用SetCommState函数以修改后的DCB结构设置串口。DCB主要有以下几个重要的成员:

BYTEByteSize;//通信字节位数

BYTEParity;//指定奇偶校验方法。此成员可以有下列值:

//EVENPARITY偶校验NOPARITY无校验

//MARKPARITY标记校验ODDPARITY奇校验

BYTEStopBits;//指定停止位的位数。此成员可以有下列值:

//ONESTOPBIT1位停止位

//TWOSTOPBITS2位停止位

//ONE5STOPBITS1.5位停止位

除了使用BCD设置串口的一些基本参数外,一般还需要设置串口收发数据缓冲区的大小和超时,超时的作用是在指定的时间内没有读入或发送指定数量的字符,读写操作仍然会结束。Windows用I/O缓冲区来暂存串口输入和输出的数据,如果通信的速率较高,则应该设置较大的缓冲区。我们可以使用API函数SetupComm设置串口的输入和输出缓冲区的大小,其原型如下:

BOOLSetupComm(

HANDLEhFile,//串口句柄

DWORDdwInQueue,//输入缓冲区的大小(字节数)

DWORDdwOutQueue);//输出缓冲区的大小(字节数)

关于读写串口的超时设置,windows给我们提供一个专门的结构体COMMTIMEOUTS,其定义如下:

typedefstruct_COMMTIMEOUTS{

DWORDReadIntervalTimeout;//读间隔超时

DWORDReadTotalTimeoutMultiplier;//读时间系数

DWORDReadTotalTimeoutConstant;//读时间常量

DWORDWriteTotalTimeoutMultiplier;//写时间系数

DWORDWriteTotalTimeoutConstant;//写时间常量

}COMMTIMEOUTS,*LPCOMMTIMEOUTS;

COMMTIMEOUTS结构的成员都以毫秒为单位。总超时的计算公式是:

总超时=时间系数×要求读/写的字符数+时间常量

例如,要读入10个字符,那么读操作的总超时的计算公式为:

读总超时=ReadTotalTimeoutMultiplier×10+ReadTotalTimeoutConstant

通过该结构体windowsAPI为我们提供两个函数:GetCommTimeouts和SetCommTimeouts,前者获取当前的超时设置,后者使用修改后的COMMTIMEOUTS设置超时,与设置串口阐述类似。

在读写串口之前,还要用PurgeComm(…)函数清空缓冲区,该函数原型:

BOOLPurgeComm(

HANDLEhFile,//串口句柄

DWORDdwFlags);//需要完成的操作

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

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

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

PURGE_TXCLEAR清除输出缓冲区

PURGE_RXCLEAR清除输入缓冲区

3.3读写串口

读写串口使用ReadFile和WriteFile两个函数,其原型如下:

BOOLReadFile(

HANDLEhFile,//串口的句柄

LPVOIDlpBuffer,//保存读入数据的指针,

DWORDnNumberOfBytesToRead,//要读入的数据的字节数 内容来自plcclub.com

LPDWORDlpNumberOfBytesRead,//实际读入的字节数

LPOVERLAPPEDlpOverlapped);//OVERLAPPED,同步为NULL

BOOLWriteFile(

HANDLEhFile,//串口的句柄

LPCVOIDlpBuffer,//要写入数据的地址

DWORDnNumberOfBytesToWrite,//要写入数据的字节数

LPDWORDlpNumberOfBytesWritten,//实际写入的字节数

LPOVERLAPPEDlpOverlapped);//OVERLAPPED,同步为NULL

在进行同步操作时,读写函数要等到执行完才返回,而在异步操作时函数立即返回,但不保证读写操作完成,这时候就需要使用OVERLAPPED结构进行异步控制,该结构体有一个重要的成员hEvent,该成员是windows事件对象的句柄在控制线程同步及异步操作时常用到,如果是异步操作,我们可以使用CreateEvent(…)创建事件对象并将返回值赋给hEvent,然后使用WaitForSingleObject或GetOverlappedResult等待读写操作完成,进而达到控制异步操作的目的。

3.4关闭串口

在不使用串口的时候应该将其关闭,以释放windows的资源供其他程序使用,关闭串口只需调用CloseHandle(hComm/*串口句柄*/)即可。
分享到:
评论

相关推荐

    232串口通信调试步骤

    串口通信,通常指的是通过串行接口进行的数据传输方式,是一种简单而常见的设备间通信手段。在本文中,我们将深入探讨232串口通信的调试步骤,这对于理解和使用单片机或者其他支持串口通信的硬件设备至关重要。 ...

    接口通信课程设计——双机串口通信 汇编实现

    在本课程设计中,我们探讨的是“接口通信课程设计——双机串口通信 汇编实现”,这是一个涉及计算机硬件接口、通信协议以及低级编程技术的实践项目。通过使用汇编语言,我们可以深入理解底层通信机制,提高数据传输...

    在VS(VC)2010中使用MSComm控件实现串口通信的详细步骤[整理].pdf

    串口通信技术在VS2010中使用MSComm控件的实现步骤 串口通信是一种常用的数据交换方式,在各种设备和系统之间进行数据交换。使用MSComm控件可以简化串口通信的开发过程。本文将介绍如何在VS2010中使用MSComm控件实现...

    C++串口通信的例子(实现串口通信的类)

    在IT领域,串口通信是...总之,C++串口通信类为开发者提供了一种简洁、高效的接口,用于实现串口通信功能。通过理解串口通信的基本原理和类的使用,开发者可以快速地在各种项目中实现设备间的串行通信,提高开发效率。

    uart串口通信

    UART(通用异步收发传输器)是一种广泛用于设备间串行通信的接口标准,尤其在嵌入式系统中非常常见。UART通信依赖于一对数据线:TX(发送)和RX(接收),允许两个设备之间进行全双工通信,即同时进行发送和接收数据...

    MFC实现简单的串口通信

    串口通信,也称为串行通信,是计算机硬件和外部设备之间进行数据传输的一种常见方式。在MFC(Microsoft Foundation Classes)框架下实现串口通信,可以方便地创建与硬件设备交互的应用程序。MFC提供了一套类库,使得...

    两个单片机之间实现串口通信c语言开发

    在单片机应用中,常见的串口标准有UART(通用异步收发传输器)、USART(通用同步/异步收发传输器)和SPI(串行外围接口)等。 首先,我们需要了解C语言编程基础以及单片机的内部结构,特别是与其串口通信相关的...

    Java实现串口通信

    串行端口,或称为串口,是一种用于设备间通信的接口,它以串行方式传输数据,一次传输一位。在Java中,通常使用javax.comm包来处理串口通信,这个包提供了SerialPort类以及其他相关类和接口,允许开发者读写串口数据...

    Visual Basic 数据采集与串口通信测控应用实战(part1)

    5.2.5 mscomm控件通信步骤 151 5.3 应用api函数 152 5.3.1 动态链接库与api函数 152 5.3.2 vb与动态链接库 153 5.3.3 api函数声明 154 5.3.4 与串口通信有关的api函数 155 5.3.5 利用api函数实现...

    Android串口通信(Android Studio)

    在Android开发中,串口通信(Serial Port Communication)是一种重要的技术,它允许设备之间通过串行接口进行数据交换。在Android Studio环境下实现串口通信,开发者可以构建与硬件设备交互的应用,例如读取传感器...

    基于DSP的串口通信设计与实现毕业论文

    本论文将深入探讨如何在TMS320F2812 DSP芯片上利用其内置的同步串行通信接口(SCI)进行串口通信的设计与实现。 1.2 DSP发展简介 数字信号处理器是一种专门用于处理数字信号的微处理器,其主要特点是具有高速数学...

    VB实现串口通信

    在VB6.0环境下,串口通信是一种常用的技术,它使得设备之间可以通过串行接口进行数据交换。VB6.0提供了丰富的控件库,其中包括Serial Port控件,也就是我们所说的"串口控件",它使得开发人员可以方便地实现串口通信...

    凌阳61单片机的串口通信程序

    * 在本程序中,使用RS232串行接口协议来实现串口通信。 * RS232是一种常用的串行接口协议,广泛应用于计算机和外设之间的通信。 知识点7:单片机的I/O口配置 * 在本程序中,使用单片机的I/O口来配置串口通信的参数...

    visual c++串口通信技术详解

    在实际应用中,Visual C++串口通信技术详解可能包括了如何设置串口参数、调试通信问题、优化通信效率等方面的具体步骤和示例代码。通过深入学习和实践,开发者可以熟练掌握这一技术,实现与各类硬件设备的高效交互。

    MFC串口通信源码示例

    在学习这个示例时,开发者可以通过阅读代码了解如何在MFC应用中集成MSComm控件,理解串口通信的基本原理和步骤,同时,通过调试和修改代码,加深对串口通信实际操作的理解。这个源码示例对于初学者来说,是一份宝贵...

    串口通信安装程序下载

    3. USB转串口:现代计算机往往不再内置串口,因此需要通过USB转接器来模拟串行接口,以便与传统串口设备通信。 串口通信的软件配置: 在进行串口通信前,需要在计算机上安装相应的驱动程序和串口通信软件。"setup....

    c#(csharp)串口通信程序

    串口通信,也称为串行接口通信,是通过串行数据线逐位传输信息的方式。在C#中,我们可以使用System.IO.Ports命名空间提供的SerialPort类来实现串口通信功能。该类提供了打开、关闭串口,设置波特率、数据位、停止位...

    迪文屏串口通信.rar_串口屏_串口通信_迪文_迪文串口屏_迪文屏串口

    迪文串口屏的工作原理是,通过串行接口发送命令和数据,控制屏显内容。这些命令包括设置显示模式、颜色、字体,以及绘制图形等。数据通常以特定的帧格式发送,包括起始位、数据位、校验位和停止位。接收到的数据被...

    双机串口通信实验

    在双机串口通信中,两台设备通过各自的串行接口进行信息交换,常用于设备间的调试、监控或数据传输。 实验的核心是建立两个设备之间的通信链路。这通常需要以下几个步骤: 1. **硬件连接**:确保两台设备都有可用...

    基于Matlab GUI的串口通信编程

    在 Matlab 中,可以使用多种函数来实现串口通信,例如 fread 函数实现从串口读入二进制数据,fwrite 函数实现向串口写入二进制数据,fprintf 函数实现向串口写入文本数据等。同时,Matlab 也提供了多种函数来实现...

Global site tag (gtag.js) - Google Analytics