编辑: 达达恰西瓜 | 2015-12-20 |
在此需要说明的是:在CreateFile 函数的参数中,共享参数必需设置为 0,表示独占方 式,安全参数必需设置为 NULL 值,模板文件参数也必需被设置成 NULL.由于在 CE 中不 支持重叠I/O 模式,因此不能在参数dwFlagsAndAttributes 中传递FILE_FLAG_OVERLAPPED.如果打开串口成功,将返回打开串口的句柄,否则将返回 INVALID_HANDLE_VALUE.需要注意的是,在打开串口号大于
9 的串口时,需要使用 \\$device\\COMxx ,而不是通常的 COMx: .打开串口后,串口就已经被独占了,因此当 我们不再使用打开的串口时,应及时关闭串口,此时可以 CloseHandle 函数关闭串口,例如,可以使用以下代码来关闭上面打开的串口: BOOL bResult = CloseHandle(hComm);
3.2.2 配置串口 在实际使用串口用时,还必需配置好串口的波特率、奇偶校验和数据位等参数.CE 中 提供了 GetCommState 和SetCommState 函数,分别用于获取串口的当前参数和设置串口 的参数,它们的定义如下: BOOL GetCommState( HANDLE hFile, LPDCCB lpDCB );
BOOL SetCommState( HANDLE hFile, LPCDB lpDCB );
这两个函数都包含了相同的参数, 其中参数 hFile 是输入参数, 指向已打开的串口句柄;
参数 lpDCB 指向 DCB 结构的指针,在GetCommState 函数中,它属于输出参数,在SetCommState 函数中,它属于输入参数.DBC 结构完全描述了串口的使用参数,其定如 下: www.emtronix.com 028-86180660
7 英创信息技术有限公司 ETA503 串口扩展模块应用手册 V1.2 typedef struct _DCB{ DWORD DCBlength;
//DCB 结构大小 DWORD BaudRate;
//波特率 DWORD fBinary:1;
//二进制模式 DWORD fParity:1 //进行奇偶较验 DWORD fOutxCtsFlow:1;
//使CTS 信号进行输出流量控制 DWORD fOutxDSRfLOW:1;
//使DSR 信号进行输入流量控制 DWORD fDtrDsrFlow:1;
//DTR 流量控制 DWORD fDsrSensitivity:1;
//DSR 敏感度 DWORD fTXContinueOnXoff:1;
//XOFF 后是否继续发送 DWORD fOutX:1;
//使得输出 XON/XOFF 有效 DWORD fInx:1 //使得输入 XON/XOFF 有效 DWORD fErrorChar:1;
//允许奇偶错误替换 DWORD fNull:1;
//允许删除 NULL DWORD fRtsControl:2;
//RTS 流量控制 DWORD fAbortOnError:1 //出错时是否终止读写操作 DWORD fDummy2:17;
//保留 DWORD wReserved;
//当前未用,必须置为
0 DWORD XonLim;
//XON 阀值 DWORD XoffLim;
//XOFF 阀值 BYTE ByteSize;
//字符位数,4~8 BYTE Parity;
//奇偶校验位,0~4 分别为 no,odd,even, mark, space BYTE StopBits;
//停止位,0,1,2 分别为 1,1.5,2 Char XonChar;
//XON 字符 Char XoffChar;
//XOFF 字符 Char ErrorChar;
//奇偶错误替换字符 Char EofChar;
//结束字符 Char EvtChar;
//事件字符 WORD wReservedl;
//保留,未用 }DCB;
www.emtronix.com 028-86180660
8 英创信息技术有限公司 ETA503 串口扩展模块应用手册 V1.2 3.2.3.读写串口 正如使用 CreateFile 函数打开串口一样, 可以使用 ReadFile 和WriteFile 函数读取串口 或向串口中写入.需要注意的是,由于从串口中读写数据的速度比较慢,因此最好的方法是 用单独的线程来读写数据.虽然 CE 中不支持重叠 I/O 操作,但还是可以分别用单独的线程 去地读写串口.同时 CE 还提供了 WaitCommEvent 函数,该函数将阻塞线程,直到预先设 置的串口事件中的某一事件发生,在我们封装的 CCESerial 类中即是使用在一个线程中 WaitCommEvent 函数来等待数据接收.在使用串口事件之前,还需要了解如下三个函数: BOOL GetCommMack( HANDLE hFile, LPDWORD lpEvtMadsk );