论文首页哲学论文经济论文法学论文教育论文文学论文历史论文理学论文工学论文医学论文管理论文艺术论文 |
(3)串口超时设置
设置好串口驱动操作的配置后,一个必要的步骤是,设置端口的超时值。所谓超时,是指Windows CE.net在读串口和写串口的自动返回前等待读或写操作的时间长度。在程序中,用以下两个函数控制串行超时。
BOOL GetCommTimeouts(HANDLE hFile, LPCOMMTIMEOUTS lpCommTimeouts);
BOOL SetCommTimeouts(HANDLE hFile, LPCOMMTIMEOUTS lpCommTimeouts);
这两个函数都包含了对应的串行设备的句柄和COMMTIMEOUTS结构的指针,COMMTIMEOUTS结构定义为:
typedef struct _COMMTIMEOUTS{
DWORD ReadIntervalTimeout;
DWORD ReadTotalTimeoutMultiplier;
DWORD ReadTotalTimeoutConstant;
DWROD WriteTotalTimeoutMultiplier;
DWORD WriteTotalTimeoutConstant;
}COMMTIMEOUTS;
(4)其他的函数
设置串口的输入输出缓冲区。原型如下
BOOL SetupComm(HANDLE hFile, DWORD dwInQueue, DWORD dwOutQueue);
设置串口检测的事件集。
SetCommMask(HANDLE hFile,DWORD dwEvtMask);
通过这个函数,可以使线程等待如表4-5中的常见的串口驱动程序事件。
表4-5 串口驱动程序事件
4.2.2.2关闭串口
调用CloseHandle可以关闭一个串行端口,用关闭在打开串口时创建的那个句柄即可关闭串口了。方法如下
CloseHandle(m_hComm);
关闭线程函数:
BOOL TerminateThread(HANDLE hThread, DWORD dwExitCode);
其中,hThread为要关闭的线程的句柄。dwExitCode一般为0。若成功关闭,则返回一个非零值。关闭串口函数的工作流程如图4-9所示。
SHAPE \* MERGEFORMAT
图4-9 ClosePort函数流程图
4.2.2.3 串口读线程
读串口ReadFile函数原形:
BOOL ReadFile(
HANDLE hFile, //文件的句柄
LPVOID lpBuffer, //用于保存读入数据的一个缓冲区
DWORD nNumberOfBytesToRead, //要读入的字符数
LPDWORD lpNumberOfBytesRead, //从文件中实际读入的字符数
LPOVERLAPPED lpOverlapped //异步读取描述,在Windows CE中为NULL
);
在该线程中,若串口读完一条信息,则发送一个系统消息到系统窗体,该消息的名称为WM_RXCHAR_ALL,是一个用户自定义消息。发送给系统窗体的附带消息包含收到的消息的内容和消息的长度。
发送系统消息的API函数SendMessage的原型如下:
LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam);
图4-10 串口读线程流程图
4.2.2.4 写串口
在CCESeries类中,一共编写了三个写串口的函数,为的是方便不同情况下的调用。如要向写已知长度的字符串,可以采用WritePort(char *buf,int nSize)函数。写未知长度字符串时,采用WritePort(char *buf)函数,字符串的长度将在函数内部进行计算。前者提高了写串口的时间效率。这三个函数中,采用了一个共同的API函数WriteFile(),它的函数原型如下:
BOOL WriteFile(
HANDLE hFile, // 文件句柄
LPCVOID lpBuffer, // 数据缓存区指针
DWORD nNumberOfBytesToWrite, // 要写的字节数
LPDWORD lpNumberOfBytesWritten, // 用于保存实际写入字节数的存储区域的指针
LPOVERLAPPED lpOverlapped // OVERLAPPED结构体指针,CE里设为NULL
);
4.2.2.5 串口类的调用
在主程序中,必须调用此CCESeries类,以达到操作串口的目的。
在定义智能家居的窗口行为的CSmartHomeDlg类的头文件CSmartHomeDlg.h文件中,添加CCESeries.h头文件。并且新建一个public型变量m_BTSerial(蓝牙串口)和m_IRSeries进行对CCESeries类的实例化。
CCESeries m_BTSerial;
CCESeries m_IRSerial;
在用于CSmartHomeDlg类成员函数的定义的文件CSmartHomeDlg.cpp文件中,采用形如m_BTSerial.OpenPort(this->m_hWnd,1,9600)的方式进行串口类成员函数的调用。
4.2.2.6 串口的监听
在读串口线程中,读完串口的一条信息后发送名为WM_RXCHAR_ALL的系统消息给系统窗体。在窗体程序中,必须对其进行响应。
在CSmartHomeDlg.cpp文件中,添加一条消息响应的声明:
ON_MESSAGE(WM_RXCHAR_ALL,OnComRecvMsg)
其中OnComRecvMsg为对其消息响应的函数,函数的声明如下:
afx_msg long OnComRecvMsg(WPARAM wParam, LPARAM lParam);
其中“afx_msg”说明该函数是一消息响应函数。
4.4 GSM模块
智能家居以GSM网络作为数据的无线传输网络,利用基于GSM网络上的短信息服务,完成智能家居的远程安全监控和无线报警的功能。
4.4.1 设计基本原理
4.4.1.1 PDU编码规则
自短信息技