串口通信常用API总结
串口通信
1、定义
串口(COM接口):串行接口(Serial Interface) 是指数据一位一位地顺序传送,其特点是通信线路简单,只要一对传输线就可以实现双向通信。
2、结构
3、连接方式
计算机(上面的串口) <-> (开发板或其他设备上面的)串口
分别对应着的概念是:
DCE数据发送方串口A<-> DTE数据接收方串口B。A打算发送数据到B中
A设置RTS(Request To Send),表示:请求发送(数据到对方)
正常情况下,数据接收方,B不忙的时候,即不是busy的状态,则:B去设置对应的CTS(Clear To Send):表示OK,对方可以发送数据了
发送者A,可以直接发送数据给B,B也可以去接受数据,处理收到的数据;偶尔特殊的时候,B处于忙的状态,即busy,比如忙着处理上次发送的数据,所以没空理会你这次还要发的数据:那么此时B不去设置对应的CTS,表示自己忙,来不及处理你将要发送的数据,数据发送者A,就继续检测CTS,直到(数据接受者B,忙清了自己手上的活,有空接受数据了,然后)CTS被接受者B去设置对应的CTS,表示可以接受数据了,然后A才去发送数据给B。
DTR/DSR主要是用来做:建立链接,在数据发送和接受之前,先要建立A和B的连接。这时候,才用到DTR/DSR。
4、通信的步骤
在串口通讯的协议层中,规定了数据包的内容,它由启始位、主体数据、校验位以及停止位组成,通讯双方的数据包格式要约定一致才能正常收发数据
串口通信的四个步骤:
(1) 打开串口
CreateFile打开串口,无论是文件、通信设备、命名管道、邮件槽、磁盘、还是控制台,都是用API函数CreateFile来打开或创建的。
HANDLECreateFileA(
LPCSTR lpFileName, // 文件名
DWORD dwDesiredAccess, // 对文件或设备的请求访问
DWORD dwShareMode, //共享模式
LPSECURITY_ATTRIBUTES lpSecurityAttributes, //安全属性,
DWORD dwCreationDisposition, //创作倾向
DWORD dwFlagsAndAttributes,//标志和属性
HANDLE hTemplateFile //模板文件
);
(2) 配置串口
GetCommState函数来获取串口的初始配置。需要通过一个DCB结构来进行。DCB结构包含了诸如波特率、数据位数、奇偶校验和停止位数等信息。在查询或配置串口的属性时,都要用DCB结构来作为缓冲区。要修改串口的配置,应该先修改DCB结构。
BOOL GetCommState(
HANDLE hFile, //标识通讯端口的句柄
LPDCB lpDCB //指向一个设备控制块(DCB结构)的指针
);
程序片段如下:
由SetCommState函数设置COM口的设备控制块:
BOOL SetCommState( HANDLE hFile, LPDCB lpDCB );
调用SetupComm函数可以设置串行口的输入和输出缓冲区的大小。如果通信的速率较高,则应该设置较大的缓冲区
(3) 读写串口
使用ReadFile和WriteFile读写串口。
BOOLReadFile(
HANDLEhFile, // handle to file
LPVOIDlpBuffer, // data buffer
DWORD nNumberOfBytesToRead, // number of bytesto read
LPDWORD lpNumberOfBytesRead, // number of bytesread
LPOVERLAPPED lpOverlapped // overlapped buffer
);
BOOLWriteFile(
HANDLE hFile, //句柄
LPVOID lpBuffer, //数据缓冲区指针
DWORD nNumberOfBytesToRead, //写入的字节数
LPDWORD lpNumberOfBytesRead, //用于保存实际写入的字节数的存储区域 LPOVERLAPPED lpOverlapped //OVERAPPED结构体指针,一般取NULL
);
(4) 关闭串口
调用CloseHandle,使用CreateFile函数返回的句柄作为参数。
CloseHandle(m_hCom);
5、检测串口状态
可以用 GetCommMask() 和 SetCommMask() 来获取或设定目前设定的通讯事件。 WaitCommEvent发出一个状态检查。
(1) BOOL GetCommMask(
HANDLE hFile, //标识通信端口的句柄
LPDWORDlpEvtMask //获取通信事件的指针
);
GetCommMask(m_hCom, &dwMask);
(2) BOOL SetCommMask(
HANDLE hFile, //标识通信端口的句柄
DWORD dwEvtMask //能够使能的通信事件
);
(3) BOOL WINAPI WaitCommEvent(
HANDLE hFile, //标识通信端口的句柄
LPDWORD lpEvtMask, //获取通信事件的指针
LPOVERLAPPED lpOverlapped //异步结构,用来保存异步操作结果。
);
WaitCommEvent(m_hCom,&dwMask, &os)
串口上可能发生的事件:
EV_BREAK |
收到BREAK信号 |
EV_CTS |
CTS(clear to send)线路发生变化 |
EV_DSR |
DST(Data Set Ready)线路发生变化 |
EV_ERR |
线路状态错误,包括了CE_FRAME / CE_OVERRUN / CE_RXPARITY 3种错误 |
EV_RING |
检测到振铃信号 |
EV_RLSD |
CD(Carrier Detect)线路信号发生变化 |
EV_RXCHAR |
输入缓冲区中已收到数据,即接收到一个字节并放入输入缓冲区 |
EV_RXFLAG |
使用SetCommState()函数设置的DCB结构中的等待字符已被传入输入缓冲区中 |
EV_TXEMPTY |
输出缓冲区中的数据已被完全送出 |
举例来说,可以用 SetCommMask() 设定事件为EV_RXCHAR, 那么在呼叫 WaitCommEvent() 时, 它会等到有字符可供读取时才会返回, 那么在它返回之后, 可以检查一下 lpEvtMask 中是否 set 了 EV_RXCHAR, 如果是的话就可以用 ReadFile() 去读取. 这样的话, 可以避免掉某些情形之下, 需要做polling 所引起效率不彰的问题.
6、硬件信号控制
Win32 中提供了EscapeCommFunction() 发送扩展COMM函数允许对几个硬件讯号做控制。参数如下表:
CLRDTR |
让 DTR OFF |
CLRRTS |
让 RTS OFF |
SETDTR |
让 DTR ON |
SETRTS |
让 RTS ON |
SETXOFF |
"仿真" 接收到 XOFF 字符 |
SETXON |
"仿真" 接收到 XON 字符 |
SETBREAK |
和 SetCommBreak() 的意思相同 |
CLRBREAK |
和 ClearCommBreak() 的意思相同 |
BOOLEscapeCommFunction(
HANDLE hFile, //标识通信端口的句柄
DWORD dwFunc //要执行的扩展函数
);
EscapeCommFunction(m_hCom, CLRDTR);
7、其他函数
(1)错误处理
ClearCommError函数也提供通信状态用来表明为什么传输被停止。
BOOLClearCommError(
HANDLE hFile, //标识通信端口的句柄
LPDWORD lpErrors, //接收错误类型的指针
LPCOMSTAT lpStat //返回状态信息的指针
);
ClearCommError(hComm,&dwErrors, &comStat);
(2)通信超时
SetCommTimeouts函数用于为端口指定通信超时。调用GetCommTimeouts函数可以得到端口目前的超时。
BOOLSetCommTimeouts(
HANDLE hFile, //标识通信端口的句柄
LPCOMMTIMEOUTS lpCommTimeouts //指向超时值的指针
);
BOOLGetCommTimeouts(
HANDLE hFile, //标识通信端口的句柄
LPCOMMTIMEOUTS lpCommTimeouts //指向超时值的指针
);
GetCommTimeouts(m_hCom,&TimeOut);
串口通信常用API总结相关推荐
- windows串口通信函数API
windows串口通讯主要函数 先列个目录表 1.CreateFile - 打开串口: 2.SetupComm-初始化一个指定的通信设备的通信参数 3.ReadFile - 读数据: 4.WriteF ...
- 树莓派串口通信 USB串口通信 常用串口命令
树莓派串口通信 USB串口通信 文章目录 树莓派串口通信 USB串口通信 准备 发送数据 接收数据 如果不知道树莓派怎么使用USB串口通信的,欢迎浏览我的另一篇博客文章: 树莓派使用USB串口通信 C ...
- UART串口通信常用协议对比——rs232、485的区别
一.RS232:uart常用的一个协议,uart其实只是一个设备,而协议则是规定在传输时他的传输规则,232协议简单常用的一种协议,接受端和发送端的rxd与txd相连,这样就可以完成传输.因为每端都有 ...
- 基于API函数的串口通信(方法讲解)
用到的串口通信编程方法有:使用通信控件.在高级语言中嵌入汇编以及使用API函数.在这几种方法中,使用API函数编写的串口通信程序最为高效.灵活.串口通信编程将用到三种API函数 --串口通信相关API ...
- 基于Linux的树莓派和电脑之间的串口通信编程
目录 1.串口基本认知 2.USB转TTL,使用ch340通信 2.1 TTL电平 2.2 串口接线方式 3.串口通信常用的API 4.代码通信实例 4.1 发送一个字符/字符串到串口 4.2 树莓 ...
- SPCOMM控件在Delphi7.0串口通信中的应用
====================================================== 注:本文源代码点此下载 ================================= ...
- STM32串口通信原理及实验讲解
串口通信基本原理 串口 串口,顾名思义,即为串行接口,是处理器与外部设备进行串行通信的接口.串行通信是指数据按位进行顺序传输,这种方法占用引脚资源少,但速度相对较慢.串行通信按数据传输方向可分为三种: ...
- WIN32 API串口通信编程
WIN32 API串口通讯实例教程 第一节实现串口通讯的函数及串口编程简介 API函数不仅提供了打开和读写通讯端口的操作方法,还提供了名目繁多的函数以支持对串行通讯的各种操作.常用函数及作用下: 函数 ...
- VC串口通信(Windows API)
本文转载自基于Windows API的VC++串口通信详解,以下附上大白的理解. 简介 在Win32下,可以使用两种编程方式实现串口通信,其一是使用ActiveX控件,这种方法程序简单,但欠灵活.其二 ...
最新文章
- Linux环境PHP7.0安装
- 从AlexNet到BERT:深度学习中那些最重要idea的最简单回顾
- 基于Spring可扩展Schema提供自定义配置支持(spring配置文件中 配置标签支持)
- 15个超实用的php正则表达式
- 电子书网站推荐(收藏系列)
- Eclipse中JRE System Library、Web App Libraries的作用
- python处理csv文件将id相同的行合并到同一行并用符号将其隔开_Python探索性数据分析,这样才容易掌握...
- html5 progress css,CSS内容:HTML5进度上的attr()不起作用
- H3CSE园区-组播路由协议
- 简指南越狱的iOS及原因,负责其
- 看Spring实战有感(一)
- Java String 常量池
- 猴子摘香蕉问题python_用Basic STRIPS算法求解猴子和香蕉
- Hive建外表操作以及其它修改表操作 hive外表与内表区别
- Java女生后来_那些主动的女生后来怎么样了?
- 标签类目体系(面向业务的数据资产设计方法论)-读书笔记8(完结)
- Windwos2008如何关闭IE增强的安全配置
- OHEM,Focal loss,GHM loss二分类pytorch代码实现(减轻难易样本不均衡问题)
- 51 币圈里外的强者愈强----超级君扯淡录【2020-07-13 2100】
- 【520521】程序员中的“芳心纵火犯”, 这就是面向对象编程吗?