串口和其他通信设备是作为文件处理的.简单的可以采用查询方式(定时方式),复杂些的可以采用事件驱动的方式. 所谓驱动方式,即当有串行数据进入输入缓冲区时,自动执行接受程序.
使用winAPI来编写 串口通信程序时,读写操作可以有同步方式与重叠的异步方式. 所谓同步方式,就是当命令发出后,直到数据确实写入到缓冲区后,写函数才返回.这种方式操作简单,但当数据写入时间较长时,将会使程序挂起,降低程序的效率. 为了解决这种问题,引入异步的重叠操作方式.在这种操作下,当执行完命令,不管写入操作是否完成,写函数马上返回,写操作在后台继续进行,当写操作完成后,通过某种方式通知调用写操作的线程.这样,就避免了主线程被挂起,提高了程序的效率.
一、采用同步查询方式的编程方法
1.创建串口
(1) CreateFile()函数.
该函数是一个通用的创建或打开文件的函数.在winAPI编程中,它不仅可以操作文件也可以操作串口.使用该函数可以打开一个串口,并返回一个句柄,在程序中可以通过访问该句柄来实现对串口的访问.
HANDLE CreateFile (
LPCTSTR lpFileName,
DWORD dwDesireAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile
);
(2)SetupComm()函数
设置串口输入缓冲区及输出缓冲区的大小
BOOL SetupComm (
HANDLE hFile,
DWORD dwInQueue,
DWORD dwOutQueue
);
(3) DCB数据结构
串口通信中,使用该数据结构存放通信参数.
由于该结构包括的通信参数很多,逐个设置不方便.通常的做法是首先将串口的当前设置读出到一个DCB结构中,然后根据需要修改该DCB结构中的某些参数,再以该结构来设置串口通信参数.
(4) SetCommState() 函数
要设置通信参数,首先定义一个DCB结构类型的变量. 根据通信要求,设置该结构变量的数值.然后以该结构变量作为参数,执行该函数即可完成串口通信参数的设置.
BOOL SetCommState (
HANDLE hFile,
LPDCB lpDCB
);
(5) GetCommState() 函数
该函数用来获取当前串口通信参数的设置数值.获取的参数值存放到一个DCB结构类型的变量中.
BOOL GetCommState (
HANDLE hFile,
LPDCB lpDCB
);
2. 关闭串口
关闭串口的操作很简单,只需执行CloseHandle()函数即可.
BOOL CloseHandle (
HANDLE hObject
);
3. 发送数据
发送数据使用WriteFile()函数
BOOL WriteFile (
HANDLE hFile,
LPCVOID lpBuffer,
DWORD nNumberOfBytesToWrite,
LPDWORD lpNumberOfBytesWriten,
LPOVERLAPPED lpOverlapped
);
4. 接收数据
接收数据使用ReadFile()函数
BOOL ReadFile (
HANDLE hFile,
LPCVOID lpBuffer,
DWORD nNumberOfBytesToRead,
LPDWORD lpNumberOfBytesRead,
LPOVERLAPPED lpOverlapped
);
5. 定时接收数据的方法
要实现定时接收数据,需要使用定时器,然后将接收数据的操作放在定时器的响应事件函数中. 主要有以下几步操作:
(1) 编写定时器响应函数
定时器响应函数是全局函数,不属于任何类.直接在cpp文件中书写:
VOID CALLBACK TimerProc (
HWND hwnd, //启动定时器的窗口句柄
UINT uMsg, //消息的名称.应该为WM_TIMER
UINT idEvent, //定时器标识符.表明该回调函数的定时器编号
DWORD dwTime ) //当前系统时间
{
....... //这里加入接收操作代码
}
该函数是个回调函数.当设置的定时器时间到达时,由系统自动调用.
(2) 启动定时器
启动定时器使用SetTimer()函数,该函数可以在程序的任何地方加入.
UINT SetTimer (
HWND hwnd,
UINT nIDEvent,
UINT uElapse,
TIMERPROC lpTimerFunc
);
(3) 关闭定时器
关闭定时器使用KillerTimer() 函数,任何地方加入.
BOOL KillTimer (
HWND hwnd,
UINT uIDEvent,
);