C/C++ 打开串口和关闭串口
通常使用下列函数来通过Win系统来对外围设备进行通信处理:
0. 前言
做串口方面的程序,使用CreateFile打开串口通信端口。在对串口操作之前,需要首先打开串口。使用C++进行串口编程,如果采用VS开发,则可以直接借助于串口通信控件来操作,其次,直接调用Windows的底层API函数来控制串口通信。
在Window 32bit 的操作系统上, 将串口(通信设备)作为文件来处理,所以串口的打开、关闭、读写所使用的API函数与文件操作一样。所以打开串口使用CreateFile函数,读写串口使用ReadFile、WriteFile,函数。关闭串口使用CloseHandle函数。
1. 查看通信串口设备,可以在设备管理器中查看;
2.
-------------------------------
1. CreateFile
这个函数的功能是创建或者打开一个文件或者I/O设备,通常使用的I/O形式有文件、文件流、目录、物理磁盘、卷、终端流等。如执行成功,则返回文件句柄。 INVALID_HANDLE_VALUE 表示出错,会设置 GetLastError 。
函数的声明定义:
HANDLE WINAPI CreateFile(
_In_ LPCTSTR lpFileName,
_In_ DWORD dwDesiredAccess,
_In_ DWORD dwShareMode,
_In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes,
_In_ DWORD dwCreationDisposition,
_In_ DWORD dwFlagsAndAttributes,
_In_opt_ HANDLE hTemplateFile
);
参数列表:

部分参数Tips:
1. lpFileName:指定要打开的串口逻辑名,用字符串来表示。如COM1, COM2,分别表示串口1,和串口2.
如果要确定工控机上有那些串口,可以使用设备管理器查看。如下图:

查看方式如下图:我的电脑,右键, 开发“设备管理器”即可。

2. dwDesiredAccess:端口属性的访问类型,
3. dwShareMode:指定端口的共享属性。
该参数是由那些应用程序共享的文件提供。对于串口来说,是不能共享的,因此,必须设置为0,这是通信设备与文件的特殊差别。
如果当前的应用程序调用CreateFile打开一个串口,另外一个程序如果已经打开了该串口,此时CreateFile会返回一个错误代码。
然而,同一个应用程序的多个线程是可以共享CreateFile返回的端口句柄。并且根据安全属性设置,该句柄可以打开端口的应用程序的子程序来继承。
4. lpSecurityAttributes:安全属性,一般该参数为NULL,即该端口被设置为缺省的安全属性。缺省安全属性下,端口的句柄是不能继承的。
5. dwCreationDisposition:指定此端口正在被其他程序占用采取的动作,因为串口总是存在的,因此必须设置为OPEN_EXISTing, 该标志高速Windows不要创建新的端口。而是打开一个已经存在的端口。
, 6. dwFlagsAndSttributes:描述了端口的各种属性,对于文件来说有很多属性,但是对于串口来说,唯一的意义是FILE_FLAG _OVERLAPPED 属性,当设置该属性时,端口IO可以在后台进行,称为异步IO重叠结构。
7. hTemplateFile: 指定模板的文件句柄,对于串口来说,此参数必须设置为0;

关闭串口
关闭串口,使用CloseHandle,函数声明为:

函数很简单,参数是使用CreateFile打开的端口句柄。调用这个函数可以实现串口关闭。
示例如下:

2. ReadFile
从文件指针指向的位置(设备文件,通信)开始将数据读出到一个文件中, 且支持同步和异步操作,如果文件打开方式没有指明FILE_FLAG_OVERLAPPED的话,当程序调用成功时,它将实际读出文件的字节数保存到lpNumberOfBytesRead指明的地址空间中。FILE_FLAG_OVERLAPPED 允许对文件进行重叠操作。
函数声明定义:
BOOL WINAPI ReadFile(
__in HANDLE hFile, // 文件句柄
__out LPVOID lpBuffer, // 接收数据用的 buffer
__in DWORD nNumberOfBytesToRead, // 要读取的字节数
__out LPDWORD lpNumberOfBytesRead, // 实际读取到的字节数
__in LPOVERLAPPED lpOverlapped // OVERLAPPED 结构,一般设定为 NULL
);
代码示例:、
BOOL Read(char *filePath)
{
HANDLE pFile;
DWORD fileSize;
char *buffer,*tmpBuf;
DWORD dwBytesRead,dwBytesToRead,tmpLen; pFile = CreateFile(filePath,GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING, //打开已存在的文件
FILE_ATTRIBUTE_NORMAL,
NULL);
// 创建设备文件,返回文件的位置
if ( pFile == INVALID_HANDLE_VALUE)
{
printf("open file error!\n");
CloseHandle(pFile);
return FALSE;
}
fileSize = GetFileSize(pFile,NULL); //得到文件的大小 buffer = (char *) malloc(fileSize);
ZeroMemory(buffer,fileSize);
dwBytesToRead = fileSize;
dwBytesRead = ;
tmpBuf = buffer; do{ //循环读文件,确保读出完整的文件 ReadFile(pFile,tmpBuf,dwBytesToRead,&dwBytesRead,NULL); if (dwBytesRead == )
break; dwBytesToRead -= dwBytesRead;
tmpBuf += dwBytesRead; } while (dwBytesToRead > ); // TODO 处理读到的数据 buffer free(buffer);
CloseHandle(pFile); return TRUE;
}
3. WriteFile
将数据写入一个文件(设备文件,通信)。该函数比fwrite函数要灵活的多。也可将这个函数应用于对通信设备、管道、套接字以及邮槽的处理。返回时,TRUE(非零)表示成功,否则返回零。会设置GetLastError。
函数声明定义:
BOOL WINAPI WriteFile(
__in HANDLE hFile, // 文件句柄
__in LPCVOID lpBuffer, // 要写入的数据
__in DWORD nNumberOfBytesToWrite, // 要写入的字节数
__out LPDWORD lpNumberOfBytesWritten, // 实际写入的字节数
__in LPOVERLAPPED lpOverlapped // OVERLAPPED 结构,一般设定为 NULL
);
示例代码:
BOOL Write(char *buffer, DWORD contentLen)
{
HANDLE pFile;
char *tmpBuf;
DWORD dwBytesWrite,dwBytesToWrite; pFile = CreateFile(filePath,GENERIC_WRITE,
,
NULL,
CREATE_ALWAYS, //总是创建文件
FILE_ATTRIBUTE_NORMAL,
NULL); if ( pFile == INVALID_HANDLE_VALUE)
{
printf("create file error!\n");
CloseHandle(pFile);
return FALSE;
} dwBytesToWrite = contentLen;
dwBytesWrite = ; tmpBuf = buffer; do{ //循环写文件,确保完整的文件被写入 WriteFile(pFile,tmpBuf,dwBytesToWrite,&dwBytesWrite,NULL); dwBytesToWrite -= dwBytesWrite;
tmpBuf += dwBytesWrite; } while (dwBytesToWrite > ); CloseHandle(pFile); return TRUE;
}
参考博客:
http://www.cnblogs.com/findumars/p/5636108.html
打开Usb
http://blog.csdn.net/dongpanshan/article/details/7898583
endl;
C/C++ 打开串口和关闭串口的更多相关文章
- C# 串口操作系列(2) -- 入门篇,为什么我的串口程序在关闭串口时候会死锁 ?
第一篇文章我相信很多人不看都能做的出来,但是,用过微软SerialPort类的人,都遇到过这个尴尬,关闭串口的时候会让软件死锁.天哪,我可不是武断,算了.不要太绝对了.99.9%的人吧,都遇到过这个问 ...
- raspi串口、python串口模块pyserial
一.安装 1.下载软件包pyserial-2.7.tar.gz 网址:https://pypi.python.org/pypi/pyserial 2.8uftp上传至/usr/local/src/ ...
- PIC18F45K80串口1和串口2异步收发通信实例
PIC18F45K80串口1和串口2异步收发通信实例 一:配置串口1初始化函数 首先打开技术手册,查看异步串口的操作流程以及配置. 需要将串口对应引脚的方向寄存器设置为输入
- 安卓基于谷歌串口api进行串口开发
准备材料 AndroidStudio 谷歌android-serialport-api 前情提要 网上提供很多基于c语言对安卓串口开发,有jni.cmake等等,不过都太高深,谷歌提供的api已经可以 ...
- Qt之先用了再说系列-串口通讯(单串口单线程)
QT 串口通讯(单串口单线程) 串口通讯在我们写程序的时候或多或少会用到,借此在这记录一下QT是如何使用串口来通讯的.本次先侃侃在单线程下使用1个串口来通讯过程.好了,废话不多说,直接看步骤,我们的宗 ...
- Linux 虚拟串口及 Qt 串口通信实例
Linux 虚拟串口及 Qt 串口通信实例 2011-06-22 17:49 佚名 互联网 字号:T | T Linux 虚拟串口及 Qt 串口通信实例是本文所要介绍的内容,在实现过程中,打开了两个伪 ...
- js打开新页面 关闭当前页 关闭父页面
js打开新页面.关闭当前页.关闭父页面 2010-04-29 14:04:13| 分类: 页面与JavaScript | 标签: |字号大中小 订阅 //关闭当前页面,并且打开新页面,(不 ...
- C-Lodop提示“有窗口已打开,先关闭它(持续如此请刷新页面)!”
c-lodop显示“有窗口已打开,先关闭它(持续如此时请刷新页面)!”如果连续执行多个预览语句等导致的,可以预先判断一下,并可以自定义修改窗口已打开的提示,该默认提示的位置如本博客的下图http:// ...
- Code::Blocks之自动打开上次未关闭工作空间
问题:如何设置Code::Blocks,使每次打开软件时,自动打开上次未关闭的工作空间? 设置(S) -> 环境设置...(E) -> 常规设置: 勾选"在程序启动时" ...
随机推荐
- C# web服务器被webbench攻击及目现采用的防御措施
web服务器连续两次出现CPU达到100%的情况,第一次还想着是升级时,哪个地方写错了,有死循环,最后重启了三次服务器才好. 但事后分析代码,没有死循环的可能,于是在第二次又出现CPU达100%时,仔 ...
- Gulp应用场景
转自:Gulp教程之:Gulp能做什么,前端装逼为何要用它 我们先说说 平时web开发遇到的一些场景 和 苦恼无奈的情况: JavaScript和CSS的版本问题 我们都知道 JavaScript ...
- iOS.OpenSource.PopularProject
1. Core Plot Core Plot is a plotting framework for OS X and iOS. It provides 2D visualization of dat ...
- 使用vmware安装ubuntu不能上网
桌面版的话,进入桌面后还可以配置,服务版,我是在安装过程中提示的网络配置时候按照下面的方法手动配置的 安装虚拟机时候要安装网络服务,有的虚拟机在安装过程中可能已经安装好了,主机保持VMware NAT ...
- JDBC连接MySql,配置url报错
使用JDBC连接MySql时出现:The server time zone value '�й���ʱ��' is unrecognized or represents more than one ...
- mybatis学习 十二 多表查询
Mybatis 实现多表查询方式: (1)业务装配.对两个表编写单表查询语句,在业务(Service)把查询的两个结果进行关联. (2)使用Auto Mapping特性,在实现两表联合查询时通过别名完 ...
- python入门之文件处理
1.读取文件 f=open(file="C:\BiZhi\新建文本文档.txt",mode="r",encoding="utf-8") da ...
- 687. Longest Univalue Path
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode ...
- 如何将spring boot项目打包成war包
一.修改打包形式 在pom.xml里设置 <packaging>war</packaging> 二.移除嵌入式tomcat插件 在pom.xml里找到spring-boot-s ...
- IOS tableView的一些问题总结
1.与用户的交互的开启和关闭 tableView.userInteractionEnabled = NO; 2.TableView的Group样式中,默认的每个section都有sectionHe ...