企业网站php开源系统,wordpress自动生成文章,网页微博登录,短视频拍摄价目表一、
1.在用ReadFile和WriteFile读写串口时#xff0c;既可以同步执行#xff0c;也可以重叠执行#xff1a; 在同步执行时#xff0c;函数直到操作完成后才返回。这意味着同步执行时线程会被阻塞#xff0c;从而导致效率下降。 在重叠执行时#xff0c;即使操作…一、
1.在用ReadFile和WriteFile读写串口时既可以同步执行也可以重叠执行 在同步执行时函数直到操作完成后才返回。这意味着同步执行时线程会被阻塞从而导致效率下降。 在重叠执行时即使操作还未完成这两个函数也会立即返回费时的I/O操作在后台进行。 2.ReadFile和WriteFile函数是同步还是异步由CreateFile函数决定 如果在调用CreateFile创建句柄时指定了FILE_FLAG_OVERLAPPED标志那么调用ReadFile和WriteFile对该句柄进行的操作就应该是重叠的 如果未指定重叠标志则读写操作应该是同步的。 ReadFile和WriteFile函数的同步或者异步应该和CreateFile函数相一致。
3.ReadFile函数只要在串口 输入缓冲区 中读入指定数量的字符就算完成操作。 WriteFile函数不但要把指定数量的字符拷入到 输出缓冲区而且要 等 这些字符从串行口 送出去后才算完成操作。 如果操作成功这两个函数都返回TRUE。 需要注意的是当ReadFile和WriteFile 返回FALSE时不一定就是操作失败线程应该调用GetLastError函数分析返回的结果。 例如在重叠操作时如果操作还未完成函数就返回那么函数就返回FALSE而且GetLastError函数返回ERROR_IO_PENDING这说明重叠操作还未完成正在后台运行。
3.重叠I/O非常灵活它也可以实现阻塞例如我们可以设置一定要读取到一个数据才能进行到下一步操作。 有两种方法可以 等待 操作完成 一种方法是用像WaitForSingleObject这样的等待函数来等待OVERLAPPED结构的hEvent成员 另一种方法是调用GetOverlappedResult函数等待 二、串口通讯大致步骤
(一)、open()打开串口“读”
1、 打开串口函数(以异步(重叠)IO打开串口)m_hCommHandle标识通讯端口的句柄 m_hCommHandle CreateFile(szComm, //COM口 GENERIC_READ | GENERIC_WRITE, //允许读和写 0, //独占方式 NULL, OPEN_EXISTING, //打开而不是创建 FILE_FLAG_OVERLAPPED, //重叠方式 NULL);
2、获取串口当前配置函数 GetCommState(m_hCommHandle, dcb); dcb.BaudRate dwBaudRate;//当前波特率 dcb.ByteSize byByteSize;//数据位数 dcb.Parity byParity;//奇偶校验 dcb.StopBits byStopBits;//停止位
3、配置串口函数(设置COM口的设备控制块) SetCommState(m_hCommHandle, dcb))
4、将串口DTR线路升成高电位 EscapeCommFunction(m_hCommHandle, SETDTR); 要实现自己的流控制时。此时应用必须负责RTS和DTR信号线的状态改变。
5、设置串行口的输入和输出缓冲区的大小 SetupComm(m_hCommHandle, 4096, 4096))
6、在读写串口之前要用PurgeComm()函数清空缓冲区终止正在进行的读写操作 PurgeComm(m_hCommHandle, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR))//清空缓冲区
7、创建一个线程用于接收串口的数据
8、线程函数中“实时读串口”
8.1 设置要监控的事件
SetCommMask(m_hCommHandle, EV_RXCHAR | EV_ERR); EV_RXCHAR输入缓冲区中已收到数据
8.2 等待串口通信事件的发生
WaitCommEvent(m_hCommHandle, dwMask, m_eventOverlapped)) GetOverlappedResult该函数返回重叠操作的结果用来判断异步操作是否完成
8.3 读串口 ReadFile()数据: GetOverlappedResult该函数返回重叠操作的结果用来判断异步操作是否完成
8.4 接收完成后进入RecvDataEvent响应函数(注册过SerialPort的类会实现RecvDataEvent函数) (二)、Send()发送数据写串口
9、写串口
9.1 立即终止异步发送清空发送缓存区 PurgeComm(m_hCommHandle, PURGE_TXABORT | PURGE_TXCLEAR);
9.2 写串口 WriteFile(m_hCommHandle, vpData, dwDataLen, dwWriteLen, m_writeOverlapped) GetOverlappedResult该函数返回重叠操作的结果用来判断异步操作是否完成
9.3 调用子类的回调函数SendDataEvent函数实现发送 (三)、close()关闭串口
10. 关闭串口 WaitForSingleObject(m_hThread, INFINITE);//等线程结束后关闭 CloseHandle(m_hThread);//关闭线程句柄 EscapeCommFunction(m_hCommHandle, CLRDTR);//将DTR线路降成低电位 PurgeComm(m_hCommHandle, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR); //终止读写/清空缓冲区函数 CloseHandle(m_hCommHandle);//关闭串口