0%

串口操作

串口操作

[TOC]

CreateFile方式

函数说明

  1. 函数功能
    这个函数的功能是创建或者打开一个文件或者I/O设备,通常使用的I/O形式有文件、文件流、目录、物理磁盘、卷、终端流等。如执行成功,则返回文件句柄。 INVALID_HANDLE_VALUE 表示出错,会设置 GetLastError 。
    1. 函数原型
      1
      2
      3
      4
      5
      6
      7
      8
      9
      HANDLE CreateFile(
        LPCTSTR lpFileName, //指向文件名的指针
        DWORD dwDesiredAccess, //访问模式(写/读)
        DWORD dwShareMode, //共享模式
        LPSECURITY_ATTRIBUTES lpSecurityAttributes, //指向安全属性的指针
        DWORD dwCreationDisposition, //如何创建
        DWORD dwFlagsAndAttributes, //文件属性
        HANDLE hTemplateFile //用于复制文件句柄
        );
    2. 参数列表
参数 类型 作用
lpFileName String 要打开的文件的名字
dwDesiredAccess Long 表示允许对设备进行读访问;如果为 GENERIC_WRITE 表示允许对设备进行写访问(可组合使用);如果为零,表示只允许获取与一个设备有关的信息
dwShareMode Long 零表示不共享; FILE_SHARE_READ 和/或 FILE_SHARE_WRITE 表示允许对文件进行共享访问
LPSECURITY_ATTRIBUTES SECURITY_ATTRIBUTES 指向一个SECURITY_ATTRIBUTES结构的指针,定义了文件的安全特性(如果操作系统支持的话)
dwCreationDisposition Long 下述常数之一:
CREATE_NEW创建文件;如文件存在则会出错;
CREATE_ALWAYS创建文件,会改写前一个文件;
OPEN_EXISTING文件必须已经存在。由设备提出要求;
OPEN_ALWAYS如文件不存在则创建它;
TRUNCATE_EXISTING 将现有文件缩短为零长度
dwFlagsAndAttributes Long 一个或多个下述常数:
FILE_ATTRIBUTE_ARCHIVE标记归档属性;
FILE_ATTRIBUTE_COMPRESSED:将文件标记为已压缩,或者标记为文件在目录中的默认压缩方式;
FILE_ATTRIBUTE_NORMAL默认属性;
FILE_ATTRIBUTE_HIDDEN 隐藏文件或目录;
FILE_ATTRIBUTE_READONLY 文件为只读;
FILE_ATTRIBUTE_SYSTEM 文件为系统文件;
FILE_FLAG_WRITE_THROUGH操作系统不得推迟对文件的写操作;
FILE_FLAG_OVERLAPPED 允许对文件进行重叠操作;
FILE_FLAG_NO_BUFFERING 禁止对文件进行缓冲处理。文件只能写入磁盘卷的扇区块;
FILE_FLAG_RANDOM_ACCESS 针对随机访问对文件缓冲进行优化;
FILE_FLAG_SEQUENTIAL_SCAN 针对连续访问对文件缓冲进行优化;
FILE_FLAG_DELETE_ON_CLOSE; 关闭了上一次打开的句柄后,将文件删除。特别适合临时文件;
也可在Windows NT下组合使用下述常数标记:
SECURITY_ANONYMOUS, SECURITY_IDENTIFICATION, SECURITY_IMPERSONATION, SECURITY_DELEGATION, SECURITY_CONTEXT_TRACKING, SECURITY_EFFECTIVE_ONLY
hTemplateFile Long 如果不为零,则指定一个文件句柄。新文件将从这个文件中复制扩展属性
返回值
如执行成功,则返回文件句柄。
INVALID_HANDLE_VALUE表示出错,会设置GetLastError
即使函数成功,但若文件存在,且指定了CREATE_ALWAYS **或 OPEN_ALWAYS,GetLastError也会设为ERROR_ALREADY_EXISTS
  1. 配置
  • dwShareMode: 指定端口共享属性
    该参数是由那些应用程序共享的文件提供。对于串口来说,是不能共享的,因此,必须设置为0,这是通信设备与文件的特殊差别。
    如果当前的应用程序调用CreateFile打开一个串口,另外一个程序如果已经打开了该串口,此时CreateFile会返回一个错误代码。
    然而,同一个应用程序的多个线程是可以共享CreateFile返回的端口句柄。并且根据安全属性设置,该句柄可以打开端口的应用程序的子程序来继承。
  • lpSecurityAttributes:安全属性
    一般该参数为NULL,即该端口被设置为缺省的安全属性。缺省安全属性下,端口的句柄是不能继承的。
  • wCreationDisposition:指定此端口正在被其他程序占用采取的动作
    因为串口总是存在的,因此必须设置为OPEN_EXISTing, 该标志高速Windows不要创建新的端口。而是打开一个已经存在的端口。
  • dwFlagsAndSttributes:描述了端口的各种属性
    对于文件来说有很多属性,但是对于串口来说,唯一的意义是FILE_FLAG _OVERLAPPED 属性,当设置该属性时,端口IO可以在后台进行,称为异步IO重叠结构。
  • hTemplateFile: 指定模板的文件句柄
    对于串口来说,此参数必须设置为0;

    DCB结构体

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    typedef struct _DCB { 
    DWORD DCBlength;
    DWORD BaudRate;
    DWORD fBinary: 1;
    DWORD fParity: 1;
    DWORD fOutxCtsFlow:1;
    DWORD fOutxDsrFlow:1;
    DWORD fDtrControl:2;
    DWORD fDsrSensitivity:1;
    DWORD fTXContinueOnXoff:1;
    DWORD fOutX: 1;
    DWORD fInX: 1;
    DWORD fErrorChar: 1;
    DWORD fNull: 1;
    DWORD fRtsControl:2;
    DWORD fAbortOnError:1;
    DWORD fDummy2:17;
    WORD wReserved;
    WORD XonLim;
    WORD XoffLim;
    BYTE ByteSize;
    BYTE Parity;
    BYTE StopBits;
    char XonChar;
    char XoffChar;
    char ErrorChar;
    char EofChar;
    char EvtChar;
    WORD wReserved1;
    } DCB;
    成员 说明
    DCBlength DCB结构大小,即sizeof (DCB),在调用SetConmState来更新DCB前必须作设置

    BaudRate

    指定当前采用的波特率,应与所连接的通讯设备相匹配

    fBinary

    指定是否允许二进制模式。Win32 API不支持非二进制模式传输,应设置为true

    fParity

    指定奇偶校验是否允许,在为true时具体采用何种校验看Parity设置

    Parity

    指定端口数据传输的校验方法。以下是可取值及其意义:

    取值

    意义

    EVENPARITY

    偶校验(2)

    MARKPARITY

    标记校验,所发信息帧第9位恒为1 (3)

    N0PARITY

    无校验(0)

    ODDPARITY

    奇校验(1)

    StopBits

    指定端口当前使用的停止位数,可取值:

    取值

    意义

    0NEST0PBIT

    1停止位(0)

    0NE5ST0PBITS

    1.5停止位(1)

    TW0ST0PBITS

    2停止位(2)

    fErrorChar

    该值为TRUE,则用ErrorChar指定的字符代替奇偶校验错误的接收字符

    ErrorChar

    指定ErrorChar字符(代替接收到的奇偶校验发生错误时的字节)

    EvtChar

    当接收到此字符时,会产生一个EV_RXFLAG事件,如果用SetCommMask函数中指定了 EV_RXFLAG,则可用WaitCommEvent来监测该事件

    EofChar

    指定用于标示数据结束的字符

    fNull

    为TRUE时,接收时自动去掉空(0值)字节

    fAbortOnError

    读写操作发生错误时是否取消操作。若设置为true,则当发生读写错误时,将取消 所有读写操作(错误状态置为ERR0R_I0_AB0RTm)),直到调用ClearConmError函数 后才能重新进行通讯操作

    fOutxCtsFlow

    是否监控CTS(clear-to-send)信号来做输出流控。当设置为true时:

    若CTS为低电平,则数据发送将被挂起,直至CTS变为高。

    CTS的信号一般由DCE (通常是一个Modem)来控制,而DTE (通常是计算机)发送数 据时监测CTS信号。也就是说DCE通过把CTS置高来表明自己可以接收数据了

    fRtsControl

    设置 RTS (reciiiest-to-send)流控,若为 0 则缺省取值 RTS_CONTROL_HANDSHAKE。以 下是可取值及其意义:

    取值

    意义

    RTS_CONTROL_DISABLE

    打开设备时置RTS信号为低电平,应用程序可通过调用 EscapeCoranFunction函数来改变RTS线电平状态

    RTS_CONTROL_ENABLE

    打开设备时置RTS信号为高电平,应用程序可通过调用 EscapeCoranFunction函数来改变RTS线电平状态

    RTS_CONTROL_HANDSHAKE

    允许RTS信号握手,此时应用程序不能调用 EscapeCoranFunction函数。当输入缓冲区己经有足够空间 接收数据时,驱动程序置RTS为高以便允许DCE来发送; 1之置RTS为低以阻止DCE发送数据。

    RTS_C0NTR0L_T0GGLE

    有字节要发送时RTS变高,当所有缓冲字节己经被发送完 毕后,RTS变低。此时应用程序不能调用 EscapeCoranFunction函数。该值在Windows 95系统被忽略

    fOutxDsrFlow

    是否监控DSR (data-set-ready)信号来做输出流控。当设置为true时:

    若DSR为低电平,则数据发送将被挂起,直至DSR变为高。DSR的信号一般由DCE来 控制

    fDtrControl

    DTR (data-terminal-ready)流控,可取值如下:

    取值

    意义

    DTR_CONTROL_DISABLE

    打开设备时置DTR信号为低电平,应用程序可通过调用 EscapeCoranFunction函数来改变DTR线电平状态

    DTR_CONTROL_ENABLE

    打开设备时置DTR信号为高电平,应用程序可通过调用 EscapeCoranFunction函数来改变DTR线电平状态

    DTR_CONTROL_HANDSHAKE

    允许DTR信号握手,此时应用程序不能调用 EscapeCoranFunction 函数

    fDsrSensitivity i 1

    通讯设备是否对DSR信号敏感。若设置为TRUE,则当DSR为低时将会忽略所有接收 亟字节

    fTXCont inueOnXoff

    当输入缓冲区满且驱动程序己发出XOFF字符时,是否停止发送。当为TRUE时,X0FF 被发送后发送仍然会继续;为FALSE时,发送停止,直至输入缓冲区有XonLim字节 的空余空间、驱动程序己发送X0N字符之后发送继续。

    fOutX

    X0N/X0FF流量控制在发送时是否可用。如果为TRUE,当X0FF值被收到的时候,发 送停止;当X0N值被收到的时候,发送继续

    flnX

    X0N/X0FF流量控制在接收时是否可用。如果为TRUE,当输入缓冲区己接收满 XoffLim字节时,发送X0FF字符;当输入缓冲区己经有XonLim字节的空余容量时, 发送X0N字符

    XonLim

    在X0N字符发送前接收缓冲区内可允许的最小字节数

    XoffLim

    在X0FF字符发送前接收缓冲区内可允许的最大字节数

    XonChar

    指定X0N字符

    XoffChar

    指定X0FF字符

    fDummy2

    保留,未启用

    wReserved

    未启用,i须设置为0
    wReservedl 保留,未启用