Windows下串口编程
?造冰箱的大熊猫@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,为串口读写权限。 - 0,固定值。 - 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则是将所有语言的编码进行统一,用同一个编码空间覆盖所有语言文字。从下面的代码中可以清楚地看出三个函数的关系 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_opt HANDLE hTemplateFile ); #ifdef UNICODE #define CreateFile CreateFileW #else #define CreateFile CreateFileA #endif ?实际上,在前面CreateFile()示例中,TEXT宏的用途就是根据当前操作系统的编码格式对字符串"COM6"进行适当的格式转换。 ? 二是对于串口号大于9的串口(例如COM12),在CreateFile()函数中串口名应写作".COM12"。 ? 2、关闭串口 关闭串口则使用CloseHandle()函数。示例如下: CloseHandle(hComm); ? 3、配置串口工作参数 以设置串口为波特率115200,数据位8bit,停止位1bit为例: DCB dcb; GetComm(hComm,&dcb); dcb.BaudRate = CBR_115200; dcb.ByteSize = 8; dcb.StopBits = ONESTOPBIT; SetComm(hComm,&dcb); ? 4、写串口 以发送字符串"abcd"为例: char buf[] = "abcd"; DWORD buf_len = 4; // 待写入串口的字节数 DWORD written_cnt; // 实际写入串口的字节数 WreteFile( hComm,(void *)buf,buf_len,&written_cnt,NULL ); ? ?5、读串口 以读取12个字符为例: char buf[128]; DWORD toread_cnt = 12; // 要从串口读入的字节数 DWORD read_cnt; // 实际从串口读入的字节数 ReadFile( hComm,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 7上使用带有RSelenium的phantomjs
- 如何使用Windows PC调试ios.iphone的webite
- zfs – Windows Server 2016群集磁盘的LIO iSCSI目标 – 设
- true-type-fonts – cmap的Microsoft OpenType规范
- windows – 草莓Perl libeay32_.dll问题
- winapi – 如何播放标准Windows声音?
- 有没有办法使用Windows命令获取纪元时间?
- windows-server-2008-r2 – 安装Server 2008 R2 SP1后没有R
- 使用Azure容器注册表从C#创建新的Azure容器实例
- Windows运行时 – WinRT / Metro是否支持多台显示器?