通信关键点

  • 同步通信(例如SPI)-双方之间的数据传输使用公共时钟信号进行同步,数据以稳定的流传输。不需要额外的比特来标记传输的每个数据块的开始/结束,因此速度更快。
  • 异步通信(例如UART)-数据以不规则的间隔传输,设备的内部时钟不同步,但速度(波特)必须事先达成一致。需要额外的比特来标记传输的每个数据块的开始/结束,因此速度较慢。
  • 波特率-线路每秒可以改变状态的最大次数,即多久发一次1或0,常见的有4800、9600、12500。若波特率是9600那么它传输一位0或1的时间就是1/9600秒,理论上波特率越高,出错概率越大。

通信模式-允许双方交换数据的设置。 

  • 单工-只能在一个方向上传输
  • 半双工-一次可以在一个方向上传输,但方向可以来回切换。
  • 全双工-数据可以同时在两个方向上传输。

UART

通用异步收发器(UART)-用于将处理器的并行数据总线转换为串行通信的接口。                      特点

  • 硬件流量控制-检测接收器/传输FIFO上的数据溢出
  • 接收机/发射机握手
  • 传输速率为115 Kbps(标准UART,存在高速变体)

串行字节的解剖-可以使用硬件(例如UART设备)支持的标准(例如RS-232)进行传输:

  • 1个起始位
  • 5-8个数据位
  • 1个奇偶校验位(可选)。

如果1的数量是奇数,则偶数奇偶校验设置该位,否则该位保持为零。如果1的数量是偶数,则奇数奇偶校验设置该位,否则该位保持为零。Received知道您使用的是偶数还是奇数,并进行相应的检查。回调奇偶校验位只能检测奇数个错误,因此多个错误看起来可能是有效数据。

  • 1-2个停止位

示例:8E2表示1个起始位(始终)、8个数据位、偶数奇偶校验位、2个停止位。
示例:7N1表示1个起始位(始终)、7个数据位、无奇偶校验位、1个停止位。

UART通讯使用两根信号线进行数据传输:一根为数据线(TXD),负责发送数据;另一根为接收线(RXD),负责接收数据。发送方需要将发送的数据按照约定的通讯参数进行编码,然后通过TXD线发送出去,接收方则需要通过RXD线接收数据,并将接收到的数据进行解码。通信的过程中,发送方和接收方需要保持相同的波特率、数据位数、停止位数和校验方式等参数,才能正常进行数据传输。

UART通讯的数据传输是异步的,即发送方和接收方没有时钟信号进行同步。因此,在发送数据之前,发送方需要发送一个起始位(Start Bit)来告诉接收方数据的传输开始了;在数据传输完成后,发送方需要发送一个或多个停止位(Stop Bit)来告诉接收方数据的传输已经结束了。停止位的数量可以根据通讯参数进行配置,通常为1或2个。

UART通讯也可以使用校验位来检测数据传输是否出错。校验位是由发送方在数据包中添加的一位或多位数据,用于检测数据传输是否出错。接收方在接收到数据后,会对数据进行校验,并与校验位进行比对。如果接收到的数据与校验位不匹配,则说明数据传输出错,接收方会请求发送方重新发送数据。 总之,UART通讯是一种基于时序的异步串行通讯方式,通讯的双方需要事先约定好通讯参数,包括波特率、数据位数、停止位数和校验方式等。发送方需要将发送的数据按照约定的通讯参数进行编码,然后通过TXD线发送出去,接收方则需要通过RXD线接收数据,并将接收到的数据进行解码。在数据传输过程中,需要发送起始位和停止位来标识数据的开始和结束,也可以使用校验位来检测数据传输是否出错。

软件实现

1.确定通讯参数

在使用UART通讯前,需要确定通讯参数,包括波特率、数据位数、停止位数和校验方式等。通常情况下,这些参数需要与外设或其他通讯方事先约定好,才能确保通讯的正确性。以STM32为例,可以在代码中通过以下方式配置UART通讯参数:

UART_HandleTypeDef uart;
uart.Instance = USART2;
uart.Init.BaudRate = 115200;
uart.Init.WordLength = UART_WORDLENGTH_8B;
uart.Init.StopBits = UART_STOPBITS_1;
uart.Init.Parity = UART_PARITY_NONE;
uart.Init.Mode = UART_MODE_TX_RX;
uart.Init.HwFlowCtl = UART_HWCONTROL_NONE;
uart.Init.OverSampling = UART_OVERSAMPLING_16;
HAL_UART_Init(&uart);

代码中,将波特率设置为115200bps,数据位数设置为8位,停止位数设置为1位,校验方式设置为无校验。

2. 发送数据

在确定好通讯参数后,可以通过UART发送数据。以STM32为例,可以通过以下方式发送数据:

uint8_t data[] = "Hello, world!";
HAL_UART_Transmit(&uart, data, sizeof(data), 1000);

这段代码中,将字符串"Hello, world!"发送出去,使用的是HAL库中的HAL_UART_Transmit函数。该函数的第一个参数为UART句柄,第二个参数为发送的数据缓冲区,第三个参数为发送数据的长度,第四个参数为超时时间。

3. 接收数据

接收UART数据的方式与发送类似,也需要使用特定的函数。以STM32为例,可以通过以下方式接收数据:

uint8_t buffer[100];
HAL_UART_Receive(&uart, buffer, sizeof(buffer), 1000);

这段代码中,接收数据的缓冲区为buffer,使用的是HAL库中的HAL_UART_Receive函数。该函数的第一个参数为UART句柄,第二个参数为接收数据的缓冲区,第三个参数为接收数据的长度,第四个参数为超时时间。

4. 其他常用函数

在UART通讯中,还有一些常用的函数,比如清除UART接收缓冲区、获取UART接收缓冲区中的数据长度等。以STM32为例,可以通过以下方式进行操作:

HAL_UART_ClearRxBuffer(&uart);
uint32_t len = __HAL_UART_GET_RX_DATA_LENGTH(&uart);

这段代码中,清除UART接收缓冲区使用的是HAL库中的HAL_UART_ClearRxBuffer函数;获取UART接收缓冲区中的数据长度使用的是HAL库中的__HAL_UART_GET_RX_DATA_LENGTH宏定义。

以上就是UART通讯的基本使用方法。需要注意的是,在使用UART通讯时,需要确保发送方和接收方的通讯参数相同,否则可能会导致数据传输错误。同时,也需要注意数据的编码和解码方式,以确保数据传输的正确性。

串行通信协议小结(Serial Protocols)(1)相关推荐

  1. 基于Virtex-6 FPGA的三种串行通信协议测试及对比

    在高性能雷达信号处理机研制中,高速串行总线正逐步取代并行总线.业界广泛使用的Xilinx公司Virtex-6系列FPGA支持多种高速串行通信协议,本文针对其中较为常用的Aurora 8B/10B和PC ...

  2. LIN Bus | 一个应用广泛的串行通信协议

    关注.星标公众号,直达精彩内容 出品 : http://www.wangdali.net/lin/ 整理:技术让梦想更伟大 | 李肖遥 概述 随着汽车内电子设备的增多,市场上对于成本低于 CAN 的总 ...

  3. 转:oracle ebs po模块一揽子采购协议小结

    转自:http://yedward.net/?id=193 oracle ebs po模块一揽子采购协议小结 本文总结oracle ebs 采购订单(po)模块一揽子采购协议的相关知识,总结如下: 1 ...

  4. 串行通信协议(I2C、SPI、UART、SCCB、CAN)

    推荐一部书,在这本书里面介绍了I2C.SPI.UART和CAN等通信协议,写的蛮不错的. 串行通信:设备与设备之间,传输数据按顺序依次1bit位接1bit位进行传输. 并行通信:设备与设备之间,通过多 ...

  5. Win32串行通信中文版(Serial Communications In Win32)

    可到http://download.csdn.net/detail/zcube/5079651下载排版好的PDF版本. 原文链接:http://msdn.microsoft.com/en-us/lib ...

  6. iOS 网络编程(二)UDP协议小结

    UDP全称 用户数据报协议,User Datagram Protocol 解释与特点 - 解释:U D P是一个简单的面向数据报的运输层协议,进程的每个输出操作都正好产生一个U D P数据报,并组装成 ...

  7. oracle 创建一揽子协议,Oracle PO - 模块一揽子采购协议小结

    本文总结oracle ebs采购订单(po)模块一揽子采购协议的相关知识,总结如下: 1.理论介绍 (1)名词术语 一揽子采购协议(Blanket Purchase Agreement,BPA)是指某 ...

  8. KERMIT,XMODEM,YMODEM,ZMODEM传输协议小结

    转:http://blog.163.com/czblaze_3333/blog/static/208996228201272295236713/ Kermit协议 报文格式: 1.       MAR ...

  9. KERMIT,XMODEM,YMODEM,ZMODEM传输协议小结【转】

    来自:http://blog.163.com/czblaze_3333/blog/static/208996228201272295236713/ Kermit协议 报文格式: 1.       MA ...

最新文章

  1. CentOS7 下面安装Mysql MMM
  2. ★参加CSDN 用户体验调查 -- ★ 轻松赢取200C币
  3. 初学者python用哪个版本好-什么是Python?初学者应该学python哪个版本?
  4. 为什么python这么火_Python为什么这么火?你了解多少呢?
  5. asp.net mvc4开启SqlServer 会话共享模式
  6. 真的有无人工厂吗,IoT 怎么在产业界落地?| 赠书
  7. 搜狗输入法怎么清除输入记忆 搜狗输入法清除输入记忆方法
  8. php 控制器分组模式,控制器分组路由
  9. 这个温州人,是中国开店最多的炸鸡王者
  10. 拖拽批量上传图片如何保证 顺序_新手指南︱shopee店铺上架产品该如何操作?...
  11. 352计算机调剂,今年考研金融专业352分能调剂吗?有机会调剂到哪些学校?
  12. python绘制中国_Python-Geopandas 教你绘制中国地图
  13. 闲谈IPv6-我们在技术思维上需要作出改变(1)
  14. 布局 flex让元素一个靠左一个靠右
  15. 【踩坑】spconf.sty Latex样式模板的name包含下划线
  16. C语言实现LDPC的校验矩阵,LDPC码及其译码实现….doc
  17. Vitamio多媒体开发框架
  18. 七十八、Kettle的几个使用案例
  19. 1、已知:1公里=2里=1000米,请编写一个程序,输入公里数,将其转换成里和米。要求程序的输入输出如下: 请输入公里数: 3.3 3.30公里=6.60里=3300米
  20. openEuler ceph mgr dashboard 无法登陆 报错 401 Unauthorized You are not authorized to access that resource

热门文章

  1. vue项目访问服务器时:WebSocket connection to ‘wss://XXXX/‘的解决方法
  2. HTML 表单-表单域
  3. 我想到一种办法可以穿越到过去
  4. 区块链社交“无社交”
  5. 圆孔衍射夫琅禾费衍射matlab仿真
  6. Piwik——最好用的开源网站统计系统
  7. PS创意合成犀牛背上的美女(附素材)
  8. 算术位移和逻辑位移(一篇懂)
  9. java计算机毕业设计vue开发一个简单音乐播放器源码+mysql数据库+系统+lw文档+部署
  10. matlab代码:面向全局搜索的自适应领导者樽海鞘群算法