串行通信技术基础知识
- 格式:pdf
- 大小:465.61 KB
- 文档页数:8
串行通信基础知识本节简要概括了串行通信中的相关概念,为学习PC 机与MCU 的串行通信做准备。
1. 基本概念我们知道,“位”(bit )是二进制数字的简称,是可以拥有两种状态的最小二进制值,分别用“0”和“1”表示。
在计算机中,通常一个信息单位用8位二进制表示,称为一个“字节”(byte )。
串行通信的特点是:数据以字节为单位,按位的顺序从一条传输线上发送出去。
这里至少涉及到以下几个问题:第一,每个字节之间是如何区分的?第二,发送一位的持续时间是多少?第三,怎样知道传输是正确的?第四,可以传输多远?等等。
这些问题属于串行通信的基本概念。
串行通信分为异步通信与同步通信两种方式,本节主要给出异步串行通信的一些常用概念。
正确理解这些概念,对串行通信编程是有益的。
① 异步串行通信的格式在MCU 的英文芯片手册上,通常说SCI 采用的是NRZ 数据格式,英文全称是:“standard non-return-zero mark/space data format ”,可以译为:“标准不归零传号/空号数据格式”。
这是一个通信术语,“不归零”的最初含义是:用负电平表示一种二进制值,正电平表示另一种二进制值,不使用零电平。
“mark/space ”即“传号/空号”分别是表示两种状态的物理名称,逻辑名称记为“1/0”。
对学习嵌入式应用的读者而言,只要理解这种格式只有“1”、“0”两种逻辑值就可以了。
图3.3.1给出了8位数据、无校验情况的传送格式。
这种格式的空闲状态为“1”,发送器通过发送一个“0”表示一个字节传输的开始,随后是数据位(在MCU 中一般是8位或9位,可以包含校验位)。
最后,发送器发送1到2位的停止位,表示一个字节传送结束。
若继续发送下一字节,则重新发送开始位,开始一个新的字节传送。
若不发送新的字节,则维持“1”的状态,使发送数据线处于空闲。
从开始位到停止位结束的时间间隔称为一帧(frame )。
所以,也称这种格式为帧格式。
CAN总线基础知识总结一、CAN总线简介1、CAN总线(Controller Area Network,控制器局域网)是由德国BOSCH(博世)公司在1986年为汽车而设计的,它是一种串行通信总线,只需两根线CAN_H和CAN_L。
2、隐性(逻辑1)与显性(逻辑0)的概念:CAN总线在数据传输过程中,实际上传输的是CAN_H和CAN_L之间的电位差。
CAN_H只能是高电平(3.5V)或悬浮状态(2.5V),CAN_L只能是低电平(1.5V)或悬浮状态(2.5)V,当CAN_H和CAN_L都为2.5V 时,是隐性,表示逻辑1,当 CAN_H为3.5V、CAN_L都为2.5V时,是显性,表示逻辑0。
表示隐性和显性逻辑的能力是CAN总线仲裁方法的基本先决条件,即所有节点都为隐性时,总线才处于隐性状态;只要有一个节点发送了显性,总线就呈现为显性状态。
3、120Ω电阻:必须在总线的每一节点的CAN_H和CAN_L之间接一个120Ω左右的电阻,以避免出现信号反射。
4、CAN技术规范CAN2.0A和CAN2.0B:CAN2.0A只有标准帧(标识符(ID)有11位);CAN2.0B除了标准帧,还有扩展帧(标识符(ID)有29位)。
5、CAN的国际标准ISO11898和ISO11519:CAN 协议经ISO 标准化后有ISO11898和ISO11519两种标准,它们对于数据链路层的定义相同,但物理层不同。
ISO11898 是波特率为125kbps-1Mbps 的CAN高速通信标准。
ISO11519 是波特率为125kbps 以下的CAN低速通信标准。
高速通信标准和低速通信标准的硬件规格也不一样,所以需要选用不同的收发器。
在收发器的规格书上都会注明高速通信用还是低速通信用,或者是符合ISO11898标准还是ISO11519标准。
6、CAN总线协议只定义了物理层和数据链路层,要将CAN总线应用于工程项目中必须制定上层的应用协议。
can通信基础知识讲解Can通信是一种常见的通信协议,广泛应用于汽车领域。
本文将从Can通信的基础知识入手,介绍Can通信的原理、特点以及应用。
一、Can通信的原理Can通信是Controller Area Network的缩写,即控制器局域网。
它是一种串行通信协议,主要用于在汽车电子系统中传输数据。
Can通信采用差分信号传输,通过两根线(Can_High和Can_Low)来实现数据的收发。
Can_High和Can_Low的电平差异表示二进制数据的0和1。
Can通信采用非归零编码,即数据在传输过程中不会回到零电平,从而减少了传输中的干扰。
二、Can通信的特点1. 高可靠性:Can通信采用冗余校验机制,即每个数据帧都包含有校验和。
接收端在接收到数据帧后会对校验和进行验证,从而保证数据的可靠性。
2. 高效性:Can通信采用了事件触发的方式,只有在需要发送数据时才进行通信,减少了通信的时间开销。
3. 可扩展性:Can通信支持多个节点之间的通信,节点数量可以灵活扩展。
4. 抗干扰性强:Can通信采用差分信号传输,能够有效抵抗电磁干扰和噪声干扰。
5. 实时性好:Can通信的传输速率较快,能够满足实时性的要求。
三、Can通信的应用Can通信广泛应用于汽车领域,主要用于实现汽车内部各个电子控制单元(ECU)之间的通信。
以下是Can通信在汽车领域的一些典型应用:1. 发动机控制单元(ECU)之间的通信:Can通信用于发动机控制单元与其他ECU之间的数据交换,如发动机转速、油耗等数据的传输。
2. 制动系统的控制:Can通信用于制动系统的各个部件之间的通信,如制动踏板、制动盘、制动液位等数据的传输。
3. 车身电子系统的控制:Can通信用于车身电子系统中各个部件之间的通信,如车门、车窗、天窗等设备的控制。
4. 安全系统的控制:Can通信用于安全系统中的各个部件之间的通信,如安全气囊、防抱死制动系统等设备的控制。
四、Can通信的发展趋势Can通信作为一种可靠、高效的通信协议,已经在汽车领域得到广泛应用。
CAN线基础知识讲解1. 什么是CAN线?CAN(Controller Area Network)是一种串行通信协议,最初由德国公司Bosch 开发。
CAN总线主要用于车辆内部的通信系统,但现在也被广泛用于工业控制和汽车领域以及航空航天领域。
CAN线是CAN总线的物理连接线路,负责将CAN控制器、传感器、执行器等设备连接起来进行数据通信。
2. CAN线的特点•高可靠性:CAN线采用差分信号传输,抗干扰能力强,即使在噪音干扰较大的环境下,数据传输也可靠。
•实时性强:CAN线采用事件驱动的通信方式,具有较低的延迟,适用于要求实时性的应用场景。
•多路复用:CAN总线支持多个设备在同一根线上进行通信,节约了线路资源。
•灵活性:CAN总线可以动态连接和断开设备,方便系统调试和维护。
3. CAN线的工作原理CAN线采用双绞线作为传输介质,数据传输采用差分信号方式,即在CAN_H和CAN_L两根信号线上传输互补的电压信号。
CAN_H线上的电压高表示逻辑1,CAN_L线上的电压高表示逻辑0,通过CAN控制器的差分比较可以识别信号。
CAN线的通信帧由起始标志、控制字段、数据字段、CRC字段和结束字段组成,通信速率可根据需求配置。
CAN线具有发送器和接收器,通过在总线上抢占通信的方式实现多路复用。
4. CAN线的应用领域CAN线广泛应用于汽车电子控制系统、工业控制系统、医疗设备、航空航天等领域。
在汽车电子控制系统中,CAN线连接了发动机控制单元、传感器、仪表盘、空调控制器等各个设备,实现数据的快速传输和实时控制。
在工业控制系统中,CAN线连接了PLC、传感器、执行器等设备,实现设备之间的数据交换和协同工作。
CAN线也被广泛应用于航空航天领域,连接了航空电子设备、飞行控制系统等,确保了系统的可靠性和实时性。
5. CAN线的发展趋势随着物联网、智能制造等领域的快速发展,CAN线也在不断演进。
未来CAN线将更加智能化、高速化,支持更多的设备连接和更高的数据传输速率。
串行通信实验报告实验报告:串行通信实验一、实验目的本实验旨在通过搭建串行通信系统,了解串行通信的基本原理和工作方式,掌握串行通信的相关知识和技术。
二、实验仪器和材料1. Arduino开发板B数据线3.跳线若干4.电脑三、实验原理串行通信是一种通过连续的、位的形式传输数据的通信方式。
在串行通信中,数据通过一个数据线一位一位地传输,与并行通信相比,串行通信的线路数量较少,适用于数据传输距离较远的场景。
在本实验中,我们使用Arduino开发板作为串行通信的发送和接收端,通过USB数据线连接电脑与Arduino开发板进行数据交互。
四、实验步骤1. 连接电路:将Arduino开发板通过USB数据线连接至电脑,确保连接稳定。
2. 编写Arduino代码:使用Arduino IDE软件编写Arduino代码,实现数据发送和接收的功能。
代码示例://发送端void setuSerial.begin(9600); //设置串行通信波特率为9600void looString message = "Hello World!"; //待发送的消息Serial.println(message); //通过串行通信发送消息delay(2000); //延迟2秒//接收端void setuSerial.begin(9600); //设置串行通信波特率为9600void looif (Serial.available() { //如果串行通信接收到数据String message = Serial.readString(; //读取接收到的数据Serial.println("Received: " + message); //打印接收到的数据}3. 上传代码:将编写好的代码上传至Arduino开发板,使其开始工作。
4. 打开串行监视器:在Arduino IDE中点击“工具”菜单并选择“串行监视器”(或使用快捷键Ctrl+Shift+M)打开串行监视器。
基本串口通信程序设计串口通信是指通过串行接口进行数据传输的一种通信方式。
串口通信通常用于短距离的数据传输,具有稳定性强、传输速率低的特点。
本文将介绍串口通信的基本原理和程序设计。
一、串口通信基本原理串口通信是通过串行接口将数据一位一位地传输的通信方式。
串口通信的基本原理是使用两根信号线进行通信:一根是传输数据的信号线(TX),负责向外发送数据;另一根是接收数据的信号线(RX),负责接收外部发送过来的数据。
二、串口通信程序设计步骤1. 打开串口:首先需要通过操作系统提供的串口接口函数,打开需要使用的串口。
在Windows系统中,可以使用CreateFile函数打开串口;在Linux系统中,可以使用open函数打开串口。
3. 发送数据:使用WriteFile函数(Windows系统)或write函数(Linux系统),向串口发送需要传输的数据。
4. 接收数据:使用ReadFile函数(Windows系统)或read函数(Linux系统),从串口接收数据。
5. 关闭串口:数据传输完成后,需要关闭串口,使用CloseHandle函数(Windows系统)或close函数(Linux系统)即可关闭串口。
三、串口通信程序设计示例(Windows系统)下面是一个简单的串口通信程序设计示例,实现了从串口接收数据并将接收的数据原样返回的功能。
#include <iostream>#include <windows.h>int mainHANDLE hSerial;DCB dcbSerialParams = {0}; // 串口参数hSerial = CreateFile("COM1", GENERIC_READ , GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); // 打开串口dcbSerialParams.DCBlength = sizeof(dcbSerialParams);std::cout << "Error getting serial port state\n";return 1;}dcbSerialParams.BaudRate = CBR_9600;dcbSerialParams.ByteSize = 8;dcbSerialParams.StopBits = ONESTOPBIT;dcbSerialParams.Parity = NOPARITY;std::cout << "Error setting serial port state\n";return 1;}return 1;}char buffer[100];DWORD bytesRead;while (1)if (ReadFile(hSerial, buffer, sizeof(buffer), &bytesRead, NULL) && bytesRead > 0)std::cout << "Received data: " << buffer << std::endl;DWORD bytesWritten;if (!WriteFile(hSerial, buffer, bytesRead, &bytesWritten, NULL))std::cout << "Error writing to serial port\n";return 1;}}}CloseHandle(hSerial); // 关闭串口return 0;以上程序打开串口COM1,设置波特率为9600,数据位为8位,停止位为1位。
串行通信技术基础在串行通信中,参与通信的两台或多台设备通常共享一条物理通路。
发送者依次逐位发送一串数据信号,按一定的约定规则为接收者所接收。
由于串行端口通常只是定义了物理层的接口规范,所以为确保每次传送的数据报文能准确到达目的地,使每一个接收者能够接收到所有发向它的数据,必须在通信连接上采取相应的措施。
由于借助串行通信端口所连接的设备在功能、型号上往往互不相同,其中大多数设备出了等待接收数据之外还会有其他的任务,例如,一个数据采集单元需要周期性地收集和存储数据;一个控制器需要负责控制计算机或向其他设备发送报文;一台设备可能会在接收方正在进行其他任务时向它发送信息。
因此,必须有能应对多种不同工作状态的一系列规则来保证通信的有效性。
这里所讲的保证串行通信的有效性的方法包括:使用轮询或者中断来检测、接收信息;设置通信帧的起始、停止位;建立连接握手;实行对接收数据的确认、数据缓存以及错误检查等。
一、串行通信基本概念1、连接握手通信帧的起始位可以引起接收方的注意,但发送方并不知道,也不能确定接收方是否已经做好了接收数据的准备。
利用连接握手可以使收发双方确认已经建立了连接关系,接收方已经做好准备,可以进入数据收发状态。
连接握手过程是指发送者在发送一个数据块之前使用一个特定的握手信号来引起接收者的注意,表明要发送数据,接收者则通过握手信号回应发送者,说明它已经做好了接收数据的准备。
连接握手可以通过软件,也可以通过硬件来实现。
在软件连接握手中,发送者通过发送一个字节表明它想要发送数据;接收者看到这个字节的时候,也发送一个编码来声明自己可以接收数据;当发送者看到这个信息时,便知道它可以发送数据了。
接收者还可以通过另一个编码来告诉发送者停止发送。
在普通的硬件握手中,接收者在准备好了接收数据的时候将相应的握手信号线变为高电平,然后开始全神贯注地监视它的串行输入端口的允许发送端。
这个允许发送端与接收者已准备好接收数据的信号端相连,发送者在发送数据之前一直在等待这个信号变化。
一旦得到信号说明接收者已处于准备好接收数据的状态,便开始发送数据。
接收者可以在任意时候将握手信号变为低电平,即便是在接收一个数据块的过程中间也可以把这根导线带入到低电平。
当发送者检测到这个低电平信号时,就应该停止发送。
而在完成本次传输之前,发送者还会继续等待握手信号线在此变为高电平,以继续被中止的数据传输。
2、确认接收者为表明数据已经收到而向发送者回复信息的过程称为确认。
有的传输过程可能会收到报文而不需要向相关节点回复确认信息。
但是在许多情况下,需要通过确认告之发送者数据已经收到。
有的发送者需要根据是否收到信息来采取相应的措施,因而确认对某些通信过程是必需的和有用的。
即便接收者没有其他信息要告诉发送者,也要为此单独发一个数据确认已经收到的信息。
确认报文可以是一个特别定义过的字节,例如一个标识接收者的数值。
发送者收到确认报文就可以认为数据传输过程正常结束。
如果发送者没有收到所希望回复的确认报文,它就认为通信出现了问题,然后将采取重发或者其它行动。
3、中断中断是一个信号,它通知CPU有需要立即响应的任务。
每个中断请求对应一个连接到中断源和中断控制器的信号。
通过自动检测端口事件发现中断并转入中断处理。
许多串行端口采用硬件中断。
在串口发生硬件中断,或者一个软件缓存的计数器到达一个触发值时,表明某个事件已经发生,需要执行相应的中断响应程序,并对该事件做出及时的反应。
这种过程也称为事件驱动。
采用硬件中断就应提供中断服务程序,以便在中断发生时让它执行所期望的操作。
很多微控制器为满足这种应用需求而设置了硬件中断。
在一个事件发生的时候,应用程序会自动对端口的变化做出响应,跳转到中断服务程序。
例如发送数据,接收数据,握手信号变化,接收到错误报文等,都可能成为串行端口的不同工作状态,或称为通信中发生了不同事件,需要根据状态变化停止执行现行程序而转向与状态变化相适应的应用程序。
外部事件驱动可以在任何时间插入并且使得程序转向执行一个专门的应用程序。
4、轮询通过周期性获取特征或信号来读取数据或发现是否有事件发生的工作过程称为轮询。
它需要足够频繁地轮询端口,以便不遗失任何数据或事件。
轮询的频率取决于对事件快速反应的需求以及缓存区的大小。
轮询通常用于计算机与I/O端口之间较短数据或字符组的传输。
由于轮询端口不需要硬件中断,因此可以在一个没有分配中断的端口运行此类程序。
很多轮询使用系统计时器来确定周期性读取端口的操作时间。
5、差错检验数据通信中的接收者可以通过差错检验来判断所接收的数据是否正确。
冗余数据校验、奇偶校验、校验和、循环冗余校验等都是串行通信中常用的差错检验方法。
(1)冗余数据校验发送冗余数据是实行差错检验的一种简单办法。
发送者对每条报文都发送两次,有接收者根据这两次收到的数据是否一致来判断本次通信的有效性。
当然,采用这种方法意味着每条报文都要花两倍的时间进行传输。
在传送短报文时经常会用到它。
许多红外线控制器就使用这种方法进行差错检验。
(2)奇偶校验串行通信中经常采用奇偶校验来进行错误检查。
校验位可以按奇数位校验,也可以按偶数位校验。
许多串口支持5~8个数据位再加上奇偶校验位的工作方式。
按数据位加上奇偶校验位共有偶数个0的规则填写校验位的方式称为偶校验;而按数据位加上奇偶校验位共有奇数个0的规则填写的校验位方式称为奇校验。
接收方检验接收到的数据,如果接收到的数据违背了事先约定的奇偶校验的规则,不是所期望的数值,说明出现了传输错误,则向发送方发送出错通知。
(3)校验和另一种差错检验的方法是在通信数据中加入一个差错检验字节。
对一条报文中的所有字节进行数学或者逻辑运算,计算出校验和。
将校验和形成的差错检验字节作为该报文的组成部分。
接收端对收到的数据重复这样的计算,如果得到了一个不同的结果,就判定通信过程发生了差错,说明它接收到的数据与发送数据不一致。
一个典型的计算校验和的方法是将这条报文中所有的字节值相加,然后用结果的最低字节的补码作为校验和。
校验和通常只有一个字节,因而不会对通信量有明显的影响,适合在长报文的情况下使用。
但这种方法并不是绝对的安全,会存在很小的概率的判断失误。
那就是即便在数据并不完全吻合的情况下有可能出现得到的校验和一致,将有差错的通信过程判断为没有发生差错。
循环冗余校验(CRC)也是串行通信中常用的检错方法,它采用比校验和更为复杂的数学计算,器校验结果也更加可靠。
(4)出错的简单处理当一个节点检测到通信中出现的差错或者接收到一条无法理解的报文时,应尽量通知发送报文的节点,要求它重新发送或者采取别的措施来纠正。
经过多次重发,如果发送者仍不能纠正这个错误,发送者应该跳过对这个节点的发送,发布一条出错信息,通过报警或者其他操作来通知操作人员发生了通信差错,并尽可能继续执行其他任务。
接收者如果发现一条报文比期望的报文要短,应该能最终停止连接,并让主机知道出现了问题,而不能无休止地等待一个报文结束。
主计算机可以决定让该报文继续发送、重发或者停发。
不应因发现问题而让网络处于无休止的等待状态。
6、串行异步通信数据格式无论是RS-232还是RS-485,均可采用串行异步收发数据格式。
在串行端口的异步传输中,接收方一般事先并不知道数据会在什么时候到达。
在它检测到数据并做出相应之前,第一个数据位就已经过去了。
因此每次异步传输都应该在发送的数据之前设置至少一个起始位,已通知接收方有数据到达,给接收方一个准备接收数据、缓存数据和做出其他响应所需要的时间。
而在传输过程结束时,则应由一个停止位通知接收方本次传输过程已终止,以便接收方正常终止本次通信而转入其他工作程序。
串行异步收发(UART)通信的数据格式如图1所示。
图1 串行异步通信数据格式若通信线上无数据发送,该线路应处于逻辑1状态(高电平)。
当计算机向外发送一个字符数据时,应先送出起始位(逻辑0,低电平),虽有紧跟着数据位,这些数据构成要发送的字符信息。
有效数据位的个数可以规定为5、6、7或8。
奇偶校验位视需要设定,紧跟其后的是停止位(逻辑1,高电平),其位数可在1、1.5、2中选择其一。
二、RS-232C串行通信接口技术1、RS-232C接口RS-232C的连接插头用25针或9针的EIA连接插头座,其主要端子分配表如下表(表1)所示。
端脚方向符号功能25针9针2 3 输出TXD 发送数据3 2 输入RXD 接收数据4 7 输出RTS 请求发送5 8 输入CTS 为发送清零6 6 输入DSR 数据设备准备好7 5 GND 信号地8 1 输入DCD20 4 输出DTR数据信号检测22 9 输入RI表1 RS-232C主要端子(1)信号含义1.从计算机到Modem的信号DTR——数据终端设备(DTE)准备好:告诉Modem计算机已经接通电源,并准备好。
RTS——请求发送:告诉Modem现在要发送数据。
2.从Modem到计算机信号DSR——数据通信设备(DCE)准备好:告诉计算机Modem已接通电源,并准备好了。
CTS——为发送清零:告诉计算机Modem已做好了接收数据的准备。
DCD——数据信号检测:告诉计算机Modem已与对端的Modem建立连接了。
RI——振铃指示器:告诉计算机对端电话已在振铃了。
3.数据信号TXD——发送数据。
RXD——接收数据。
(2)电气特性RS-232C的电气线路连接方式如图2所示。
图2 RS-232C的电气连接图接口为非平衡型,每个信号用一根导线,所有信号回路共用一根地线。
信号速率限于20kbit/s内,电缆长度限于15m之内。
由于是单线,线间干扰较大。
其电性能用±12V标准脉冲。
值得注意的是RS-232C采用负逻辑。
在数据线上:传号Mark=-5~-15V,逻辑“1”电平空号Space=+5~+15V,逻辑“0”电平在控制线上:通On=+5V~+15V,逻辑“0”电平断Off=-5V~-15V,逻辑“1”电平RS-232C的逻辑电平与TTL电平不兼容,为了与TTL电平器件相连必须进行电平转换。
由于RS-232C采用电平传输,在通信速率为19.2kbit/s是,其通信距离只有15m。
若要延长通信距离,必须以降低通信速率为代价。
2、RS-232C通信接口的互连当两台计算机经RS-232C口直接通信时,两台计算机之间的联络线可用图3、图4表示。
虽然不接Modem,图中仍连接着有关的Modem信号线,这是由于INT 14H中断使用这些信号,假如程序中没有调用INT 14H,在自编程序中也没有用到Modem的有关信号,两台计算机直接通信时,只连接2、3、7(25针EIA)或3、2、5(9针EIA)就可以了。
图3 使用Modem信号的RS-232C接口图4 不使用Modem信号的RS-232C接口3、RS-232C驱动器/接收器为了实现采用+5V供电的TTL和CMOS通信接口电路能与RS-232C标准接口连接,必须进行串口的输入/输出信号的电平转换。