没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
使用 Win32API 实现 Windows 下异步串口通讯
目录:
1 . 异步非阻塞串口通讯的优点
2 . 异步非阻塞串口通讯的基本原理
3 . 异步非阻塞串口通讯的基础知识
4 . 异步非阻塞串口通讯的实现步骤
一,异步非阻塞串口通讯的优点
读写串行口时,既可以同步执行,也可以重叠(异步)执行。
在同步执行时,函数直到操作完成后才返回。这意味着在同步执行时线程会被阻塞,从而导致效率下降。
在重叠执行时,即使操作还未完成,调用的函数也会立即返回。费时的 I/O 操作在后台进行,这样线程就
可以干别的事情。
例如,线程可以在不同的句柄上同时执行 I/O 操作,甚至可以在同一句柄上同时进行读写操作。"重叠"一
词的含义就在于此。
二,异步非阻塞串口通讯的基本原理
首先,确定要打开的串口名、波特率、奇偶校验方式、数据位、停止位,传递给 CreateFile()函数打开特
定串口;
其次,为了保护系统对串口的初始设置,调用 GetCommTimeouts()得到串口的原始超时设置;
然后,初始化 DCB 对象,调用 SetCommState() 设置 DCB,调用 SetCommTimeouts()设置串口超时控
制;
再次,调用 SetupComm()设置串口接收发送数据的缓冲区大小,串口的设置就基本完成,之后就可以启
动读写线程了。
三,异步非阻塞串口通讯的基础知识
下面来介绍并举例说明一下编写异步非阻塞串口通讯的程序中将会使用到的几个关键函数
CreateFile()
功能:打开串口设备
函数原型
HANDLE CreateFile(
LPCTSTR lpFileName, // 串口名称字符串;如: "COM1" 或 "COM2"
DWORD dwDesiredAccess, // 设置读写属性(访问模式 );一般为 GENERIC_READ|
GENERIC_WRITE,
DWORD dwShareMode, // 共享模式;"必须" 为 0, 即不能共享
LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 安全属性;一般为 NULL
DWORD dwCreationDistribution, // 创建方式,串口设置必须设置此值; 在这里"必须" 为
OPEN_EXISTING
DWORD dwFlagsAndAttributes, // 文件属性和标志;在这里我们设置成 FILE_FLAG_OVERLAPPED ,
实现异步 I/O
HANDLE hTemplateFile // 临时文件的句柄,通常为 NULL7
);
说明:
如果调用成功,那么该函数返回文件的句柄,如果调用失败,则函数返回 INVALID_HANDLE_VALUE。
Forexample:
Handle m_hComm = CreateFile(com1,GENERIC_READ||
GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,0);
CloseHandle();
功能:关闭串口
BOOL CloseHandle(
HANDLE hObject // handle to object to close
)
这个,我想就不多说了吧!
GetCommState()
功能:获得串口状态
BOOL GetCommState(
HANDLE hFile, // handle of communications device
LPDCB lpDCB // address of device-control block structure
);
SetCommState()
功能:设置串口状态
BOOL SetCommState(
HANDLE hFile, // handle of communications device
LPDCB lpDCB // address of device-control block structure
);
说明:
在打开通信设备句柄后,常常需要对串行口进行一些初始化工作。这需要通过一个 DCB 结构来进
行。DCB 结构包含了诸如波特率、每个字符的数据位数、奇偶校验和停止位数等信息。在查询或配置置
串行口的属性时,都要用 DCB 结构来作为缓冲区。
调用 GetCommState 函数可以获得串口的配置,该函数把当前配置填充到一个 DCB 结构中。一般在用
CreateFile 打开串行口后,可以调用 GetCommState 函数来获取串行口的初始配置。要修改串行口的配
置,应该先修改 DCB 结构,然后再调用 SetCommState 函数用指定的 DCB 结构来设置串行口
Forexample:
DCB dcb;
memset(&dec,0,dizeof(dcb));
if(!GetCommState(HComm,&dcb))//获取当前 DCB 配置
7return FALSE;7
dcb.BaudRate = CBR_9600;//修改数据传输率
............
if(SetCommState(hComm,&dcb))//设置新参数
......7777//错误处理
BuildCommDCB()
功能:初始化 DCB 结构
BOOL BuildCommDCB(
LPCTSTR lpDef, // pointer to device-control string
LPDCB lpDCB // pointer to device-control block
);
Forexample:
DCB dcb;
memset(&dcb,0,sizeof(dcb));
dcb.DCBlength = sizeof(dcb);
if(!BuildCommDCb("9600,n,8,1",&dcb))//"baud=9600 parity=N data=8 stop=1"
{
7......77//参数修改错误
7return FALSE;
}
else
{
......77//己准备就绪
}
说明:功能同上面的例子。
SetupComm()
功能:设置 I/O 缓冲区的大小
函数原型:
BOOL SetupComm(
7 HANDLE hFile,7777 // handle to communications device
7 DWORD dwInQueue,7 // size of input buffer
7 DWORD dwOutQueue7 // size of output buffer
);
说明:
除了在 DCB 中的设置外,程序一般还需要设置 I/O 缓冲区的大小和超时。Windows 用 I/O 缓冲区来暂存
串行口输入和输出的数据,如果通信的速率较高,则应该设置较大的缓冲区。调用 SetupComm 函数可以
设置串行口的输入和输出缓冲区的大小。
先介绍一个结构:COMMTIMEOUTS
typedef struct _COMMTIMEOUTS {7
DWORD ReadIntervalTimeout; // 读间隔超时
DWORD ReadTotalTimeoutMultiplier; // 读时间系数
DWORD ReadTotalTimeoutConstant; // 读时间常量
DWORD WriteTotalTimeoutMultiplier; // 写时间系数
DWORD WriteTotalTimeoutConstant; // 写时间常量
} COMMTIMEOUTS,*LPCOMMTIMEOUTS;
再介绍两个函数
GetCommTimeouts
功能:读取 TimeOut 的值
函数原型:
BOOL GetCommTimeouts(
剩余13页未读,继续阅读
gubojia
- 粉丝: 6
- 资源: 27
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
- 4
- 5
- 6
前往页