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)
相关推荐: