C++ 串口API 异步操作
Win32API 异步串口通讯
使用Win32API实现Windows下异步串口通讯
目录:
1.异步非阻塞串口通讯的优点
2.异步非阻塞串口通讯的基本原理
3.异步非阻塞串口通讯的基础知识
4.异步非阻塞串口通讯的实现步骤
一,异步非阻塞串口通讯的优点
读写串行口时,既可以同步执行,也可以重叠(异步)执行。
在同步执行时,函数直到操作完成后才返回。这意味着在同步执行时线程会被阻塞,从而导致效率下降。在重叠执行时,即使操作还未完成,调用的函数也会立即返回。费时的I/O操作在后台进行,这样线程就可以干别的事情。
例如,线程可以在不同的句柄上同时执行I/O操作,甚至可以在同一句柄上同时进行读写操作。"重叠"一词的含义就在于此。
二,异步非阻塞串口通讯的基本原理
首先,确定要打开的串口名、波特率、奇偶校验方式、数据位、停止位,传递给CreateFile()函数打开特定串口;
其次,为了保护系统对串口的初始设置,调用GetCommTimeouts()得到串口的原始超时设置;
然后,初始化DCB对象,调用SetCommState() 设置DCB,调用SetCommTimeouts()设置串口超时控制;再次,调用SetupComm()设置串口接收发送数据的缓冲区大小,串口的设置就基本完成,之后就可以启动读写线程了。
三,异步非阻塞串口通讯的基础知识
下面来介绍并举例说明一下编写异步非阻塞串口通讯的程序中将会使用到的几个关键函数
CreateFile()
功能:打开串口设备
函数原型
HANDLE CreateFile(
LPCTSTR lpFileName, // 串口名称字符串;如:"COM1" 或"COM2"
利用C#串口操作类实现异步数据接收
// C#异步数据接收串口操作类
// dyj057@
using System;
using System.Runtime.InteropServices;
///
/// (C)2003-2005 C2217 Studio 保留所有权利
///
/// 文件名称: IbmsSerialPort.cs
/// 文件ID:
/// 文件说明:
/// 封装动态链接库IbmsSerialPort.dll的功能,提供在.NET环境中
/// 串口异步接收和发送数据的功能。
///
/// 当前版本: 1.0
///
/// 作者: 邓杨均
/// 创建日期: 2005-2-2
/// 最后修改日期: 2005-2-2
///
/// 历史修改记录:
///
///
namespace Ibms.Tool.IO
{
///
/// 当串口接收到数据时,会产生一个事件。
/// SPRecvDataArgs就是该事件的参数,参数中的RecvData包含接收到的数据。
/// 使用方法:
///
public class SPRecvDataArgs:EventArgs
{
///
/// 接收到的数据组成的字节数组
///
private byte[] recvData;
///
/// 构造函数,需要一个包含数据的byte[]作为初始化参数来实例化SPRecvDataArgs ///
/// 接收到的数据
public SPRecvDataArgs(byte[] recvData)
{
if( recvData == null)
{
throw(new ArgumentNullException());
串口网络编程(API编程一般方法)
VC中串口编程的流程
1、关于串口编程的windows自带的API函数,只有Linux中的编程,也有相应的库函数供调用--后面章节有讲解
(1)CreateFile() --把串口的操作当作一种文件的方式来处理
用途:打开串口
原型:HANDLE CreateFile(LPCTSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDistribution,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile);
参数说明:
-lpFileName:要打开的文件名称。对串口通信来说就是COM1或COM2。
-dwDesiredAccess:读写模式设置。此处应该用GENERIC_READ及GENERIC_WRITE。-dwShareMode:串口共享模式。此处不允许其他应用程序共享,应为0。
-lpSecurityAttributes:串口的安全属性,应为0,表示该串口不可被子程序继承。
-dwCreationDistribution:创建文件的性质,此处为OPEN_EXISTING.
-dwFlagsAndAttributes:属性及相关标志,这里使用异步方式应该用
FILE_FLAG_OVERLAPPED。
-hTemplateFile:此处为0。
操作说明:若文件打开成功,串口即可使用了,该函数返回串口的句柄,以后对串口操作时即可使用该句柄。
异步重叠操作之串口
异步重叠操作之串口
在工控行业,目前总线型通信依然占据半壁江山。常用的如485,CAN等。而面对小型系统时,尤其监控区域遍布在两公里范围内时,通过485-232或者CAN-232转换模块,使用上位机的串口与下属硬件通信组成系统便成了相对节约的一种设计方案。
本文的重点在于讲解异步重叠操作串口的思想以及过程。
所有的IO设备的操作都遵循:创建、读写、关闭三个步骤。
第一步:设计类的成员,其中成员此处不详细讲解,之后方法中用到时再谈
View Code
第二步:创建串口通道,在WINDOWS下,一切都表现得那么像文件操作
m_hPort = CreateFile((LPCWSTR)Device, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
其中CreateFile为API函数,其细节如下:
// 作用: CreateFile函数可用来打开或创建文件和端口,它返回该设备的句柄
// 原型:
// HANDLE CreateFile(
// LPCTSTR lpFileName, // 指向文件名的指针
// DWORD dwDesiredAccess, // 访问模式
(GENERIC_WRITE/GENERIC_READ)。0表示仅允许获得与一个设备有关的信息
// DWORD dwShareMode, // 共享模式
(FILE_SHARE_READ/FILE_SHARE_WRITE)。0表述独占
使用Win32API实现Windows下异步串口通讯
使用Win32API实现Windows下异步串口通讯
关键词:Win32API串口通讯
使用Win32API实现Windows下异步串口通讯(上)- -
目录:
1.异步非阻塞串口通讯的优点
2.异步非阻塞串口通讯的基本原理
3.异步非阻塞串口通讯的基础知识
4.异步非阻塞串口通讯的实现步骤
2005.01.05
一,异步非阻塞串口通讯的优点
读写串行口时,既可以同步执行,也可以重叠(异步)执行。
在同步执行时,函数直到操作完成后才返回。这意味着在同步执行时线程会被阻塞,从而导致效率下降。在重叠执行时,即使操作还未完成,调用的函数也会立即返回。费时的I/O操作在后台进行,这样线程就可以干别的事情。
例如,线程可以在不同的句柄上同时执行I/O操作,甚至可以在同一句柄上同时进行读写操作。"重叠"一词的含义就在于此。
二,异步非阻塞串口通讯的基本原理
首先,确定要打开的串口名、波特率、奇偶校验方式、数据位、停止位,传递给CreateFile()函数打开特定串口;
其次,为了保护系统对串口的初始设置,调用GetCommTimeouts()得到串口的原始超时设置;
然后,初始化DCB对象,调用SetCommState() 设置DCB,调用SetCommTimeouts()设置串口超时控制;再次,调用SetupComm()设置串口接收发送数据的缓冲区大小,串口的设置就基本完成,之后就可以启动读写线程了。
三,异步非阻塞串口通讯的基础知识
下面来介绍并举例说明一下编写异步非阻塞串口通讯的程序中将会使用到的几个关键函数
CreateFile()
c语言异步执行方法
c语言异步执行方法
在C语言中,异步执行通常指的是在主线程中启动一个任务,然后在主线程中继续执行其他任务,而不必等待第一个任务完成。这可以通过使用线程、进程或者异步I/O等机制来实现。
下面是一个使用线程来实现异步执行的简单示例:
```c
include <>
include <>
void thread_func(void arg) {
// 在这里执行异步任务
printf("异步任务执行中...\n");
return NULL;
}
int main() {
pthread_t tid;
int ret;
// 创建线程,并立即返回,主线程继续执行其他任务
ret = pthread_create(&tid, NULL, thread_func, NULL);
if (ret != 0) {
printf("创建线程失败\n");
return -1;
}
// 在这里执行主线程的任务...
printf("主线程执行中...\n");
// 等待线程结束
pthread_join(tid, NULL);
printf("异步任务执行完毕\n");
return 0;
}
```
在上面的示例中,我们使用`pthread_create`函数创建了一个新线程,并在新线程中执行异步任务。主线程在创建线程后继续执行其他任务,而不需要
等待异步任务完成。最后,我们使用`pthread_join`函数等待线程结束,以确保主线程在程序退出之前等待异步任务完成。
打开和关闭串口API
编写串口通讯类程序涉及的主要Windows API函数,目前仅做索引而已:
1.打开串口:用CreateFile函数打开。
2.配置串口:用GetCommState (hComm , &dcb) 函数可读取串口设置的当前DCB结构;用GetCommProperties(hComm,lpCommProp)可知端口允许哪些设置;进行相关设置后用SetCommState (hComm , &dcb) 函数保存DCB设置。
3.超时设置:用GetCommTimeouts (hComm , &timeouts) 可得到超时设置的COMMTIMEOUT结构,作相关超时参数设置后用SetCommTimeouts (hComm , &timeouts) 保存设置。
4.串口读写:用ReadFile函数读取串口数据,如果是异步读取则还需要用GetOverlappedResult函数来完成读取;WriteFile函数向串口写数据;PurgeComm ( hComm,PURGE_TXCLEAR)用于清除串口缓冲区(另参数PURGE_TXABORT中止所有后台写,PURGE_RXABORT中止任何后台读,PURGE_TXCLEAR清除发送缓冲区)。
5.事件驱动I/O:用GetCommMask(hComm,&dwMask)返回可以报告给应用程序的事件(这些事件反映为串口针脚上电平高低的变化);用SetCommMask(hComm,dwMask)设置要等待的一个或多个事件的掩码(比如EV_RING表示测到振铃);用WaitCommEvent(hComm,&dwEvent,&Overlapped)来等待事件发生;额外的EscapeCommFunction函数可直接操纵串口针脚信号(DTR、RTS等)
手把手教你学单片机11-异步串口通信
串口实验
实现一个串口程序,向电脑发送一串数 据。 接收从电脑来的数据,加1后返回给电脑。 通过串口中断的方式来实现,并且理解 串口中断。
定时器1作为波特率发生器
定时器1使用自动重装模式,即模式2。 TH1 = TL1 = 256 - 11059200/(12 * 32 * 9600) = 实现步骤: 1、将定时器1置为自动重装模式。 2、将串口设置为方式1。 3、根据公式计算出定时器1的初值。 4、打开定时器1,打开串口允许接受。
UART异步串口通信
UART是单片机与PC之间的最简单的通信方 式之一,也是单片机之间常用通信。
UART的四种模式
模式0:使用较少,暂时不讲或自学。
模式1:以TXD为例,平时没数据时TXD 为高电平,来了数据,一位起始位0,八 位数据位(一个字节),一位停止位1。
模式2和3:原理和模式1一样,只是添 加了一位奇偶校验位(防止通信出错)。
串口Hale Waihona Puke Baidu特率
常用串口波特率: 300、600、1200、2400、4800、9600、 19200 ……115200; 波特率:就是发送一位数据的速率,即 发送一个数据的持续时间 = 1/baud; SBUF:串口数据缓冲寄存器,发送数据 时,只要将数据送入SBUF,则单片机 自动发送数据,接收数据时,自动将数 据接收至SBUF。
基于Windows API的异步串口通信软件设计
龙源期刊网
基于Windows API的异步串口通信软件设计
作者:黄晓波
来源:《现代电子技术》2011年第16期
摘要:串口是常用的计算机与外部串行设备之间的数据传输通道,在VC++6.0中利用第三方控件实现串口通信时实时性较差,系统资源利用不足,为了提高串口通信的速度和资源利用率,软件采用WindowsAPI函数并基于多线程技术和自定义消息机制的异步串口通信的设计理念,结合串口通信的机理和多线程同步技术,分析了Win32系统下多线程异步串口通信软件
的开发方法。软件主线程是数据采集程序的管理者,串口监测线程(辅助线程)在后台对串口进行实时监视,获得了良好稳定的通信效果。
关键词:串口通信;异步(重叠)I/O;多线程;VC++
中图分类号:TN919-34;TP311 文献标识码:A 文章编号:1004-373X(2011)16-0035-04
qt串口通信的异步问题
qt串口通信的异步问题
Qt串口通信中的异步问题是指在串口通信过程中,数据的发送
和接收是异步进行的,也就是说发送数据的速度和接收数据的速度
可能不一致,可能会出现数据丢失或者混乱的情况。为了解决这个
问题,可以采用以下几种方法:
1. 使用信号与槽机制,在Qt中,可以利用信号与槽机制来实
现串口通信的异步处理。当串口接收到数据时,可以发射一个信号,然后在槽函数中处理接收到的数据。这样可以保证数据的接收和处
理是异步进行的,不会影响程序的运行。
2. 使用Qt的事件循环,Qt提供了事件循环机制,可以在事件
循环中处理串口通信的数据。通过在事件循环中添加串口数据的处
理逻辑,可以保证数据的接收和处理是异步进行的,不会阻塞程序
的运行。
3. 使用多线程,另一种处理串口通信异步问题的方法是使用多
线程。可以将串口通信的接收和处理放在单独的线程中进行,这样
可以保证串口通信不会阻塞主线程的运行,从而实现异步处理。
4. 使用缓冲区,在串口通信过程中,可以使用缓冲区来暂存接收到的数据,然后再进行处理。这样可以解决数据发送和接收速度不一致时可能出现的问题,确保数据的完整性和准确性。
总的来说,在Qt串口通信中处理异步问题,可以结合使用信号与槽机制、事件循环、多线程和缓冲区等方法,以确保数据的发送和接收是异步进行的,从而提高程序的稳定性和可靠性。
异步方式winAPI串口通信
使用winAPI串口通信(二)
分类:Windows转载2009-09-23 16:51 263人阅读评论(0) 收藏举报
采用同步方式的查询方式读取串口数据时,若由于串口操作耗费较长的时间,则程序会被挂起.为解决这种问题,可以在读取数据时采用重叠I/O操作.此时,读写数据的操作在单独的线程中进行,发出读写要求的主线程可以继续运行.当读写数据成功后,读写数据线程可以通过某种方式通知主线程.两个线程协调工作 ,可以明显提高程序的效率.
为了实现重叠I/O操作,主要有如下几个编程步骤: 定义全局变量、创建串口、发出读写操作、读写线程函数的建立、关闭串口等.
1. 定义全局变量
HANDLE hCom; //串口句柄
DWORD ThreadProcWrite(LPVOID pParam); //写线程函数
DWORD ThreadProcRead(LPVOID pParam); //读线程函数
OVERLAPPED Wol = { 0 }; //写操作OVERLAPPED结构变量
OVERLAPPED Rol = { 0 }; //读操作OVERLAPPED结构变量
HANDLE hThreadWrite; //写线程句柄
HANDLE hThreadRead; //读线程句柄
HWND hWnd; //窗口句柄
2. 创建串口
hCom = CreateFile ( "COM2",
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,//使用重叠方式
linux c语言 串口读取数据的方法
linux c语言串口读取数据的方法
Linux下使用C语言读取串口数据的方法
引言:
串口是计算机和外部设备进行通信的一种重要的通信接口。在Linux系统中,要使用C语言读取串口数据,需要通过打开串口设备文件,设置串口参数,并进行读取数据的操作。本文将介绍如何通过C语言在Linux下读取串口数据的方法。
目录:
1. 了解串口的工作原理
2. 打开串口设备文件
3. 设置串口参数
4. 读取串口数据
5. 示例程序
6. 总结
1. 了解串口的工作原理:
在开始编写C语言读取串口数据的方法前,首先需要了解串口的工作原理。串口是通过硬件电路实现两台设备之间的数据传输,属于一种异步串行通信方式。典型的串口包含发送数据引脚(TX)、接收数据引脚(RX)、数据位、停止位、奇偶校验位等。
2. 打开串口设备文件:
在Linux系统中,每个串口设备都被映射到一个设备文件上,例如
/dev/ttyS0代表第一个串口设备,/dev/ttyUSB0代表第一个USB串口设备。要使用C语言读取串口数据,需要首先打开相应的串口设备文件。
在C语言中,使用open()函数打开串口设备文件。open()函数的原型如下:
c
int open(const char *pathname, int flags);
其中pathname参数指定要打开的串口设备文件路径,flags参数指定打开方式。常用的flags参数有O_RDONLY(只读方式打开)、O_WRONLY (只写方式打开)和O_RDWR(读写方式打开)。
例如,要打开第一个串口设备文件,可以调用open()函数如下:
C语言异步编程详解
C语言异步编程详解
异步编程是一种在计算机科学中常用的编程模式,它允许同时执行多个任务,提高程序的并发性和响应速度。C语言作为一种通用的高级编程语言,也有自己的异步编程方式。本文将详细介绍C语言中的异步编程方法和技巧。
一、异步编程的概念和优势
异步编程是一种非阻塞式的编程模式,意味着程序在等待某个任务完成时不会被阻塞,而是会继续执行其他任务。这种方式可以提高程序的效率和性能,特别适用于处理大量的IO操作和并发任务。
在传统的同步编程中,程序需要等待每个任务完成才能继续执行下一个任务,这样会导致程序的响应速度变慢。而异步编程则能够在等待某个任务完成的同时,继续执行其他任务,从而提高了程序的并发性和响应速度。
二、C语言中的异步编程方法
在C语言中,异步编程可以通过以下几种方法实现。
1. 回调函数(Callback)
回调函数是一种常见的异步编程技术,它允许在某个任务完成后自动调用指定的函数。在C语言中,可以通过注册回调函数的方式实现异步操作。
下面是一个简单的示例,演示了如何使用回调函数实现异步编程:
```c
#include <stdio.h>
void asyncOperation(void (*callback)(void)) { // 模拟异步操作
printf("正在执行异步操作...\n");
// 模拟异步操作完成后的回调
callback();
}
void callback() {
printf("异步操作已完成\n");
}
int main() {
asyncOperation(callback);
VC++串口编程API详解
VC++串口编程主要API详解
该文档是本人在刚刚接触到VC++下的串口编程时,总结归纳的一些主要的API函数,可以帮助初学者更好的理解串口编程的方法。
1.打开串口
HANDLE CreateFile( LPCTSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDistribution,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile);
参数:
lpFileName:将要打开的串口逻辑名,如“COM1”;
dwDesiredAccess:指定串口访问的类型,可以是读取、写入或二者并列;dwShareMode:指定共享属性,由于串口不能共享,该参数必须置为0;lpSecurityAttributes:引用安全性属性结构,缺省值为NULL;dwCreationDistribution:创建标志,对串口操作该参数必须置为OPEN_EXISTING;dwFlagsAndAttributes:属性描述,用于指定该串口是否进行异步操作,该值为FILE_FLAG_OVERLAPPED,表示使用异步的I/O;该值为0,表示同步I/O操作,本工程采用异步方式;
hTemplateFile:对串口而言该参数必须置为NULL;
2.获取串口设备控制块DCB
BOOL GetCommState(
HANDLE hFile, //标识通讯端口的句柄,由CreateFile()函数返回的句柄
API串口通信实例[详细]
第一节实现串口通讯的函数及串口编程简介
API函数不仅提供了打开和读写通讯端口的操作方法,还提供了名目繁多的函数以支持对串行通讯的各种操作.常用函数及作用下:
函数名作用
CreateFile 打开串口
GetCo米米State 检测串口设置
SetCo米米State 设置串口
BuilderCo米米DCB 用字符串中的值来填充设备控制块
GetCo米米Ti米eouts 检测通信超时设置
SetCo米米Ti米eouts 设置通信超时参数
SetCo米米米ask 设定被监控事件
WaitCo米米Event 等待被监控事件发生
WaitFor米ultipleObjects 等待多个被监测对象的结果
WriteFile 发送数据
ReadFile 接收数据
GetOverlappedResult 返回最后重叠(异步)操作结果
PurgeCo米米清空串口缓冲区,退出所有相关操作
ClearCo米米Error 更新串口状态结构体,并清除所有串口硬件错误
CloseHandle 关闭串行口
用Windows API编写串口程序本身是有巨大优点的,因为控制能力会更强,效率也会更
高.
API编写串口,过程一般是这样的:
1、创建串口句柄,用CreateFile;
2、对串口的参数进行设置,其中比较重要的是波特率(BaudRate),数据宽度(BytesBits),奇偶校验(Parity),停止位(StopBits),当然,重要的还有端口号(Port);
3、然后对串口进行相应的读写操作,这时候用到ReadFile和WriteFile函数;
4、读写结束后,要关闭串口句柄,用CloseFile.
c语言串口互收发
c语言串口互收发
C语言串口互收发
串口通信是一种常见的通信方式,它通过串行通信口(即串口)传输数据。在嵌入式系统、单片机、工控设备等领域,串口通信被广泛应用。本文将介绍如何使用C语言实现串口的互收发功能。
我们需要了解串口的基本原理。串口通信使用的是异步通信方式,即数据的传输不需要时钟信号。串口由发送端(TX)和接收端(RX)组成,数据通过串口的TX引脚从发送端发送出去,然后通过RX引脚被接收端接收。
在C语言中,我们可以使用串口库来实现串口的互收发。常用的串口库有Windows下的WinAPI和Linux下的termios库。下面以Linux为例,介绍如何使用termios库来实现串口的互收发。
我们需要打开串口设备。可以使用open()函数来打开串口设备文件,例如/dev/ttyS0。打开串口设备后,我们需要进行一系列的配置,包括波特率、数据位、停止位、校验位等。这些配置可以通过termios结构体来完成,然后使用tcsetattr()函数将配置应用到串口设备上。
接下来,我们可以使用read()函数从串口接收数据。read()函数会阻塞直到接收到指定长度的数据或超时。我们可以通过设置超时时间来控制read()函数的阻塞时间。
我们也可以使用write()函数向串口发送数据。write()函数将指定长度的数据发送到串口,并返回实际发送的字节数。需要注意的是,串口是一种半双工通信方式,发送和接收不能同时进行。
除了基本的接收和发送功能,我们还可以通过设置串口的其他参数来实现更多的功能。例如,我们可以设置串口为非阻塞模式,这样read()函数就不会阻塞,可以立即返回。我们还可以设置串口的流控制,如硬件流控制和软件流控制,以提高通信的可靠性和稳定性。在实际应用中,我们可以使用串口进行与外设的通信。例如,我们可以使用串口与传感器进行通信,获取传感器的数据。我们也可以使用串口与其他设备进行通信,如打印机、数码相机等。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C++ 串口API 异步操作50
有谁能说下串口API异步操作的例子,最好有代码的。
如果是BCB的更好,谢谢啦,有些函数直接看的不是很懂。一,我要同时向20个端口发送数据,句柄怎样才能控制好二,如果采用异步操作,怎样操作才最好,需要代码支持谢谢啦初始化:
//串行设备句柄;
HANDLE hComDev=0;
//串口打开标志;
BOOL bOpen=FALSE;
//线程同步事件句柄;
HANDLE hEvent=0;
DCB dcb;
COMMTIMEOUTS timeouts;
//设备已打开
if(bOpen) return FALSE;
//打开COM1
if((hComDev=CreateFile(“COM1”,GENERIC?READ|GENERIC?WRITE,0,N ULL,OPEN?EXISTING,FILE?ATTRIBUTE?NORMAL,NULL))==INVALID?HAN DLE?VALUE)
return FALSE;
//设置超时控制
SetCommTimeouts(hComDev,&timeouts);
//设置接收缓冲区和输出缓冲区的大小
SetupComm(hComDev,1024,512);
//获取缺省的DCB结构的值
GetCommState(hComDev,&dcb);
//设定波特率为9600 bps
dcb.BaudRate=CBR?9600;
//设定无奇偶校验
dcb.fParity=NOPARITY;
//设定数据位为8
dcb.ByteSize=8;
//设定一个停止位
dcb.StopBits=ONESTOPBIT;
//监视串口的错误和接收到字符两种事件SetCommMask(hComDev,EV?ERR|EV?RXCHAR); //设置串行设备控制参数
SetCommState(hComDev,&dcb);
//设备已打开
bOpen=TRUE;
//创建人工重设、未发信号的事件
hEvent=CreateEvent(NULL,FALSE,FALSE, “WatchEvent”);
//创建一个事件监视线程来监视串口事件
AfxBeginThread(CommWatchProc,pParam);
}
数据发送
数据发送利用WriteFile()函数实现。对于同步I/O操作,它的最后一个参数可为NULL;而对异步I/O操作,它的最后一个参数必需是一个指向OVERLAPPED结构的指针,通过OVERLAPPED结构来获得当前的操作状态。
BOOL WriteComm(LPCVOID lpSndBuffer,DWORD dwBytesToWrite)
{
//lpSndBuffer为发送数据缓冲区指针,
dwBytesToWrite为将要发送的字节长度
//设备已打开
BOOL bWriteState;
//实际发送的字节数
DWORD dwBytesWritten;
//设备未打开
if(!bOpen) return FALSE;
bWriteState=WriteFile(hComDev,lpSndBuffer,dwBytesToWrite,&dwBytesWritten,NULL);
if(!bWriteState || dwBytesToWrite!=dwBytesWritten)
//发送失败
return FALSE;
else
//发送成功
return TRUE;
}
数据接收
接收数据的任务由ReadFile函数完成。该函数从串口接收缓冲区中读取数据,读取数据前,先用ClearCommError函数获得接收缓冲区中的字节数。接收数据时,同步和异步读取的差别同发送数据是一样的。
DWORD ReadComm(LPVOID lpInBuffer,DWORD dwBytesToRead)
{
//lpInBuffer为接收数据的缓冲区指针,dwBytesToRead为准备读取的数据长度(字节数)
//串行设备状态结构
COMSTAT ComStat;
DWORD dwBytesRead,dwErrorFlags;
//设备未打开
if(!bOpen) return 0;
//读取串行设备的当前状态
ClearCommError(hComDev,&dwErrorFlags,&ComStat);
//应该读取的数据长度
dwBytesRead=min(dwBytesToRead,ComStat.cbInQue);
if(dwBytesRead>0)
//读取数据
if(!ReadFile(hComDev,lpInBuffer,dwBytesRead,&dwBytesRead,NULL)) dwBytesRead=0;
return dwBytesRead;
}
事件监视线程
事件监视线程对串口事件进行监视,当监视的事件发生时,监视线程可将这个事件发送(SendMessage)或登记(PostMessage)到对事件进行处理的窗口类(由pParam指定)中。
UINT CommWatchProc(LPVOID pParam)
{
DWORD dwEventMask=0; //发生的事件;
while(bOpen)
{
//等待监视的事件发生
WaitCommEvent(hComDev, &dwEventMask,NULL);
if ((dwEventMask &EV?RXCHAR)==EV?RXCHAR)
……//接收到字符事件后,可以将此消息登记到由pParam有指定的窗口类中进行处理
if(dwEventMask &EV?ERR)==EV?ERROR)
……//发生错误时的处理
}
SetEvent(hEvent);
//发信号,指示监视线程结束
return 0;
}
关闭串行设备
在整个应用程序结束或不再使用串行设备时,应将串行设备关闭,包括取消事件监视,将设备打开标志bOpen置为FALSE以使事件监视线程结束,清除发