通常使用下列函数来通过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 。
  函数的声明定义:

  1.   HANDLE WINAPI CreateFile(
  2. _In_ LPCTSTR lpFileName,
  3. _In_ DWORD dwDesiredAccess,
  4. _In_ DWORD dwShareMode,
  5. _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes,
  6. _In_ DWORD dwCreationDisposition,
  7. _In_ DWORD dwFlagsAndAttributes,
  8. _In_opt_ HANDLE hTemplateFile
  9. );

参数列表:

 部分参数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 允许对文件进行重叠操作。
  函数声明定义:

  1.  BOOL WINAPI ReadFile(
  2. __in HANDLE hFile, // 文件句柄
  3. __out LPVOID lpBuffer, // 接收数据用的 buffer
  4. __in DWORD nNumberOfBytesToRead, // 要读取的字节数
  5. __out LPDWORD lpNumberOfBytesRead, // 实际读取到的字节数
  6. __in LPOVERLAPPED lpOverlapped // OVERLAPPED 结构,一般设定为 NULL
  7. );

代码示例:、

  1. BOOL Read(char *filePath)
  2. {
  3. HANDLE pFile;
  4. DWORD fileSize;
  5. char *buffer,*tmpBuf;
  6. DWORD dwBytesRead,dwBytesToRead,tmpLen;
  7.  
  8. pFile = CreateFile(filePath,GENERIC_READ,
  9. FILE_SHARE_READ,
  10. NULL,
  11. OPEN_EXISTING, //打开已存在的文件
  12. FILE_ATTRIBUTE_NORMAL,
  13. NULL);
  14.   // 创建设备文件,返回文件的位置
  15. if ( pFile == INVALID_HANDLE_VALUE)
  16. {
  17. printf("open file error!\n");
  18. CloseHandle(pFile);
  19. return FALSE;
  20. }
  21.   
  22. fileSize = GetFileSize(pFile,NULL); //得到文件的大小
  23.  
  24. buffer = (char *) malloc(fileSize);
  25. ZeroMemorybuffer,fileSize);
  26. dwBytesToRead = fileSize;
  27. dwBytesRead = ;
  28. tmpBuf = buffer;
  29.  
  30. do{ //循环读文件,确保读出完整的文件
  31.  
  32. ReadFile(pFile,tmpBuf,dwBytesToRead,&dwBytesRead,NULL);
  33.  
  34. if (dwBytesRead == )
  35. break;
  36.  
  37. dwBytesToRead -= dwBytesRead;
  38. tmpBuf += dwBytesRead;
  39.  
  40. } while (dwBytesToRead > );
  41.  
  42. // TODO 处理读到的数据 buffer
  43.  
  44. free(buffer);
  45. CloseHandle(pFile);
  46.  
  47. return TRUE;
  48. }

3. WriteFile

  将数据写入一个文件(设备文件,通信)。该函数比fwrite函数要灵活的多。也可将这个函数应用于对通信设备、管道、套接字以及邮槽的处理。返回时,TRUE(非零)表示成功,否则返回零。会设置GetLastError。
函数声明定义:

  1. BOOL WINAPI WriteFile(
  2. __in HANDLE hFile, // 文件句柄
  3. __in LPCVOID lpBuffer, // 要写入的数据
  4. __in DWORD nNumberOfBytesToWrite, // 要写入的字节数
  5. __out LPDWORD lpNumberOfBytesWritten, // 实际写入的字节数
  6. __in LPOVERLAPPED lpOverlapped // OVERLAPPED 结构,一般设定为 NULL
  7. );

示例代码:

  1. BOOL Write(char *buffer, DWORD contentLen)
  2. {
  3. HANDLE pFile;
  4. char *tmpBuf;
  5. DWORD dwBytesWrite,dwBytesToWrite;
  6.  
  7. pFile = CreateFile(filePath,GENERIC_WRITE,
  8. ,
  9. NULL,
  10. CREATE_ALWAYS, //总是创建文件
  11. FILE_ATTRIBUTE_NORMAL,
  12. NULL);
  13.  
  14. if ( pFile == INVALID_HANDLE_VALUE)
  15. {
  16. printf("create file error!\n");
  17. CloseHandle(pFile);
  18. return FALSE;
  19. }
  20.  
  21. dwBytesToWrite = contentLen;
  22. dwBytesWrite = ;
  23.  
  24. tmpBuf = buffer;
  25.  
  26. do{ //循环写文件,确保完整的文件被写入
  27.  
  28. WriteFile(pFile,tmpBuf,dwBytesToWrite,&dwBytesWrite,NULL);
  29.  
  30. dwBytesToWrite -= dwBytesWrite;
  31. tmpBuf += dwBytesWrite;
  32.  
  33. } while (dwBytesToWrite > );
  34.  
  35. CloseHandle(pFile);
  36.  
  37. return TRUE;
  38. }

参考博客:

http://www.cnblogs.com/findumars/p/5636108.html

打开Usb

http://blog.csdn.net/dongpanshan/article/details/7898583

endl;

C/C++ 打开串口和关闭串口的更多相关文章

  1. C# 串口操作系列(2) -- 入门篇,为什么我的串口程序在关闭串口时候会死锁 ?

    第一篇文章我相信很多人不看都能做的出来,但是,用过微软SerialPort类的人,都遇到过这个尴尬,关闭串口的时候会让软件死锁.天哪,我可不是武断,算了.不要太绝对了.99.9%的人吧,都遇到过这个问 ...

  2. raspi串口、python串口模块pyserial

    一.安装 1.下载软件包pyserial-2.7.tar.gz   网址:https://pypi.python.org/pypi/pyserial 2.8uftp上传至/usr/local/src/ ...

  3. PIC18F45K80串口1和串口2异步收发通信实例

    PIC18F45K80串口1和串口2异步收发通信实例 一:配置串口1初始化函数 首先打开技术手册,查看异步串口的操作流程以及配置. 需要将串口对应引脚的方向寄存器设置为输入

  4. 安卓基于谷歌串口api进行串口开发

    准备材料 AndroidStudio 谷歌android-serialport-api 前情提要 网上提供很多基于c语言对安卓串口开发,有jni.cmake等等,不过都太高深,谷歌提供的api已经可以 ...

  5. Qt之先用了再说系列-串口通讯(单串口单线程)

    QT 串口通讯(单串口单线程) 串口通讯在我们写程序的时候或多或少会用到,借此在这记录一下QT是如何使用串口来通讯的.本次先侃侃在单线程下使用1个串口来通讯过程.好了,废话不多说,直接看步骤,我们的宗 ...

  6. Linux 虚拟串口及 Qt 串口通信实例

    Linux 虚拟串口及 Qt 串口通信实例 2011-06-22 17:49 佚名 互联网 字号:T | T Linux 虚拟串口及 Qt 串口通信实例是本文所要介绍的内容,在实现过程中,打开了两个伪 ...

  7. js打开新页面 关闭当前页 关闭父页面

    js打开新页面.关闭当前页.关闭父页面 2010-04-29 14:04:13|  分类: 页面与JavaScript |  标签: |字号大中小 订阅     //关闭当前页面,并且打开新页面,(不 ...

  8. C-Lodop提示“有窗口已打开,先关闭它(持续如此请刷新页面)!”

    c-lodop显示“有窗口已打开,先关闭它(持续如此时请刷新页面)!”如果连续执行多个预览语句等导致的,可以预先判断一下,并可以自定义修改窗口已打开的提示,该默认提示的位置如本博客的下图http:// ...

  9. Code::Blocks之自动打开上次未关闭工作空间

    问题:如何设置Code::Blocks,使每次打开软件时,自动打开上次未关闭的工作空间? 设置(S) -> 环境设置...(E) -> 常规设置: 勾选"在程序启动时" ...

随机推荐

  1. js 箭头函数

    箭头函数 ES6标准新增了一种新的函数:Arrow Function(箭头函数). x => x * x相当于: function (x) { return x * x; }箭头函数相当于匿名函 ...

  2. Cmder安装配置

    转: 1)Windows 命令行增强 cmder chocolatey 配置指南 2) Windows必备神器Cmder使用教程 3)Windows上的程序员神器——Cmder 4)Windows命令 ...

  3. HDU 3407.Zjnu Stadium 加权并查集

    Zjnu Stadium Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  4. python基础之Day5

    一.基本概念 为什么要有数据: 计算机能够像人一样识别现实生活中的状态是因为计算机事先将数据存到了记忆中 为什么要分类型: 满足现实世界不同状态的需要 二.数据类型(研究定义,作用,常见操作) 1.整 ...

  5. 需求文件requirements.txt的创建及使用

    pip freeze >requirements.txt pip install -r requirements.txt

  6. qt 5.2.1类和模块的关系图

    QT│  ├─ActiveQt│  │  ActiveQt│  │  ActiveQtDepends│  │  ActiveQtVersion│  │  QAxAggregated│  │  QAxB ...

  7. macOS X Mount NFS Share / Set an NFS Client

    last updated November 3, 2018 in CategoriesLinux, Mac OS X, UNIX How do I access my enterprise NAS s ...

  8. [Robot Framework] 执行时报 webdriver 异常

    在用Robot Framework通过Selenium2Library做web界面自动化测试的时候,报webdriver的错误: 此种情况是因为WebDriver的版本与浏览器的版本不对应. WebD ...

  9. urllib和requests库

    目录 1. Python3 使用urllib库请求网络 1.1 基于urllib库的GET请求 1.2 使用User-Agent伪装后请求网站 1.3 基于urllib库的POST请求,并用Cooki ...

  10. default(T) 和 typeof 和 GetType()

    一.default(T) 在泛型编成中如果不限制T类型参数是值类型或引用类型的话 你程序内部可能会出现错误,因为值类型不允许NULL.所以default用来获取一个类型的默认值,对于值类型得到new ...