周末也来卷一卷哈 串口的可能也写过 在写一下多多记录把
一、串口通信基本原理
设备之间通信的方式
一般情况下,设备之间的通信方式可以分成并行通信和串行通信两种。并行与串行通信的区别如下表所示。
串行通信的分类
1、按照数据传送方向,分为:
单工:数据传输只支持数据在一个方向上传输;
半双工:允许数据在两个方向上传输。但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信;它不需要独立的接收端和发送端,两者可以合并一起使用一个端口。
全双工:允许数据同时在两个方向上传输。因此,全双工通信是两个单工通信方式的结合,需要独立的接收端和发送端。
2、按照通信方式,分为:
同步通信:带时钟同步信号传输。比如:SPI,IIC通信接口。
异步通信:不带时钟同步信号。比如:UART(通用异步收发器),单总线。
在同步通讯中,收发设备上方会使用一根信号线传输信号,在时钟信号的驱动下双方进行协调,同步数据。例如,通讯中通常双方会统一规定在时钟信号的上升沿或者下降沿对数据线进行采样。
在异步通讯中不使用时钟信号进行数据同步,它们直接在数据信号中穿插一些用于同步的信号位,或者将主题数据进行打包,以数据帧的格式传输数据。通讯中还需要双方规约好数据的传输速率(也就是波特率)等,以便更好地同步。常用的波特率有4800bps、9600bps、115200bps等。
在同步通讯中,数据信号所传输的内容绝大部分是有效数据,而异步通讯中会则会包含数据帧的各种标识符,所以同步通讯效率高,但是同步通讯双方的时钟允许误差小,稍稍时钟出错就可能导致数据错乱,异步通讯双方的时钟允许误差较大。
常见的串行通信接口
STM32串口通信基础
STM32的串口通信接口有两种,分别是:UART(通用异步收发器)、USART(通用同步异步收发器)。而对于大容量STM32F10x系列芯片,分别有3个USART和2个UART。
UART引脚连接方法
RXD:数据输入引脚,数据接受;
TXD:数据发送引脚,数据发送。
对于两个芯片之间的连接,两个芯片GND共地,同时TXD和RXD交叉连接。这里的交叉连接的意思就是,芯片1的RxD连接芯片2的TXD,芯片2的RXD连接芯片1的TXD。这样,两个芯片之间就可以进行TTL电平通信了。STM32与51单片机串口通信相关实例,请移步此处:STM32与51单片机串口通信实例。
若是芯片与PC机(或上位机)相连,除了共地之外,就不能这样直接交叉连接了。尽管PC机和芯片都有TXD和RXD引脚,但是通常PC机(或上位机)通常使用的都是RS232接口(通常为DB9封装),因此不能直接交叉连接。RS232接口是9针(或引脚),通常是TxD和RxD经过电平转换得到的。故,要想使得芯片与PC机的RS232接口直接通信,需要也将芯片的输入输出端口也电平转换成RS232类型,再交叉连接。
经过电平转换后,芯片串口和RS232的电平标准是不一样的:
单片机的电平标准(TTL电平):+5V表示1,0V表示0;
RS232的电平标准:+15/+13 V表示0,-15/-13表示1。
RS-232通讯协议标准串口的设备间通讯结构图如下:
所以单片机串口与PC串口通信就应该遵循下面的连接方式:在单片机串口与上位机给出的RS232口之间,通过电平转换电路(如下面图中的Max232芯片) 实现TTL电平与RS232电平之间的转换。
RS232串口简介
台式机电脑后面的9针接口就是com口(串口) 在工业控制 数据采集上应用广泛上图中,最右边的是串口接口统称为RS232接口,是常见的DB9封装。
通信过程中只有两个脚参与通信。
2脚:电脑的输入RXD
3脚:电脑的输出TXD 通过2 ,3 脚就可以实现全双工(可同时收发)的串行异步 通信
5脚:接地
单片机的P3口是有两个复用接口RXD 和TXD。这是单片机进行串行通信的收发口,连接应该错位的对应到电脑的TDX RDX上。注意:单片机和RS232的电平标准是不一样的。
单片机的电平标准 TTL电平 :+5V表示1 0V表示0。
RS232的电平标准 +15/+13 V表示1 -15/-13 表示0。
所以 单片机与电脑串口通信就应该遵循下面的连接方式:
在单片机与上位机给出的RS232口之间通过电平转换电路(最上面图中的Max232芯片) 实现TTL电平与RS232电平之间的转换,PC串口与单片机串口连接方式图:
注意这两个DB9:DB91是在电脑上的 DB92是在单片机实验板上焊接着的。
这里的交叉连接的意思是 DB91的RXD连着DB92的TXD。
DB92的RXD连着DB91的TXD这样交叉着连接,如果电脑没有RS232口 只有USB口,可以用串口转接线转出串口,如下图所示。
这个时候在电脑上位机上需要安装串口驱动程序。whaosoft aiot http://143ai.com
注意,这个驱动程序驱动的是PL2303芯片(在上图的大头里面) 使得RS232信息转换成USB信息。
下图为上图的内部结构:
用串口通信比USB简单,因为串口通信没有协议,使用方便简单。
STM32的UART特点
全双工异步通信;
分数波特率发生器系统,提供精确的波特率。发送和接受共用的可编程波特率,最高可达4.5Mbits/s;
可编程的数据字长度(8位或者9位);
可配置的停止位(支持1或者2位停止位);
可配置的使用DMA多缓冲器通信;
单独的发送器和接收器使能位;
检测标志:
① 接受缓冲器
②发送缓冲器空
③传输结束标志;
多个带标志的中断源,触发中断;
其他:校验控制,四个错误检测标志。
串口通信过程
STM32中UART参数
串口通讯的数据包由发送设备通过自身的TXD接口传输到接收设备的RXD接口,通讯双方的数据包格式要规约一致才能正常收发数据。
STM32中串口异步通信需要定义的参数:起始位、数据位(8位或者9位)、奇偶校验位(第9位)、停止位(1,15,2位)、波特率设置。
UART串口通信的数据包以帧为单位,常用的帧结构为:1位起始位+8位数据位+1位奇偶校验位(可选)+1位停止位。如下图所示:
奇偶校验位分为奇校验和偶校验两种,是一种简单的数据误码校验方法。奇校验是指每帧数据中,包括数据位和奇偶校验位的全部9个位中1的个数必须为奇数;偶校验是指每帧数据中,包括数据位和奇偶校验位的全部9个位中1的个数必须为偶数。
校验方法除了奇校验(odd)、偶校验(even)之外,还可以有:0 校验(space)、1 校验(mark)以及无校验(noparity)。 0/1校验:不管有效数据中的内容是什么,校验位总为0或者1。
UART(USART)框图
这个框图分成上、中、下三个部分。本文大概地讲述一下各个部分的内容,具体的可以看《STM32中文参考手册》中的描述。
框图的上部分,数据从RX进入到接收移位寄存器,后进入到接收数据寄存器,最终供CPU或者DMA来进行读取;数据从CPU或者DMA传递过来,进入发送数据寄存器,后进入发送移位寄存器,最终通过TX发送出去。
然而,UART的发送和接收都需要波特率来进行控制的,波特率是怎样控制的呢?
这就到了框图的下部分,在接收移位寄存器、发送移位寄存器都还有一个进入的箭头,分别连接到接收器控制、发送器控制。而这两者连接的又是接收器时钟、发送器时钟。也就是说,异步通信尽管没有时钟同步信号,但是在串口内部,是提供了时钟信号来进行控制的。而接收器时钟和发送器时钟有是由什么控制的呢?
可以看到,接收器时钟和发送器时钟又被连接到同一个控制单元,也就是说它们共用一个波特率发生器。同时也可以看到接收器时钟(发生器时钟)的计算方法、USRRTDIV的计算方法。
如何使用串口通讯,你需要知道的几个重要的知识点:
波特率,数据传输的速度,如上图设置为9600,那么程序中也要设置为9600
硬件连接,接收、发送交叉连接,如上图TxD->RxD,RxD->TxD
停止位
奇偶校验
硬件数据流
其中,后3项一般不需要改变。
学会串口通信能做什么
学过C语言的人都知道,程序开发需要不断调试不断验证。很多的语言编程软件都有很完整的程序调试功能。使用起来很方便。而我们的开发虽然也是用C语言,但我们的程序最终运行的环境不是在我们的开平台而是在真正的硬件系统中运行。这时想要查看程序的运行过程或者结果就不像编程软件那么方便了。
想要解决这个问题,我们这时就可以借助串口通信来把我们需要知道的结果又或者是程序运行的关键步骤发送到电脑上,我们就知道程序在硬件系统中运行是否出现问题。51单片机可以用串口来调试,STM32可以用串口来调试,Linux开发板也是使用串口来调试。
当你学会串口通信时,你可以开始玩WIFI模块、GSM模块、蓝牙模块、GPS模块、以及各种使用串口通信的传感器等等。有能力你还可以编写上位机软件通过串口通信来控制设备。
串口通信需要什么
如果你只有STM32核心板,那么你还需要一个串口转USB模块和一个串口数据接收软件还有几根杜邦线就可以了。
如果你的是比较完整的一款开发板的话,一般都已经带有串口转USB模块,这样使用起来就更简单了。聪明的你是不是发现还缺少了点什么,对。没错因为还缺少了最重要的程序。想要使用串口通信当然还需要写串口通信的程序。
下文就教你如何去用,而不是写。
而下文中的实验基于标准库实现的,与HAL相比思路是一样的。
在做一个实验时,最好把这个实验分割成几个关键的步骤,这样做的好处就是可以清晰的知道自己需要做什么,以及做完了哪些。还有哪些还没做。
下面把串口实验分成几个关键的步骤:
1)串口通信使用到的GPIO引脚配置
STM32F103系列的芯片一般都有三个串口以上,用来调试使用的串口一般都是使用USART1。其他的串口配置都是一样的。
下面这段就是串口配置的程序:
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能USART1,GPIOA时钟
//USART1_TX GPIOA.9
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIOA.9
//USART1_RX GPIOA.10初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PA10
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIOA.10
串口使用的的GPIO口是PA9和PA10,所以只需配置这两个IO口的输入输出模式就可以了。
2)串口主要参数设置(直接看程序)
USART_InitTypeDef USART_InitStructure;
//USART 初始化设置
USART_InitStructure.USART_BaudRate = bound;
//串口波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
//数据格式,8位
USART_InitStructure.USART_StopBits = USART_StopBits_1;
//一个停止位
USART_InitStructure.USART_Parity = USART_Parity_No;
//无奇偶校验位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
//无硬件数据流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
//收发模式
USART_Init(USART1, &USART_InitStructure);
//初始化串口1
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
//开启串口接受中断
串口参数配置无法就是配置串口的波特率、数据格式、停止位、奇偶校验、硬件流、收发模式。除了波特率需要改变其他的参数都不需要管。直接复制拿来用。
3)串口中断配置
串口如果使用中断接收,那么就需要配置串口的中断参数,配置项无法就是配置那个的中断源和中断的优先级。
NVIC_InitTypeDef NVIC_InitStructure;
//Usart1 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ; //抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
4)串口使能
就是你需要什么时候开始使用串口功能,就是一句原有的函数。
USART_Cmd(USART1, ENABLE); //使能串口1
5)编写串口中断处理函数
使用库函数开发,所有的中断函数都是已经存在的,只是中断函数里面没有处理任何事情而已。中断函数如下:
完整的串口中断函数:
void USART1_IRQHandler(void)
{
int Res=0; //定义一个变量用来接收串口数据集
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾)
{
Res =USART_ReceiveData(USART1); //读取接收到的数据
USART_SendData(USART1,Res ); //把接收到的数据通过串口1发送出去
}
}
串口数据的接收和发送的函数都是库函数提供的,想用时只需找到它直接拿来用就可以了。
二、为什么 DNS 根服务器只有 13 台
在分享个网路知识
域名系统是最重要的互联网服务之一,没有它,我们将无法访问在线内容,甚至无法发送电子邮件。每当我们尝试连接到其他网站或在线服务时,根 DNS 服务器都会帮助我们的计算机找到并到达我们想要的地址。
DNS 根服务器是所有 DNS 的组成部分,因此也是 Internet 的组成部分,但关于它的信息并不多。今天我们将学习什么是根服务器?它们的作用是什么?以及实际上有多少根服务器?
根服务器或 DNS 根服务器是负责 DNS 和整个 Internet 功能的名称服务器,它们是确定任何域名名称的第一步,DNS可以将域名转换为 IP 地址。
根区是顶级域的全局列表,它包含通用顶级域(.com、.net、.org)、国家代码顶级域(.no、.se、.uk)和国际化的顶级域名,即以各国本地字符编写的 ccTLD,根区来自互联网号码分配机构 (IANA),它是互联网名称与数字地址分配机构 (ICANN) 的一部分。
域名到 IP 地址的映射是使用 DNS 区域以分层顺序完成的,根服务器为根区域提供服务,根区域位于层次结构的顶部并发布根区域文件,根区域文件又包含所有 TLD 授权服务器的资源记录。因此,它们可以通过两种方式工作:
直接响应对根区域中的此资源记录的请求
将请求转发到所请求 TLD 的适当名称服务器
尽管在后一种情况下它们不直接参与名称解析,但根服务器位于整个 Internet 基础结构的根目录中,没有它们,我们今天所了解和使用的大部分网络都将无法使用。
根服务器的工作方式取决于名称解析过程:
当您在 Web 浏览器中输入 www.wljslmz.com 时,它会首先迁移到您的 ISP 的 DNS 服务器或您配置的其他 DNS 服务器。有时,这些 DNS 服务器会缓存域信息,在这种情况下,它只回答信息并让您可以访问该网站。
但是,如果未存储此信息,则 DNS 服务器会向主服务器发送请求,根服务器没有关于 www.wljslmz.com 的特定 IP 地址的信息,但它们知道为该 TLD (.com) 提供服务的名称服务器的位置。
根服务器返回一个 TLD 服务器列表,以便提供者或配置的服务器可以重新发送请求,这次是到 TLD 服务器。
TLD 服务器然后返回存储所需域的授权名称服务器。
当请求服务器向域所在的授权服务器发送请求时就是这种情况。
一旦请求到达授权服务器,它就会用 www.wljslmz.com 的 IP 地址回复请求服务器
当请求服务器获得此信息时,它会将其保存以备将来请求,并将响应发送回您的转换器,转换器将其发送到您的 Web 浏览器并允许您访问所需的网站。
这个大家都知道,一共有13台,为什么只有 13 个根服务器?
这是由于本地 DNS 基础设施的限制,它使用的是 32 字节 IPv4,IP 地址必须对应一个数据包,当时数据包限制为 512 字节,所以每个IPv4地址是32位,其中13位是416字节,剩下的96字节是协议信息。
起初,13 个 IP 地址中的每一个都有一个服务器,今天我们为每个 IP 地址赋予一个服务器集群,使用广播路由创建了一个由全球数百台服务器组成的网络。
这有助于平衡去中心化并确保可靠性,即使其中一个根服务器由于 DDoS 攻击或其他类型的 DNS 攻击也可以保证网络的可用性。
然而,由于 IPv6 的小数据包大小限制,因此几乎可以肯定,未来会出现更多的根 DNS 服务器。
13个DNS根服务器为啥不能分一台给中国?
这个问题,相信不用回答了,根本不可能,不是政治问题,而是技术问题,本身已经超出协议范围能力了,已经有根DNS的组织是不可能让给中国的。
在中国,一共有26个根域名服务器节点:
北京市I、L、J、K、F
香港特别行政区A、I、H、F、F、E、J
台北市I、E、F、F、K、L
澳门特别行政区E、F
上海市L
杭州市F
郑州市L
武汉市L
西宁市L
贵阳市K
免费公共DNS服务器IP地址(常用部分)
114 DNS
首选:114.114.114.114 备选:114.114.115.115
AliDNS 阿里公共 DNS
首选:223.5.5.5 备用:223.6.6.6
百度 BaiduDNS
IPv4 地址:180.76.76.76 IPv6 地址:2400:da00::6666
Public DNS+
首选:119.29.29.29 备用:119.28.28.28 备用:182.254.118.118 备用:182.254.116.116
CNNIC sDNS
首选:1.2.4.8 备用:210.2.4.8
清华大学 DNS 服务器
2001:da8:200:ffff::28 上海交大 DNS 服务器 2001:da8:8000:1:202:120:2:101
北京邮电大学 DNS 服务器
2001:da8:202:10::36 或 2001:da8:202:10::37
等等,还有很多,等有机会给大家整理一个全的。
我们都知道,网络掌握在其他国家,安全性会受到极大的安全风险,我们错过了13个根服务器,难道永远都要“寄人篱下”吗?
当然不是!
虽然我们不能在ipv4领域拥有根DNS服务器,但是我们在ipv6的根DNS服务器中已经占有一席之地了。随着国家对ipv6的支持,中国在ipv6网络建设上已经有了惊人的速度!
随之而来的ipv6根DNS服务器中,中国拥有4台服务器,其中,一台为主根,其他三台为辅根!!!
DNS 负责几乎所有与 Internet 相关的事情,根 DNS 服务器是互联网的支柱。
希望通过本文,大家能够对于13个DNS根服务器有所了解。
在安全方面,DNS 仍然是企业基础设施中最容易被忽视的部分之一,这就是频繁执行 DNS 审计如此重要的原因。
重视技术的本质,才能立足于技术公司之本!!!