linux can总线接收数据串口打包上传_关于串口,你需要知道这些!!

3fdd72e57965c790827d73fb620bd107.png

嵌入式设备在电路中交换信息的时候必须通过共享一个通用的协议。现在嵌入式系统中已经定义了数百种通信协议来实现数据交换,一般来说可以将其分为两类:并行或串行。

并行传输数据是指同时传输多个数据位,它们通常需要数据线和时钟线配合工作,数据线的条数可能为8、16或更多。

e7ac9395f2162991a29d94b808197c22.png

而串行传输时一次只能传输一位数据,只使用一根导线工作,通常总共不需要超过四根。

1e32d67ed42d715aa208b0c69c7441f0.png

可以将这两种通信方式看作车辆在路上行驶,并行传输是一条八车道的豪华高速公路,而串行传输更像是两车道的乡间小路。并行传输可以在同一时刻通过8辆汽车,而串行传输只能在同一时刻通过一辆汽车,但两车道的建设费用可能更低。

并行传输的好处是快速、简单且易于实施。但是它需要更多的输入/输出(I/O)口。如果你曾经使用过Arduino编程,那你就知道处理器上的I/O口有多宝贵了。因此我们经常选择串行通信,以节约端口。

多年来,研究人员设计了数十种串行协议以满足嵌入式系统的特殊需求,USB和以太网算是其中比较知名的串行协议。其他常见的串行协议包括:IIC、SP等等。

这些串行传输协议都可以分为两类:同步和异步。

同步串行传输协议始终将数据线与时钟信号配对,因此同步串行总线上所有设备都共享一个公共时钟。这样可以进行更直接、更快的串行传输,但也额外需要一根时钟线。同步串行传输协议的包括SPI和IIC。

异步串口是指在没有外部时钟信号的情况下传输数据。这种传输方法非常适合于I/O口紧张的情况,但这意味着需要付出额外的资源来可靠地传输和接收数据。我们将在本文中讨论的串行协议是异步传输的最常见形式。实际上,大多时候人们说的串口均是指的该类型。

异步串行协议的许多内置规则可以确保可靠且无误的数据传输,分别为:

  • 数据位

  • 同步位

  • 奇偶校验位

  • 波特率

通过各种这些信令机制,可以保障数据传输的完整性,但最最最重要的是在收发双方一定要配置位相同的规则才能正确的发送和接收。

波特率指定通过串行线发送数据的速度。通常以每秒位数(bps)为单位。如果反转波特率,则可以计算出传输单个比特需要的时长。该值确定发送器将串行线保持为高/低状态的时间,或接收设备在多长时间内对其进行采样。

在合理范围内,波特率几乎可以是任何值。唯一的要求是两个设备均以相同的速率运行。对速度要求不高的情况而言,9600 bps是较常见的波特率之一。其他“标准”波特为1200、2400、4800、19200、38400、57600和115200。

波特率越高,发送/接收数据的速度就越快。通常不会有超过115200的波特率-因为这对于大多数单片机而言速度太快,将在接收端看到错误,因为时钟和采样周期无法跟上发送端。

实际传输的每个数据块(一般为一个字节)都以数据包或帧的形式发送。通过将同步位和奇偶校验位附加到我们的数据中来创建帧。

9600 8N1(示例)

9600 8N1代表着波特为9600,8个数据位,无奇偶校验和1个停止位,这一种是较为常用的串行协议配置方法。那么,9600 8N1的数据包是什么样的呢?举个例子吧!传输ASCII字符"O"和"K"的设备必须创建两个数据包。O的ASCII值(大写)为79,则二进制值01001111,而K的二进制值为01001011。剩下的就是追加同步位。假设传输数据时首先传输最低位:

fa6b94671ee9e9566e70e668fc2471aa.png

由于我们以9600 bps的速度进行传输,因此将电平保持高位或低位所花费的时间为每位1/(9600 bps)或104 µs。

对于每个传输的数据字节,实际上有10个位被发送:一个起始位,8个数据位和一个停止位。因此,在9600 bps时,我们实际上每秒发送9600位或每秒960(9600/10)字节。

接线和硬件

串行总线仅由两根电线组成-一根用于发送数据,另一根用于接收。因此,串行设备应具有两个串行引脚:接收器RX和发送器TX。

73c1bbdbde5b49bd1f1060b4caea18b6.png

请注意,RX和TX口是相对于设备本身的。因此,来自一台设备的RX应该接到另一台设备的TX,反之亦然。发射机应与接收机通信,而不是与其他发射机通信。

两个设备都可以发送和接收数据的串行接口是全双工或半双工。全双工意味着两个设备可以同时发送和接收。半双工通信意味着串行设备必须轮流发送和接收。

常见问题

任何水平的工程师都容易犯以下错误:

1. 接收到发送,接收到发送

这种情况看起来特别简单,但是非常容易遇到,我已经犯了无数次,请始终确保在串行设备之间交叉RX和TX线。

03e2813617d3254b0a231280ccd9ec9b.png

波特率不匹配

波特率类似于串行通信的语言。如果两个设备的通话速度不同,则数据可能会被误解或完全丢失。如果接收设备在其接收线路上看到的都是垃圾,请检查以确保波特率匹配。

f2b090a58254f76fb6c3b7d0d9971fc8.png

数据以9600 bps传输,但以19200 bps接收。波特率不匹配==垃圾。

总线争用

串行通信旨在仅允许两个设备通过一条串行总线进行通信。如果有多个设备尝试在同一串行线上进行传输,则可能会发生总线争用。等等等...

例如,如果您要将GPS模块连接到Arduino,则可以仅将模块的TX线连接到Arduino的RX线。但是,该Arduino RX引脚已经连接至USB到串行转换器的TX引脚,该端口在您对Arduino进行编程或使用Serial Monitor时就可以使用。这设置了GPS模块和FTDI芯片都试图同时在同一条线上传输的潜在情况。

4b4a48a273635f1f554ac0ef7e904f99.png

试图在同一条线上同时传输数据的两个设备很糟糕!在"最佳"状态下,两个设备都无法发送其数据。最坏的情况是,两个设备的传输线都会go声(尽管这种情况很少见,而且通常会受到保护)。

将多个接收设备连接到单个发送设备可以很安全。并非真正符合规格,并且可能不适合经过严格训练的工程师,但是它会起作用。例如,如果要将串行LCD连接到Arduino,最简单的方法可能是将LCD模块的RX线连接到Arduino的TX线。Arduino的TX已经连接到USB编程器的RX线,但是仍然只剩下一个设备来控制传输线。

1736cba4d7d87b38e3ffd05232184cd4.png

从固件的角度来看,这样分配TX线仍然很危险,因为您无法选择哪个设备可以听到什么传输信号。LCD最终会接收到不适合它的数据,这可能会命令LCD进入未知状态。

一般来说:一条串行总线,两个串行设备!

本文转载引用:

https://learn.sparkfun.com/tutorials/serial-communication

1effa0d397d01afa1c1571a853ab6f06.png

55ede68c50521fb9914f86427d23d315.png

0733b4da86639da7647ba566ba1b5fc6.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/470747.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

div里嵌套了img底部会有白块问题和图片一像素问题解决

div里嵌套了img底部会有白块 因为img默认是按基线(baseline)对齐的。对比一下图片和右边的p, q, y等字母,你会发现这三个字母的“小尾巴”和图片下方的空白一样高。下面这张图中的黑线就是那条基线。 解决方案:一:vertical-align: bottom&…

Nodejs 中的Get、Post

Get、Post 超文本传输协议(HTTP)的设计目的是保证客户端机器与服务器之间的通信。 在客户端和服务器之间进行请求-响应时,两种最常被用到的方法是:GET 和 POST。 GET - 从指定的资源请求数据。(一般用于获取数据&#…

利用二分法解决 leetcode 378. Kth Smallest Element in a Sorted Matrix

问题简述 给定一个 nn的矩阵,矩阵中每行和每列的元素都按升序排列。给定一个 k(k∈[1,n2]), 求再整个矩阵中按从小到大排序为 k的元素。 例如:matrix = [[ 1, 5, 9],[10, 11, 13],[12, 13, 15] ], k = 8,return 13.解题思路该矩阵的行和列都是按从小…

电脑故障扫描修复软件_电脑故障分析:电脑安装软件提示没有权限的解决方法...

我们安装软件时如果没有权限就会导致安装故障,最近就有用户安装软件的时候出现了无法将数值写入键software的错误提示,请验证您对该键拥有足够的访问权限,或者与您的技术支持人员联系。那么遇到这种问题该怎么办呢?接下来就让我们…

Nodejs 路由封装 封装一个类似 express 的路由

1、模块化的方式封装 routes.js: const http require(http); const fs require(fs); const path require(path) const url require(url) const ejs require(ejs) let getFileMime function (extname) {// 把异步读取文件方法改为同步读取文件方法let data fs.readFileSy…

天翼网关 ddns设置_19,微服务网关之Zuul

这一次给大家分享微服务网关的相关知识,这个也是微服务架构中,相当重要的组件之一,来,下面听我徐徐道来1,API网关概览1.1,现有的交互模式存在什么问题?目前,是客户端会直接跟多个微服…

利用bds和dfs解决 LeetCode 107. Binary Tree Level Order Traversal II

问题简述 给定一棵二叉树,返回该二叉树自底向上遍历的结点值(即从左到右,自底向上) 比如给定一颗二叉树 [3,9,20,null,null,15,7] 3/ \9 20/ \15 7 返回的结果为 [[15,7],[9,20],[3] ] 解决方案 解法1:广度优…

MongoDB 数据库创建、删除、表(集合) 创建删除、数据的增、删、改、查

一、 连接数据库 1、连接数据库 清屏命令:cls 查看所有数据库列表:show dbs 二、 创建数据库、查看、删除数据库 1、使用数据库、创建数据库 use itying 如果真的想把这个数据库创建成功,那么必须插入一个数据。 数据库中不能直接插入数据&#xff0…

纯CSS方块转化梯形动画

http://jasonning92.github.io/JasonsBlog/pages/%E7%BA%AFCSS%E6%96%B9%E5%9D%97%E8%BD%AC%E5%8C%96%E6%A2%AF%E5%BD%A2%E5%8A%A8%E7%94%BB.html转载于:https://www.cnblogs.com/sanqianjin/p/5439364.html

如何编程两个android 手机进行通信_100+ 队伍激烈角逐 Geek Online 2020 编程挑战赛完美收官 - 业界动态...

2020春季的一场疫情,让远程办公和在线教育在全球范围内成为一种常态。疫情终将过去,但疫情为人们带来的新的工作及生活方式却将持续地影响着我们。后疫情时代,远程实时互动技术的重要性被提到了新的高度,下一代互联网通信云将如何…

从LeetCode 210. Course Schedule II 了解拓扑排序

问题简述 给定n节课,每节课按0~n-1编号。 在修某些课的时候需要有其它课的基础,必须先上先修课。现在用pair的形式来表示要先修的课,比如 [ [0,1], [1,2] ] 就表示在修课程1之前必须先修课程0,修课程2之前必须修课程1。现在需要给…

LeetCode题解 343.Integer Break

题目:Given a positive integer n, break it into the sum of at least two positive integers and maximize the product of those integers. Return the maximum product you can get. For example, given n 2, return 1 (2 1 1); given n 10, return 36 (10 …

MongoDb 大数据查询优化、 MongoDB 索引、复合索引、唯一索引、 explain 分 析查询速度

一、索引基础 索引是对数据库表中一列或多列的值进行排序的一种结构,可以让我们查询数据库变得 更快。 MongoDB 的索引几乎与传统的关系型数据库一模一样,这其中也包括一些基本的查询优化技巧。 下面是创建索引的命令: db.user.ensureIndex…

ipconfig不是内部或外部_晶振有什么作用,如何选择合适的晶振,为什么有时候用内部晶振?...

一、 什么是晶振晶振,全名叫"晶体振荡器",它在电路当中起到产生振荡频率的作用,我们都知道,单片机可以看成是在时钟驱动下的时序逻辑电路,那么这个所需要的时钟就是晶振来产生,可以说它的单片机的…

利用哈希表和dfs解决LeetCode 399. Evaluate Division

问题简介 给定一些由变量组成的等式组,然后根据这些等式推算出所闻的等式的结果,如果无法推算,则返回-1.0。 比如: 给定等式组 a / b 2.0, b / c 3.0 求出 a / c ?, b / a ?, a / e ?, a / a ?, x / x ? 返回结果为…

Mongodb 账户权限配置

Mongodb 账户权限配置 1、第一步创建超级管理用户 use admindb.createUser({ user:admin, pwd:admin, roles:[{role:root,db:admin}] })2、第二步修改 Mongodb 数据库配置文件 默认路径:路径:C:\Program Files\MongoDB\Server\4.0\bin\mongod.cfg 打开…

笔记本电脑关机快捷键_2020年双十一值得入手的高性价比笔记本电脑外设推荐...

本文更新日期:2020.10.21 篇幅较长,请提前收藏关注电脑外设就是除主机外的大部分硬件设备都可称作外部设备,或叫外围设备,简称外设。计算机系统没有输入输出设备,就如计算机系统没有软件一样,是毫无意义的。…

CentOS 7 gedit编辑器中文乱码解决方法

无需root登陆 打开终端输入如下命令: gsettings set org.gnome.gedit.preferences.encodings auto-detected "[GB18030, GB2312, GBK, UTF-8, BIG5, CURRENT, UTF-16]" gsettings set org.gnome.gedit.preferences.encodings shown-in-menu "[GB1803…

MongoDB 的高级查询 aggregate 聚合管道

一、MongoDB 聚合管道&#xff08;Aggregation Pipeline&#xff09; 使用聚合管道可以对集合中的文档进行变换和组合。 实际项目&#xff1a;表关联查询、数据的统计。 MongoDB 中使用 db.COLLECTION_NAME.aggregate([{<stage>},...]) 方法 来构建和使用聚合管道。 先…

python函数在传参的时候,到底在传些什么?

C这样的语言用多了之后&#xff0c;在Python函数传递参数的时候&#xff0c;经常会遇到一个问题&#xff0c;我要传递一个引用怎么办&#xff1f; 比如我们想要传一个x到函数中做个运算改变x的值&#xff1a; def change(y):y 1x 1 print ("before change:", x) …