串口通信

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总结相关推荐

  1. windows串口通信函数API

    windows串口通讯主要函数 先列个目录表 1.CreateFile - 打开串口: 2.SetupComm-初始化一个指定的通信设备的通信参数 3.ReadFile - 读数据: 4.WriteF ...

  2. 树莓派串口通信 USB串口通信 常用串口命令

    树莓派串口通信 USB串口通信 文章目录 树莓派串口通信 USB串口通信 准备 发送数据 接收数据 如果不知道树莓派怎么使用USB串口通信的,欢迎浏览我的另一篇博客文章: 树莓派使用USB串口通信 C ...

  3. UART串口通信常用协议对比——rs232、485的区别

    一.RS232:uart常用的一个协议,uart其实只是一个设备,而协议则是规定在传输时他的传输规则,232协议简单常用的一种协议,接受端和发送端的rxd与txd相连,这样就可以完成传输.因为每端都有 ...

  4. 基于API函数的串口通信(方法讲解)

    用到的串口通信编程方法有:使用通信控件.在高级语言中嵌入汇编以及使用API函数.在这几种方法中,使用API函数编写的串口通信程序最为高效.灵活.串口通信编程将用到三种API函数 --串口通信相关API ...

  5. 基于Linux的树莓派和电脑之间的串口通信编程

    目录 1.串口基本认知 2.USB转TTL,使用ch340通信 2.1 TTL电平 2.2 串口接线方式 ​3.串口通信常用的API 4.代码通信实例 4.1 发送一个字符/字符串到串口 4.2 树莓 ...

  6. SPCOMM控件在Delphi7.0串口通信中的应用

    ====================================================== 注:本文源代码点此下载 ================================= ...

  7. STM32串口通信原理及实验讲解

    串口通信基本原理 串口 串口,顾名思义,即为串行接口,是处理器与外部设备进行串行通信的接口.串行通信是指数据按位进行顺序传输,这种方法占用引脚资源少,但速度相对较慢.串行通信按数据传输方向可分为三种: ...

  8. WIN32 API串口通信编程

    WIN32 API串口通讯实例教程 第一节实现串口通讯的函数及串口编程简介 API函数不仅提供了打开和读写通讯端口的操作方法,还提供了名目繁多的函数以支持对串行通讯的各种操作.常用函数及作用下: 函数 ...

  9. VC串口通信(Windows API)

    本文转载自基于Windows API的VC++串口通信详解,以下附上大白的理解. 简介 在Win32下,可以使用两种编程方式实现串口通信,其一是使用ActiveX控件,这种方法程序简单,但欠灵活.其二 ...

最新文章

  1. Linux环境PHP7.0安装
  2. 从AlexNet到BERT:深度学习中那些最重要idea的最简单回顾
  3. 基于Spring可扩展Schema提供自定义配置支持(spring配置文件中 配置标签支持)
  4. 15个超实用的php正则表达式
  5. 电子书网站推荐(收藏系列)
  6. Eclipse中JRE System Library、Web App Libraries的作用
  7. python处理csv文件将id相同的行合并到同一行并用符号将其隔开_Python探索性数据分析,这样才容易掌握...
  8. html5 progress css,CSS内容:HTML5进度上的attr()不起作用
  9. H3CSE园区-组播路由协议
  10. 简指南越狱的iOS及原因,负责其
  11. 看Spring实战有感(一)
  12. Java String 常量池
  13. 猴子摘香蕉问题python_用Basic STRIPS算法求解猴子和香蕉
  14. Hive建外表操作以及其它修改表操作 hive外表与内表区别
  15. Java女生后来_那些主动的女生后来怎么样了?
  16. 标签类目体系(面向业务的数据资产设计方法论)-读书笔记8(完结)
  17. Windwos2008如何关闭IE增强的安全配置
  18. OHEM,Focal loss,GHM loss二分类pytorch代码实现(减轻难易样本不均衡问题)
  19. 51 币圈里外的强者愈强----超级君扯淡录【2020-07-13 2100】
  20. 【520521】程序员中的“芳心纵火犯”, 这就是面向对象编程吗?

热门文章

  1. 数仓构建-架构与模型设计
  2. Win11连接共享打印机错误0x00000bc4
  3. 十四、Rust ORM 框架
  4. MAVEN查看jar包依赖关系
  5. 【SDC】揭开无人驾驶的神秘面纱
  6. 历史建筑全生命期数字孪生模型展示平台
  7. 第二天- jQuery
  8. Poser pro 2014 在windows10上的安装和破译
  9. php实现棋牌房间,App房卡棋牌类游戏也有了一键进入房间的神操作!
  10. 什么是Nano Pulse Control