Windows平台下常用的串行通信串口编程API

实作时拿来查就好!


1、CreateFile() ——打开串口& CloseHandle()——关闭串口,成功关闭返回true
HANDLE CreateFile(LPCTSTR lpFileName ,DWORD dwDesireAccess ,DWORD  dwShareMode, 
                                LPSECURITY_ATTRIBUTES  lpSecurityAttributes ,DWORD  dwCreationDistribution ,
                                DWORD dwFlagsAndAttributes ,HANDLE hTemplateFile);

BOOL  CloseHandle(HANDLE  hObjedt) ;

lpFileName  要打开的设备文件名称,对串口通信来说就是COM1或COM2
dwDesiredAccess  读/写模式设置,一般为GENERIC_READ 或  GENERIC_WRITE
dwShareMode    串口共享模式,一般不允许与其他应用程序共享,设为0
lpSecurityAttributes    串口的安全属性,应为0,表示该串口不可被子程序继承
dwCreationDistribution      创建文件的性质,一般标识为OPEN_EXISTING
dwFlagsAndAttributes  属性及相关标志,若用异步方式应1设为FILE_FLAG_OVERLAPPED
hTemplateFile   模板文件指定,一般为0,选定为默认值

串口打开成功方可使用。CreateFile函数返回操作串口的句柄,可供以后对串口操作使用。

GetCommState()——取得串口的工作状态和  SetCommState()——设置串口的工作状态

BOOL  GetCommState(HANDLE hFile,LPDCB lpDCB);
BOOL  SetCommState(HANDLE hFile ,LPDCB lpDCB);
hFile表示串口句柄,lpDCB表示特定的设备控制块DCB(Device Control Block)。DCB结构中含有设备相关的参数,如数据位数、起止/校验和波特率等。初始化串口时一般先用GetCommState()取得串口的参数结构,修改部分参数后再调用SetCommState()将参数结构写入DCB
DCB中进行串口初始化设置相关的几个常用参数:
DWORD  BaudRate  串口波特率
DWORD  fParity  为1时激活奇偶校验
DWORD  Parity  校验方式,0~4分别对应无校验,奇校验,偶校验,校验置位和校验清零
DWORD  ByteSize   一个字节的数据位个数,范围是5~8
DWORD  StopBits   停止位个数,0~2分别对应1位、1.5位、2位停止位


GetCommTimeouts()——取得串口收发的超时时间和SetCommTimeouts()——设置串口收发的超时时间
两个函数主要通过改变COMMTIMEOUTS结构体的成员变量值来实现
BOOL  GetCommTimeouts(HANDLE hFile ,LPCOMMTIMEOUTS lpCommTimeouts);
BOOL SetCommTimeouts(HANDLE hFile ,LPCOMMTIMEOUTS  lpCommTimeouts);

COMMTIMEOUTS 结构用于表示读/写操作相关的时间限制
typedef  struct _COMMTIMEOUTS
{
    DWORD  ReadIntervalTimeout ;//两个字符到达的最大时间间隔,单位为ms
    DWORD  ReadTotalTimeoutMultiplier ;//读操作一个字符的时间值
    DWORD ReadTotalTimeoutConstant ;//读操作的时间限定值
    DWORD WriteTotalTimeoutMultiplier ;//写操作一个字符的时间值
    DWORD WriteTotalTimeoutConstant ;//写操作的时间限定值
} COMMTIMEOUTS ,*LPCOMMTIMEOUTS ;

其中 ReadTotalTimeout = ReadTotalTimeoutMultiplier *BytesToRead  +ReadTotalTimeoutComnstant
        WriteTotalTimeout =WriteTotalTimeoutMultiplier * BytesToWrite + WriteTotalTimeoutConstant

读完一个字符后,超过了ReadIntervalTimeout ,仍未读取到下一个字符,发生超时事件
读或写操作时间超过上述式子中的设定值,发生超时事件

SetupComm()——设置数据缓冲区大小 和 PurgeComm()——清零数据缓冲区
BOOL SetuoComm(HANDLE hFile ,DWORD dwInQueue ,DWORD dwOutQueue);
BOOL  PurgeComm(HANDLE hFile ,DWORD dwFlags) ;

dwInQueue——接收缓冲区的字节长度
dwOutQueue——发送缓冲区的字节长度
dwFlags——指定对串口执行的动作

常用的dwFlags标识:
PURGE_TXABORT——停止目前所有的传输工作,立即返回,不管是否完成传输动作
PURGE_RXABORT  ——停止目前所有的读取工作,立即返回,不管是否完成读取动作
PURGE_TXCLEAR——清除发送缓冲区的所有数据
PURGE_RXCLEAR——清除接收缓冲区的所有数据


ReadFile() ——读串口操作 和WriteFile()——写串口操作
BOOL ReadFile(HANDLE hFile ,LPVOID lpBuffer ,DWORD nNumberOfBytesToRead ,
                        LPDWORD lpNumberOfBytesRead , LPOVERLAPPED lpOverlapped );
BOOL WriteFile( HANDLE hFile ,LPCVOID lpBuffer ,DWORD nNumberOfBytesToWrite ,
                            LPDWORD lpNumberOfBytesWritten ,LPOVERLAPPED lpOverlapped);

lpBuffer——等待读或写数据的首地址 ;nNumberOfBytesToRead 等待读的字节数长度
nNumberOfBytesToWrite  等待写的字节数长度
lpNumberOfBytesRead  从串口实际读出的字节个数
lpNumberOfBytesWritten  实际写入串口的数据个数
lpOverlapped  指向一个可重叠型I/O结构的指针


ClearCommError()——清除串口错误或读取串口当前的状态
BOOL ClearCommError(HANDLE hFile ,LPDWORD lpErrors ,LPCOMATAT lpStat );

lpError  返回的错误数值
常见的错误常数定义:
CE_BPEAK  检测到某个字节数据缺少合法的停止位
CE_FRAME  硬件1检测到帧错误
CE_IOE   通信设备发生输入/输出错误
CE_MODE  设置模式错误,或是hFile值错误
CE_OVERRUN  溢出错误,缓冲区容量不足,数据将丢失
CE_RXOVER  溢出错误
CE_RXPARITY  硬件检查到校验位错误
CE_TXFULL     发送缓冲区已满
lpStat   指向通信端口状态的结构变量  COMSTAT 
typedef struct _COMSTAT
{
    ......
    DWORD cbInQue ;//输入缓冲区的字节数
     DWORD cbOutQue ;//输出缓冲区的字节数
}COMSTAT ,*LPCOMSTAT ;

GetCommMask() 、SetCommMask()  WaitCommEvent ()
获得、设置、等待串行端口上指定监视事件
BOOL GetCommMask(HANDLE hFile ,LPDWORD lpEvtMask );
BOOL SetCommMask(HANDLE hFile ,DWORD dwEvtMask );
BOOL WaitCommEvent (HANDLE hFile ,LPDWORD lpEvtMask ,LPOVERLAPPED lpOverlapped );

lpEvtMask  准备监视的串口事件掩码,可以是以下一个或几个定义事件的组合:
EV_BREAK 收到Break信号
EV_CTS    CTS(Clear to Send )线路状态发生变化
EV_DSR   DSR(Data Set Ready )线路状态发生变化
EV_ERR   线路状态错误,包括CE_FRAME、CE_OVERRUN 、CE_RXPARRITY 3种错误
EV_RING  检测到振铃信号
EV_RLSD  CD(Carrier Detect)线路信号发生变化
EV_RXCHAR   输入缓冲区中已收到数据
EV_RXFLAG  使用SetCommState()函数设置DCB结构中的等待字符已被传入输入缓冲区
EV_TXEMPTY  输出缓冲区中的数据已被完全送出
lpOverlapped  用于在异步通信时保存异步操作结果


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
原先的程序数据缓冲区采用String类型,因此无法发送H00,现将数据缓冲区修改为BLOB类型,可以发送任意数据。 在原先程序的基础上,增加了两个对象:pfc_n_cst_numerical,uo_bit_operator Email: leio88@126.com 以下是原作者的话---------------------------------- 本程序通过调用WINDOWS API函数,实现了类似MSCOMM控件的功能。使PB可以很方便地访问串口。由于所有功能都是PB代码实现的,因此比使用OCX控件访问串口的方式更稳定。 为了方便使用已将所有功能都封装在uo_comm._control用户对象中。使用时只需在窗口中像放置普通对象(如:按钮)一样放置一个uo_comm_control对象即可对串口进行访问。 访问串口时先调用of_setcommport(string commport)和of_setcommsettings(string commsettings)来设置要访问的端口及端口初始化参数,然后调用of_open()初始化端口。或直接使用of_open(string comport,string commsettings)带参数初始化端口。端口初始化成功后即可使用of_send(string sendstring)向串口发送数据,或使用of_read()读取串口数据。当串口有数据到达时,触发ue_received事件,该事件提供给用户用来存放读取串口数据的代码(值得注意的是,当数据到达接收端时,由于发送的数据很长或通讯速率较低,会多次触发ue_receieved事件,并且在ue_received事件中使用of_read()得到的数据仅只是整个发送数据的一部分,需要将多次接收到的数据连接起来才是完整的接收数据)。若对串口所有操作结束不再需要对串口进行操作,则调用of_close()将端口关闭。 Email: blazingstar@sina.com

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alex-铭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值