第一范文网 - 专业文章范例文档资料分享平台

WIN32 - API串口通信编程实例教程

来源:用户分享 时间:2025/8/10 11:21:34 本文由loading 分享 下载这篇文档手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

return FALSE;

// set DCB to configure the serial port dcb.DCBlength = sizeof(dcb);

/* ---------- Serial Port Config ------- */ dcb.BaudRate = rate; dcb.Parity = NOPARITY; dcb.fParity = 0;

dcb.StopBits = ONESTOPBIT; dcb.ByteSize = 8; dcb.fOutxCtsFlow = 0; dcb.fOutxDsrFlow = 0;

dcb.fDtrControl = DTR_CONTROL_DISABLE; dcb.fDsrSensitivity = 0;

dcb.fRtsControl = RTS_CONTROL_DISABLE; dcb.fOutX = 0; dcb.fInX = 0;

/* ----------------- misc parameters ----- */ dcb.fErrorChar = 0; dcb.fBinary = 1; dcb.fNull = 0; dcb.fAbortOnError = 0; dcb.wReserved = 0; dcb.XonLim = 2; dcb.XoffLim = 4; dcb.XonChar = 0x13; dcb.XoffChar = 0x19; dcb.EvtChar = 0; // set DCB

if(!SetCommState(hComm,&dcb)) return false; else

return true; }

bool setuptimeout(DWORD ReadInterval,DWORD ReadTotalMultiplier,DWORD

ReadTotalconstant,DWORD WriteTotalMultiplier,DWORD WriteTotalconstant) {

COMMTIMEOUTS timeouts;

timeouts.ReadIntervalTimeout=ReadInterval;

timeouts.ReadTotalTimeoutConstant=ReadTotalconstant;

timeouts.ReadTotalTimeoutMultiplier=ReadTotalMultiplier; timeouts.WriteTotalTimeoutConstant=WriteTotalconstant;

timeouts.WriteTotalTimeoutMultiplier=WriteTotalMultiplier; if(!SetCommTimeouts(hComm, &timeouts))

return false; else

return true; }

void main() {

bool open;

open=openport(\if(open)

printf(\if(setupdcb(9600))

printf(\if(setuptimeout(0,0,0,0,0))

printf(\

SetCommMask(hComm, EV_RXCHAR); //当有字符在inbuf中时产生这个事件

//清除串口的所有操作

PurgeComm(hComm,PURGE_RXCLEAR|PURGE_TXCLEAR|PURGE_RXABORT|PURGE_TXABORT); system(\

}

/************************** program end***************************************/

第四节 读写串口数据及关闭串口

Win32API函数ReadFile和WriteFile支持对串行口的读写操作。在调用ReadFile和WriteFile之前,线程应该调用ClearCommError函数清除错误标志。 该函数负责报告指定的错误和设备的当前状态。

ClearCommError()

用途:清除串口错误或者读取串口现在的状态 原型:BOOL ClearCommError(HANDLE hFile, LPDWORD lpErrors, LPCOMATAT lpStat );

参数说明:

-hFile:串口句柄

-lpErrors:返回错误数值,错误常数如下:

1-CE_BREAK:检测到中断信号。意思是说检测到某个字节数据缺少合法的停止位。 2-CE_FRAME:硬件检测到帧错误。

3-CE_IOE:通信设备发生输入/输出错误。

4-CE_MODE:设置模式错误,或是hFile值错误。

5-CE_OVERRUN:溢出错误,缓冲区容量不足,数据将丢失。 6-CE_RXOVER:溢出错误。

7-CE_RXPARITY:硬件检查到校验位错误。

8-CE_TXFULL:发送缓冲区已满。

-lpStat:指向通信端口状态的结构变量,原型如下: typedef struct _COMSTAT{ ... ...

DWORD cbInQue; //输入缓冲区中的字节数 DWORD cbOutQue;//输出缓冲区中的字节数

}COMSTAT,*LPCOMSTAT;

该结构中对我们很重要的只有上面两个参数,其他的我们可以不用管。

假如当前串口中有5个字节数据的话,那么执行完ClearCommError()函数后,ComStat结构中的ComStat.cbInQue将被填充为5,此值在ReadFile函数中可被直接利用。

例如:

COMSTAT ComStat; DWORD dwError=0;

ClearCommError(hComm,&dwError,&ComStat);

上式执行完后,ComStat.cbInQue就是串口中当前含有的数据字节个数,我们利用此 数值就可以用ReadFile()函数去读串口中的数据了。

函数ReadFile和WriteFile的行为还受是否使用异步I/O(Overlapped)及通信超时设置的影响。串行口读写的同步、异步方式是在打开端口的同时给dwGlagsAndAttributes参数

传入适当的值而设定的。

WriteFile()

用途:向串口写数据

原型:BOOL WriteFile(HANDLE hFile,

LPCVOID lpBuffer,

DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten,

LPOVERLAPPED lpOverlapped);

参数说明: -hFile:串口句柄

-lpBuffer:待写入数据的首地址

-nNumberOfBytesToWrite:待写入数据的字节数长度

-lpNumberOfBytesWritten:函数返回的实际写入串口的数据个数的地址,利用此变量可判断实际写入的字节数和准备写入的字节数是否相同。

-lpOverlapped:重叠I/O结构的指针 ReadFile()

用途:读串口数据

原型:BOOL ReadFile(HANDLE hFile, LPVOID lpBuffer,

DWORD nNumberOfBytesToRead, lpNumberOfBytesRead,

lpOverlapped); 参数说明:

-hFile:串口句柄

-lpBuffer:存储被读出数据的首地址

-nNumberOfBytesToRead:准备读出的字节个数 -NumberOfBytesRead:实际读出的字节个数

-lpOverlapped:异步I/O结构 在同步方式下,调用ReadFile或WriteFile后,当实际读写操作完成或发生超时时才返回调用程序。而异步方式函数在启动接收或发送过程后立即返回,程序继续向下执行,程序在调用ReadFile和WriteFile时必须提供一个Overlapped数据结构指针,该结构中包含一个手动事件同步对象,其后的程序必须借助于该事件同步对象,完成数据的接收和发送过程。 通信端口的超时设置对读写的处理方式也会产生影响,如果调用读写函数时发生端口超时, 则读写函数立即返回并返回已传输的数据字节数。

ReadFile函数只要在串行口输入缓冲区中读入指定数量的字符,就算完成操作。

而WriteFile函数不但要把指定数量的字符拷入到输出缓冲中,而且要等这些字符从串行口送出去后才算完成操作。

如果不再使用某一端口,须将该端口关闭,以便其他程序可以使用该端口。如果不显式关闭某端口,当程序退出时打开的端口也将被自动关闭。但为了安全起见,最好是显式的关闭它。

关闭串口的语句为CloseHandle()。

CloseHandle() 用途:关闭串口

原型:BOOL CloseHandle(HANDLE hObjedt)

搜索更多关于: WIN32 - API串口通信编程实例教程 的文档
WIN32 - API串口通信编程实例教程.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/c9s9855r2ss0daes3z43y_3.html(转载请注明文章来源)
热门推荐
Copyright © 2012-2023 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top