WEB开发网
开发学院软件开发VC 用VC 6.0实现串行通信的三种方法 阅读

用VC 6.0实现串行通信的三种方法

 2009-11-11 20:30:05 来源:WEB开发网   
核心提示: (3)串口读写操作 主要运用ReadFile()与WriteFile()API函数,若为异步通信方式,用VC 6.0实现串行通信的三种方法(3),两函数中最后一个参数为指向OVERLAPPED结构的非空指针,在读写函数返回值为FALSE的情况下,临界区,事件等,调用GetLastError()函数,返回值为ERROR

---- (3)串口读写操作

---- 主要运用ReadFile()与WriteFile()API函数,若为异步通信方式,两函数中最后一个参数为指向OVERLAPPED结构的非空指针,在读写函数返回值为FALSE的情况下,调用GetLastError()函数,返回值为ERROR_IO_PENDING,表明I/O操作悬挂,即操作转入后台继续执行。此时,可以用WaitForSingleObject()来等待结束信号并设置最长等待时间,举例如下:

BOOL  bReadStatus;
bReadStatus = ReadFile( m_hIDComDev, buffer,
dwBytesRead, &dwBytesRead,  &m_OverlappedRead );
if(!bReadStatus)
{
if(GetLastError()==ERROR_IO_PENDING)
{
WaitForSingleObject(m_OverlappedRead.hEvent,1000);
return ((int)dwBytesRead);
}
return(0);
}
return ((int)dwBytesRead);

---- 定义全局变量m_Serial作为新建通信类CSimpleComm的对象,通过调用类的成员函数即可实现所需串行通信功能。与方法一相比,方法二赋予串行通信程序设计较大的灵活性,端口的读写可选择较简单的查询式,或通过设置与外设数据发送时间间隔TimeCycle相同的定时器:SetTimer(1,TimeCycle,NULL),进行定时读取或发送。

CSampleView:: OnTimer(UINT nIDEvent)
{
char InputData[30];
m_Serial.ReadData(InputData,30);
// 数据处理
}

---- 若对端口数据的响应时间要求较严格,可采用事件驱动I/O读写,Windows定义了9种串口通信事件,较常用的有:

---- EV_RXCHAR: 接收到一个字节,并放入输入缓冲区。

---- EV_TXEMPTY: 输出缓冲区中的最后一个字符发送出去。

---- EV_RXFLAG: 接收到事件字符(DCB结构中EvtChar成员),放入输入缓冲区。

---- 在用SetCommMask()指定了有用的事件后,应用程序可调用WaitCommEvent()来等待事件的发生。SetCommMask(hComm,0)可使WaitCommEvent()中止。

---- 方法三 多线程下实现串行通信

---- 方法一,二适用于单线程通信。在很多工业控制系统中,常通过扩展串口连接多个外设,各外设发送数据的重复频率不同,要求后台实时无差错捕捉,采集,处理,记录各端口数据,这就需要在自定义的串行通信类中创建端口监视线程,以便在指定的事件发生时向相关的窗口发送通知消息。

---- 线程的基本概念可详见VC++参考书目,Windows内部的抢先调度程序在活动的线程之间分配CPU时间,Win 32 区分两种不同类型的线程,一种是用户界面线程UI(User Interface Thread),它包含消息循环或消息泵,用于处理接收到的消息;另一种是工作线程(Work Thread),它没有消息循环,用于执行后台任务。用于监视串口事件的线程即为工作线程。

---- 多线程通信类的编写在端口的配置,连接部分与单线程通信类相同,在端口配置完毕后,最重要的是根据实际情况,建立多线程之间的同步对象,如信号灯,临界区,事件等,相关细节可参考VC++ 中的同步类。

---- 一切就绪后即可启动工作线程:

CWinThrea *CommThread = AfxBegin
Thread(CommWatchThread, // 线程函数名
(LPVOID) m_pTTYInfo,            // 传递的参数
THREAD_PRIORITY_ABOVE_NORMAL,    // 设置线程优先级
(UINT) 0,                 // 最大堆栈大小
(DWORD) CREATE_SUSPENDED ,      // 创建标志
(LPSECURITY_ATTRIBUTES) NULL);     // 安全性标志

上一页  1 2 3 4  下一页

Tags:VC 实现 串行

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接