造冰箱的大熊猫@cnblogs 2019/1/27

将Windows下串口编程相关信息进行下简单小结,以备后用。

1、打开串口

打开串口使用CreateFile()函数。以打开COM6为例:

HANDLE hComm;

hComm = CreateFile( TEXT("COM6"), GENERIC_READ | GENERIC_WRITE, , NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );

其中:

- "COM6",待打开串口的串口名。

- GENERIC_READ | GENERIC_WRITE,串口读写权限。

- ,固定值。

- NULL,指向SECURITY_ATTRIBUTES的指针。通常设置为NULL,此时CreateFile()函数返回的句柄不能被子进程继承。

- OPEN_EXISTING,固定值。

- FILE_ATTRIBUTE_NORMAL,文件属性。

- NULL,固定值。

- hComm,函数返回的句柄。如果打开串口成功,则在后续操作中使用该句柄访问串口。如果打开串口失败,函数返回句柄为INVALID_HANDLE_VALUE

这里两点需要说明:

一是CreateFile()、CreateFileA()[1]和CreateFileW()[2]的区别。在大部分说明如何使用Win32 API打开串口的文档中都介绍用CreateFile()函数打开串口,但某些文档中却使用CreateFileA()或CreateFileW()函数。实际上三个函数的功能是相同的,只是所采用的字符串编码格式不同。CreateFileA()函数名中的A代表ANSI,而CreateFileW()中的W代表UNICODE。所谓ANSI编码,是各国根据自己的语言定义的字符编码格式,其中0~0x7F与ASCII字符相同,其余则与具体语言相关。因此,中文ANSI编码(GB2312)和日文ANSI编码无法互通。UNICODE则是将所有语言的编码进行统一,用同一个编码空间覆盖所有语言文字。从下面的代码中可以清楚地看出三个函数的关系。 在前面CreateFile()示例中,TEXT宏的用途就是根据当前操作系统的编码格式对字符串"COM6"进行适当的格式转换。

HANDLE CreateFileA(
__in LPCSTR lpFileName,
__in DWORD dwDesiredAccess,
__in DWORD dwShareMode,
__in_opt LPSECURITY_ATTRIBUTES lpSecurityAttributes,
__in DWORD dwCreationDisposition,
__in DWORD dwFlagsAndAttributes,
__in_opt HANDLE hTemplateFile
); HANDLE CreateFileW(
__in LPCWSTR lpFileName,
__in DWORD dwDesiredAccess,
__in DWORD dwShareMode,
__in_opt LPSECURITY_ATTRIBUTES lpSecurityAttributes,
__in DWORD dwCreationDisposition,
__in DWORD dwFlagsAndAttributes,
__in_opt HANDLE hTemplateFile
); #ifdef UNICODE
#define CreateFile CreateFileW
#else
#define CreateFile CreateFileA
#endif

二是对于串口号大于9的串口(例如COM12),在CreateFile()函数中串口名应写作"\.\COM12"。

2、关闭串口

关闭串口则使用CloseHandle()函数。示例如下:

CloseHandle(hComm);

3、配置串口工作参数

以设置串口为波特率115200,数据位8bit,停止位1bit为例:

DCB dcb;

GetComm(hComm, &dcb);

dcb.BaudRate = CBR_115200;
dcb.ByteSize = ;
dcb.StopBits = ONESTOPBIT; SetCommState(hComm, &dcb);

4、写串口

以发送字符串"abcd"为例:

char  buf[] = "abcd";
DWORD buf_len = ; // 待写入串口的字节数
DWORD written_cnt; // 实际写入串口的字节数 WreteFile( hComm, (void *)buf, buf_len, &written_cnt, NULL );

5、读串口

以读取12个字符为例:

char  buf[];
DWORD toread_cnt = ; // 要从串口读入的字节数
DWORD read_cnt; // 实际从串口读入的字节数 ReadFile( hComm, (void *)buf, toread_cnt, &read_cnt, NULL );

6、清除串口缓冲区

当串口接收到一个字节时,串口驱动程序将接收到的字节写入内存的某个位置(输入缓冲区)。当应用程序读取串口时,操作系统按照“先进先出”的原则从输入缓冲区取出数据交给应用程序。在某些应用场景下,应用程序需要舍弃输入缓冲区内当前数据。这可通过PurgeComm()函数实现。

PurgeComm( hComm, PURGE_RXCLEAR );

7、其它

在Windows操作系统中,计算机上实际存在的或者虚拟的通信端口,包括串口和并口等,统称为通信资源(Communication Resource)。本文总结的串口编程信息对通信资源也是适用的。

本文只涉及简单的串口读写操作,对于流量控制、异步读写、读写操作超时等复杂的串口控制,请参考相关函数微软文档中的详细说明。

参考资料:

[1] 函数CreateFileA()说明 @ Microsoft

[2] 函数CreateFileW()说明 @ Microsoft

[3] 结构DCB说明 @ Microsoft

[4] 函数PurgeComm()说明 @ Microsoft

Windows下串口编程的更多相关文章

  1. 初尝Windows 下批处理编程

    本文叫“ 初尝Windows 下批处理编程”是为了延续上一篇“初尝 Perl”,其实对于博主而言批处理以及批处理编程早就接触过了. 本文包括以下内容 1.什么是批处理 2.常用批处理命令 3.简介批处 ...

  2. 初探WINDOWS下IME编程

    初探WINDOWS下IME编程作者:广东南海市昭信科技有限公司-李建国 大家知道,DELPHI许多控件有IME属性.这么好用的东西VC可没自带,怎么办呢?其实,可通过注册表,用API实现.下面说一下本 ...

  3. Windows API串口编程详解

    (一)Windows API串口通信编程概述 Windows环境下的串口编程与DOS环境下的串口编程有很大不同.Windows环境下的编程的最大特征之一就是设备无关性,它通过设备驱动程序将Window ...

  4. Linux下串口编程【转】

    本文转载自:http://blog.csdn.net/w282529350/article/details/7378388 /************声明:本人只是见到这篇文章对我帮助很大才转载的,但 ...

  5. Linux下串口编程入门

    简介: Linux操作系统从一开始就对串行口提供了很好的支持,本文就Linux下的串行口通讯编程进行简单的介绍. 串口简介  串行口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的使用.常用 ...

  6. Windows下GUI编程——窗口

    windows下创建一个基于GUI的窗口程序很简单,使用MFC或者Win32 API都可以实现.本文简单整理下windows API创建GUI应用程序的基本编码框架. 比较常见的窗口包括:桌面窗口.应 ...

  7. Windows下多线程编程(一)

    前言 熟练掌握Windows下的多线程编程,能够让我们编写出更规范多线程代码,避免不要的异常.Windows下的多线程编程非常复杂,但是了解一些常用的特性,已经能够满足我们普通多线程对性能及其他要求. ...

  8. Windows下Hadoop编程环境配置指南

    刘勇    Email: lyssym@sina.com 本博客记录作者在工作与研究中所经历的点滴,一方面给自己的工作与生活留下印记,另一方面若是能对大家有所帮助,则幸甚至哉矣! 简介 鉴于最近在研究 ...

  9. windows下socket编程:区分shutdown()及closesocket()

    以下描述主要是针对windows平台下的TCP socket而言. 首先需要区分一下关闭socket和关闭TCP连接的区别,关闭TCP连接是指TCP协议层的东西,就是两个TCP端之间交换了一些协议包( ...

随机推荐

  1. Docker入门以及常用命令

    目的: Docker入门 Docker简介 Centos7安装Docker Docker HelloWorld运行原理解析 阿里云镜像仓库配置 Docker常用命令 Docker基本命令 Docker ...

  2. Python 判断字符串是否包含中文

    一.摘要 使用 xlrd 模块打开带中文的excel文件时,会报错. FileNotFoundError: [Errno 2] No such file or directory: 'xx.xlsx' ...

  3. git学习笔记 ---删除文件

    在Git中,删除也是一个修改操作,我们实战一下,先添加一个新文件test.txt到Git并且提交: $ git add test.txt $ git commit -m "add test. ...

  4. 环境配置 python 3.6+Anaconda+cuda9.0+cudNN7.0+Tensorflow

    最近在摸deepfakes代码,一堆环境要配置,过程记录一下吧. 一.安装Python3.6 Ubuntu16.04系统下默认是python2.7.网上说一般不建议卸载系统自带的python,所以保留 ...

  5. Sql 脚本文件太大 还原数据库

    sql脚本太大直接在数据库中执行会提示内存不足,我们看生成的脚本文件会发现每隔100条会有一个GO来分隔,这就好说了 在我将数据库的结构连同数据生成一个脚本文件db.sql 后,想在另外的电脑上恢复数 ...

  6. sharepoint中的Power Shell命令创建、删除文档库列表

    ListTemplateType 枚举: 自定义列表-GenericList.文档库-DocumentLibrary.图片库-PictureLibrary.公告-Announcements.联系人-C ...

  7. undefined reference to cv::imread(cv::String const&, int)

    .build_release/lib/libcaffe-nv.so: undefined reference to cv::imread(cv::String const&, int)' .b ...

  8. 分享个免费的svn平台

    平时在工作中难免会用到svn,但是要自己搭建一个,未免成本太高,近来,本人接触到一个免费的svn平台(可能大神们早就发现了),个人使用还是足够了. 地址:https://svnbucket.com 相 ...

  9. 如何导出ane所需的swc

    来源:http://blog.sina.com.cn/s/blog_6471e1bb01012ard.html 打包.ane文件的时候需要用到ActionScript的扩展库(swc文件),那么如何生 ...

  10. 虹软人脸识别SDK在网络摄像头中的实际应用

    目前在人脸识别领域中,网络摄像头的使用很普遍,但接入网络摄像头和人脸识别SDK有一定门槛,在此篇中介绍过虹软人脸识别SDK的接入流程,本文着重介绍网络摄像头获取视频流并处理的流程(红色框内),以下内容 ...