造冰箱的大熊猫@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

最新文章

  1. Pop Sequence
  2. windws 安装jdk
  3. 20141104--SQL,查询习题,约束
  4. SQLServer数据库通用访问类
  5. 14.5.5 Deadlocks in InnoDB
  6. Business Intelligence (BI)
  7. Spring IOC之基于JAVA的配置
  8. 【转】ActionScript,Flash,Flash/Flex Builder,FlashPlayer,AIR,swf,swc,swz之间的区别
  9. Linux多线程编程——线程的同步
  10. jhipster生成项目无法使用restful请求,报access_denied 403错误
  11. 【java】浅析java组件中的布局管理器
  12. maven项目打jar包
  13. IOS http 请求
  14. 【LeetCode】99. Recover Binary Search Tree
  15. (转)maven3.3.9编译oozie4.3.0
  16. PAT 1006 换个格式输出 C语言
  17. 白盒测试实践项目(day2)
  18. JZYZOJ1355 [usaco2007]奶牛赛跑 矩阵乘法 离散化
  19. 分析成绩 Exercise07_04
  20. VS2017十五项新功能体验

热门文章

  1. macbook下使用pycharm2019版本配置远程连接服务器
  2. 小程序发起get请求====post请求
  3. RAC环境备份,RMAN异机在单实例环境恢复redo问题
  4. charles4.0 request和response的显示设置
  5. 6:Partial Update 内部原理 和 乐观锁并发控制
  6. python 直角图标生成圆角图标
  7. Euraka适合初学者的简单小demo
  8. Ubuntu 18.04 LTS版本 谷歌拼音输入法安装
  9. spring boot 使用GraphQL
  10. Vue项目中遇到的问题汇总