·打开串口:
HANDLE CreateFile(
LPCTSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile
);
在Windows CE下,利用CreateFile函数打开一个COM口时,dwShareMode(共享模式)必须设置为0,表示独占方式;lpSecurityAttributes(安全参数)必须设置为NULL;hTemplateFile(模板文件)必须设置为NULL;dwCreationDisposition需要设置为OPEN_EXISTING。则上述函数简化为:
HANDLE CreateFile(
LPCTSTR lpFileName,
DWORD dwDesiredAccess,
0,
NULL,
OPEN_EXISTING,
DWORD dwFlagsAndAttributes,
NULL
);
其中dwDesiredAccess设置为GENERIC_READ表示可读,设置为GENERIC_WRITE表示可写。通常可通过如下示例打开一个串口。
CreateFile(
_T("COM1:"),
GENERIC_READ | GENERIC_WRITE, //允许读和写
0, //独占方式(共享模式)
NULL,
OPEN_EXISTING, //打开而不是创建(创建方式)
0,
NULL
);
打开串口成功,函数返回串口句柄;打开串口失败,函数返回INVALID_HANDLE_VALUE
·关闭串口:
BOOL CloseHandle(
HANDLE hObject
);
如:CloseHandle(m_hComm); //m_hComm是CreateFile函数返回的串口句柄。
关闭串口成功,函数返回非零值;关闭串口失败,函数返回零。
·DCB(设备控制块):
DCB结构完全描述了串口的使用参数。
typedef struct _DCB {
DWORD DCBlength; /* sizeof(DCB) */
DWORD BaudRate; /* Baudrate at which running */
DWORD fBinary: 1; /* Binary Mode (skip EOF check) */
DWORD fParity: 1; /* Enable parity checking */
DWORD fOutxCtsFlow:1; /* CTS handshaking on output */
DWORD fOutxDsrFlow:1; /* DSR handshaking on output */
DWORD fDtrControl:2; /* DTR Flow control */
DWORD fDsrSensitivity:1; /* DSR Sensitivity */
DWORD fTXContinueOnXoff: 1; /* Continue TX when Xoff sent */
DWORD fOutX: 1; /* Enable output X-ON/X-OFF */
DWORD fInX: 1; /* Enable input X-ON/X-OFF */
DWORD fErrorChar: 1; /* Enable Err Replacement */
DWORD fNull: 1; /* Enable Null stripping */
DWORD fRtsControl:2; /* Rts Flow control */
DWORD fAbortOnError:1; /* Abort all reads and writes on Error */
DWORD fDummy2:17; /* Reserved */
WORD wReserved; /* Not currently used */
WORD XonLim; /* Transmit X-ON threshold */
WORD XoffLim; /* Transmit X-OFF threshold */
BYTE ByteSize; /* Number of bits/byte, 4-8 */
BYTE Parity; /* 0-4=None,Odd,Even,Mark,Space */
BYTE StopBits; /* 0,1,2 = 1, 1.5, 2 */
char XonChar; /* Tx and Rx X-ON character */
char XoffChar; /* Tx and Rx X-OFF character */
char ErrorChar; /* Error replacement char */
char EofChar; /* End of Input character */
char EvtChar; /* Received Event character */
WORD wReserved1; /* Fill for now. */
} DCB, *LPDCB;
DCBlength:指定DCB结构的大小。
BaudRate:指定通信设备的波特率,常用的如:CBR_9600。
fBinary:该参数必须设置为TRUE,使能二进制传输模式,因为Win32 API不支持非二进制传输模式。
fParity:指定是否执行奇偶校验。
fOutxCtsFlow:指定CTS(clear-to-send)信号是否被监视并作为输出流控制信号。如果该参数设置为TRUE,同时CTS信号被关闭,则输出被挂起,直到CTS信号重新发出。
fOutxDsrFlow:指定DSR(data-set-ready)信号是否被监视并作为输出流控制信号。如果该参数设置为TRUE,同时DSR信号被关闭,则输出被挂起,直到DSR信号重新发出。
fDtrControl:指定DTR(data-terminal-ready)信号是否作为数据流控制信号。该参数可以设置为:
DTR_CONTROL_DISABLE | 当串口设备打开时,DTR信号线始终设为禁止 |
DTR_CONTROL_ENABLE | 当串口设备打开时,DTR信号线设为使能并始终打开 |
DTR_CONTROL_HANDSHAKE | 使DTR支持握手,此时可以调用EscapeCommFunction函数来释放DTR线上的错误 |
fDsrSensitivity:指定串口通信设备是否对DSR信号状态敏感。设置为TRUE,则除非DSR信号线上的电平为高,否则接收到的字节将被忽略。
fTXContinueOnXoff:指定当输入缓冲区满且收到XoffChar字符时,传输是否终止。该参数设置为TRUE,则输入缓冲区的字节数小于XoffLim定义的字节数时传输将继续,发送完XoffChar字节后将停止接收字节。如果该参数设置为FALSE,那么只有当输入缓冲区的字节数在XonLim定义的字节数内,且驱动程序发送过XonChar字符以恢复接收过程时,传输才会继续。
fOutX:指定在数据发送期间是否使用XON/XOFF流控制。该参数设置为TRUE,则当接收到XoffChar字符时将停止发送,直到接收到XonChar字符时开始发送。
fInX:指定在接收数据期间是否使用XON/XOFF流控制。该参数设置为TRUE,则当输入缓冲区中存有数据的空间达到XoffLim定义的字节数时,XoffChar将被发送;当输入缓冲区中可用的空间达到XonLim定义的字节数时,XonChar被发送。
fErrorChar:指定当收到的字符发生奇偶校验错误时,是否使用ErrorChar成员定义的字符代替。该参数设置为TRUE,且fParity设置为TRUE,将会发生替换。
fNull:指定null是否被丢弃,设置为TRUE,则接收到的null字符被丢弃。
fRtsControl:指定RTS(request-to-send)流控制,若该参数为0,则缺省值为RTS_CONTROL_HANDSHAKE。
RTS_CONTROL_DISABLE | 当串口设备打开时,RTS线始终为禁止 |
RTS_CONTROL_ENABLE | 当设备打开时,RTS线始终设为使能并始终打开 |
RTS_CONTROL_HANDSHAKE | 启动RTS握手功能。当输入缓冲区字符小于缓冲区总数的1/2时,驱动程序使RTS信号为高,超过3/4时,使RTS信号为低。若RTS握手功能可用,可调用EscapeCommFunction函数释放DTR线上的错误 |
RTS_CONTROL_TOGGLE | 指定当发送数据时,RTS信号线为高,缓冲区数据发送完,RTS信号线为低 |
fAbortOnError:指定当错误发生时,读写操作是否终止。该参数设置为TRUE,则当错误发生时,所有的读写操作将终止。直到应用程序调用ClearCommError函数来获取错误信息之后,驱动程序才会进行进一步的通信。
fDummy2:该参数保留,未用。
wReserved:该参数没有被使用,必须设置为0。
XonLim:指定发送XON字符前输入缓冲区允许的最小字节数。
XoffLim:指定发送XOFF字符前输入缓冲区允许的最大字节数。最大允许接收字符数可以用定义的全部输入缓冲区字节数减去此值得到。
ByteSize:指定一个传送字节中的数据位数(数据位)。
Parity:指定奇偶校验方法
EVENPARITY | 偶校验 |
MARKPARITY | 标记校验 |
NOPARITY | 无校验 |
ODDPARITY | 奇校验 |
SPACEPARITY | Space |
StopBits:指定停止位的位数
ONESTOPBIT | 1位停止位 |
ONE5STOPBITS | 1.5位停止位 |
TWOSTOPBITS | 2位停止位 |
XonChar:指定发送接收的XON字符。
XoffChar:指定发送接收的XOFF字符。
ErrorChar:指定当接收到的数据发生奇偶校验错误时替换的字符。
EofChar:指定某字符作为数据结束标记。
EvtChar:指定某字符作为事件标记。
wReserved1:该参数保留,未用。
·配置串口:
BOOL GetCommState(
HANDLE hFile,
LPDCB lpDCB
);
该函数用来获取已打开串口的参数信息,并将这些信息填充到lpDCB参数所指向的DCB(设备控制块)中。
返回值:成功返回非零值,失败返回零
BOOL SetCommState(
HANDLE hFile,
LPDCB lpDCB
);
返回值:成功返回非零值,失败返回零
该函数用来设置已打开串口的参数信息。
在设置串口参数时,一般先调用GetCommState函数获取串口参数信息到一个DCB(设备控制块)中,然后对感兴趣的参数进行修改,最后再调用SetCommState函数完成串口参数的配置。
例如可以通过如下代码配置串口参数:
——————————————————————————————————
//得到打开串口的当前属性参数,修改后再重新设置串口。
if (!GetCommState(m_hComm,&DCB_COM1))
{
TRACE(_T("GetCommState error"));
return FALSE;
}
//设置串口参数
DCB_COM1.BaudRate = CBR_9600; // 设置波特率9600
DCB_COM1.fBinary = TRUE; // 设置二进制模式,此处必须设置TRUE
DCB_COM1.fParity = TRUE; // 支持奇偶校验
DCB_COM1.fOutxCtsFlow = FALSE; // No CTS output flow control
DCB_COM1.fOutxDsrFlow = FALSE; // No DSR output flow control
DCB_COM1.fDtrControl = DTR_CONTROL_DISABLE; // No DTR flow control
DCB_COM1.fDsrSensitivity = FALSE; // DSR sensitivity
DCB_COM1.fTXContinueOnXoff = TRUE; // XOFF continues Tx
DCB_COM1.fOutX = FALSE; // No XON/XOFF out flow control
DCB_COM1.fInX = FALSE; // No XON/XOFF in flow control
DCB_COM1.fErrorChar = FALSE; // Disable error replacement
DCB_COM1.fNull = FALSE; // Disable null stripping
DCB_COM1.fRtsControl = RTS_CONTROL_DISABLE; //No RTS flow control
DCB_COM1.fAbortOnError = FALSE; // 当串口发生错误,并不终止串口读写
DCB_COM1.ByteSize = 8; // 数据位,范围:4-8
DCB_COM1.Parity = NOPARITY; // 校验模式
DCB_COM1.StopBits = 0; // 1位停止位
//设置串口参数
if (!SetCommState(m_hComm, &DCB_COM1))
{
TRACE(_T("SetCommState error"));
return FALSE;
}
——————————————————————————————————
·读写串口:
BOOL ReadFile(
HANDLE hFile,
LPVOID lpBuffer,
DWORD nNumberOfBytesToRead,
LPDWORD lpNumberOfBytesRead,
LPOVERLAPPED lpOverlapped
);
hFile:CreateFile函数返回的串口句柄。
lpBuffer:指定接收数据的缓冲区。
nNumberOfBytesToRead:想要读取的字节数。
lpNumberOfBytesRead:实际读取的字节数。
lpOverlapped:Windows CE不支持,设置为NULL。
BOOL WriteFile(
HANDLE hFile,
LPCVOID lpBuffer,
DWORD nNumberOfBytesToWrite,
LPDWORD lpNumberOfBytesWritten,
LPOVERLAPPED lpOverlapped
);
hFile:CreateFile函数返回的串口句柄。
lpBuffer:指定存储发送数据的缓冲区。
nNumberOfBytesToRead:指定将要发送的数据的字节数。
lpNumberOfBytesRead:实际发送的数据的字节数。
lpOverlapped:Windows CE不支持,设置为NULL。
读写函数的返回值都是成功时返回非零值,失败时返回零。
例:
DWORD dwLength;
char *recvBuf = new char[1024];
BOOL fReadState = ReadFile(m_hComm, recvBuf, 1024, &dwLength, NULL);
delete[] recvBuf;
DWORD dwactlen;
char *psendbuf = new char[32];
BOOL fWriteState = WriteFile(m_hComm, psendbuf, 32, &dwactlen, NULL);
delete[] psendbuf;
需要注意的是,由于从串口读写数据的速度比较慢,因此一般情况下,不会在主线程中读写大量的数据,而是创建单独的线程来读写数据,特别是读数据。