UART的break信号

article/2025/8/21 19:49:23

目录

1.TTL电平和RS232电平

2.UART的时序

3.break信号

4.如何检测break信号?


最近的一个项目用到了UART的break信号,在查资料的过程中,发现很多文章对break信号有介绍,但是都很简单,看了让人摸不着头脑,所以想把找的资料加上自己的理解整理一下,方便自己以后查看。博客引用的其他人的文章或者论坛等在文末有连接。有很多内容是我对找到的资料的理解,如果有不对的地方欢迎评论指正。

1.TTL电平和RS232电平

要想说明白break信号,我觉的首先要说清楚UART的电平,在网上对break信号描述中,很多是用RS232串口来说的,但是芯片一般都是TTL电平的。RS232电平是有正负的,TTL只有正,所以好多人被RS232的电平给搞晕了。

串口标准RS-232C标准(协议)的全称是EIA-RS-232C标准。
EIA-RS-232C对电器特性、逻辑电平和各种信号线功能都作了规定。
          在TxD和RxD上:逻辑1(MARK)=-3V~-15V
          在TxD和RxD上: 逻辑0(SPACE)=+3~+15V
          在RTS、CTS、DSR、DTR和DCD等控制线上:
               信号有效(接通,ON状态,正电压)=+3V~+15V
               信号无效(断开,OFF状态,负电压)=-3V~-15V
EIA-RS-232C是用正负电压来表示逻辑状态,与TTL以高低电平表示逻辑状态的规定不同。因此,为了能够同计算机接口或终端的TTL器件连接,必须在EIA-RS-232C与TTL电路之间进行电平和逻辑关系的变换。实现这种变换的方法可用分立元件,也可用集成电路芯片。

 TTL是Transistor-Transistor Logic,即晶体管-晶体管逻辑的简称,它是计算机处理器控制的设备内部各部分之间通信的标准技术。TTL电平信号应用广泛,是因为其数据表示采用二进制规定,+5V等价于逻辑"1",0V等价于逻辑"0"。
数字电路中,由TTL电子元器件组成电路的电平是个电压范围,规定:

 

  1.    输出高电平>=2.4V,输出低电平<=0.4V;
  2.    输入高电平>=2.0V,输入低电平<=0.8V。

 

总结一下,TTL和RS232是电平不同,但是在理解break信号的时候我们不需要考虑电平的正负问题。在很多其他资料中会提到MARK电平(状态)、SPACE电平,这些都是指RS232电平,MARK是逻辑1,对应TTL的高电平,SPACE是逻辑0,对应TTL的低电平。在下面分析中我只会说高低电平或者逻辑1或者逻辑0.

2.UART的时序

时序我觉得有必要先说明一下,因为brake信号其实就是持续一段时间的低电平(逻辑0或者说SPACE电平),只有了解了UART的时序,才更好理解break信号。

UART的每一帧数据是包括起始位、数据位、停止位,这三个是一定会有的,也可以选择加上检验位(奇校验或者偶校验),检验位在数据位和停止位之间。数据位和停止位是可以设置的。例如最常用的数据位是8bit(1字节),当然还有5-9bit,甚至更多,不同的芯片可能不一样。插一个题外话:串口通信数据位长度对传输数据的影响   

 

空闲位:处于逻辑“1”状态,表示当前线路上没有资料传送。

起始位:先发出一个逻辑”0”的信号,表示传输字符的开始。其实就是发送一个从“高到低”动作,低电平需要保持1 bit的时间

数据位:紧接着起始位之后。资料位的个数可以是4、5、6、7、8等,构成一个字符。通常采用ASCII码。从最低位开始传送,靠时钟定位。

奇偶校验位:资料位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验资料传送的正确性。

停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。 由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供 计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。

波特率:是衡量资料传送速率的指标。表示每秒钟传送的二进制位数。例如资料传送速率为120字符/秒,而每一个字符为10位,则其传送的波特率为10×120=1200位/秒=1200波特。

 

每个数据都是由1个start位开始的,开始位始终是逻辑0。跟随在开始位后面的是特定长度的数据,数据是LSB模式(先发地位再发高位)发送的;如果校验位被使能,那么1个校验位也将产生,并被发送。数据的最后一位由1个stop位标志,结束位始终是逻辑1。一个空闲line就是由连续多个的stop位组成的,这也就意味着空闲信号其实就是信号线一直保持在逻辑1。

例子:一个ASCII字符“A”(8-bit,hex码为0x41)一直都是以如下的方式进行传送的。注意:数据是LSB first发送方式。

再发一个时序图:

3.break信号

    出现以下情况时,可使UART 产生中断:
          (1).FIFO 溢出错误
          (2).线中止错误(line-break,即Rx 信号一直为0 的状态,包括校验位和停止位在内)
          (3).奇偶校验错误
          (4).帧错误(停止位不为1)
          (5).接收超时(接收FIFO 已有数据但未满,而后续数据长时间不来)
          (6).发送
          (7).接收

   break信号波形

      我网上找了一下资料,有两个描述: 

      (1). 一般,直到有数据传输时,接收和传输信号会保持在mark电压。如果一个信号掉到space电压并且持续了很长时间,一般来说是1/4到1/2秒,那么就说有一个break条件存在了。break经常被用来重置一条数据线或者用来改变像调制解调器这样的设备的通讯模式

    (2).Since there is always some period of time where the line will be in a mark state between data characters, the start of a character can always be recognised. This also means that the longest period of time that the line can be in a space state is:
    1 start bit + however many data bits + a parity bit (if any)
   A break signal is defined as holding the line in the space state for longer than that period of time - no valid data byte can do that, so the break 'character' isn't really a character. It's a special signal.

 

As far as when you need to issue a break signal depends entirely on the protocol being used.

     下面是我的理解是:

         break就是一个逻辑低电平,电平持续时间多久可就自定义,但是至少要大于1帧数据中开始位+数据位+检验位+停止位的时间。一般是1/4到1/2秒。

         因为UART的空闲状态是高电平, stop位是也是高电平,那么整个UART在传输过程中低电平的持续时间最大就是:1bit位的起始位(低电平)+n bit的数据位(传输的数据全0)+1bit的校验位(校验位是0),所以只要有大于这个时间的低电平,肯定不是数据,那么久可以作为break信号了。因为一般UART的波特率都不低,即使波特率是200,1bit位的时间也有5ms,一帧一般也就十几个bit,所以一般break信号的低电平持续时间大于100ms就可以了。

4.如何检测break信号?

下面有人评论问如何识别break信号,这个确实没有做过,之前客户只要求modem在收到短信的时候产生break信号,识别break信号是客户做的,因为是国外的客户,而且这个项目都已经算结束了,也不方便问客户。手上刚好有STM32的芯片手册,发现STM32里面有一些break信号的内容可以提供参考。

STM32里有个断开符号的概念,就是break信号,只是这个信号持续时间最多只有12个bit位'0'(1个起始位+九个数据位+2个停止位),然后就变成了高电平,这个低电平时间应该只有us级别。

STM32可以通过设置控制寄存器的SBK标志位,能够直接发送断开信号,如下图。如果想要break信号持续时间达到100ms左右,这种方式是不可以的,原因上面已经说了,所以只能把TX当成GPIO,设置为0,持续n ms,然后拉高。我看到展讯的modem的UART代码,就是这样产生break信号的。

再看STM32如何检测断开符号,如下图:

通过上面的资料可知,当RX上有break信号的时候,UART会有一个帧错误,我们可以在中断处理函数中检测FE标志位,如果为1,那么有可能是帧错误或者break信号,接着我们在检测RX引脚,如果低电平持续时间达到了几十毫秒,则说明是break信号。

后来我仔细看STM的UART的资料,发现UART有个LIN模式,有个LIN断开符检测中断,能够直接检测break信号。

这些都是我在STM32的芯片手册上找到的,芯片手册链接:STM32中文参考手册_V10.pdf
因为手里面只有一块STM32的开发板,想使用PC来发送break信号做测试,但是不知道PC怎么发送break信号,所以并没有做测试。
我觉得其他的芯片应该也有类似的机制。

 

参考资料:

http://www.chinadmd.com/file/szacieprs6rx6ocrivieswvz_1.html

串口标准RS232C电压

UART串口协议基础1

怎样通过uart发送“break”信号


http://chatgpt.dhexx.cn/article/4jei888r.shtml

相关文章

c++ break语句

break语句 brea语句是用来跳出switch或者循环体结构的语句。循环语句中的break用法与switch类似&#xff0c;可以直接忽视条件判断而直接跳出循环。 break在for循环中的用法 #include<iostream> using namespace std;//break语句int main() {for ( int i0;i<10;i){…

break和continue

break和continue的作用和区别是什么&#xff1f; 一、break和continue的作用 二、break和continue的区别 三、案例分析 一、break和continue的作用 break和continue都是用来控制循环结构的&#xff0c;主要作用是停止循环。 二、break和continue的区别 1、break用于跳出一…

break关键字

1、break关键字用于 while、for 循环时&#xff0c;会终止循环而执行整个循环语句后面的代码。break 关键字通常和 if 语句一起使用&#xff0c;即满足条件时便跳出循环。这里强调一下&#xff0c;如果存在多层循环的时候&#xff0c;break只会跳出当前循环&#xff1b;下面是测…

break用法

参考例程 1 -> 用于for循环 for(;;){// Afor(;;) {// Bbreak; // 只跳出B的for循环}}参考例程 2 -> 用于switch int i;switch&#xff08;i&#xff09;{case 1:break; // 跳出Switchcase 2:break; // 跳出Switchdefault:break; // 跳出Switch}总结 1、break 在一些…

break 通过自定义标签跳到指定位置

实现比较简单&#xff0c;但是不常用&#xff0c;所以本篇博客作为一个笔记使用&#xff0c;因代码简单&#xff0c;直接粘贴代码和运行结果 public class Tets {public static void main(String[] args) {b:for(;;){System.out.println("bbbbbbbbbbbbbbbbbbbbbb");…

c#语言break语句用法,C# break语句

C# 中的break语句主要有两个用法&#xff1a; 在循环中使用&#xff0c;当循环中遇到break语句时&#xff0c;循环将立即终止&#xff0c;程序控制在循环之后的下一个语句中恢复。 它可以用于终止switch语句中的case语句。 如果使用嵌套循环(即在一个循环中使用另一个循环)&…

matlab中break语句,MATLAB break语句

本文概述 break语句终止for循环或while循环的执行。当遇到break语句时, 执行将继续循环外的下一条语句。在嵌套循环中, break仅存在于最内部的循环中。 句法 break 以下是在MATLAB中使用break语句时的要点 break关键字用于定义break语句。 break语句终止或停止for或while循环的…

break语句

break语句 break译为&#xff1a;中断 定理&#xff1a; 1、break语句可以结束当前循环的执行 2、执行完break语句后&#xff0c;循环体中位于break语句后面的语句就不会被执行 3、在多重循环中&#xff0c;break语句只向外跳一层 只能在循环体内或switch语句中使用break语句…

break的相关知识

break&#xff0c;continue的相关知识 &#xff08;1&#xff09;只能在循环体内和switch语句体内使用break&#xff0c;注意在循环体内即可&#xff0c;比如循环体内的if语句中也可用break&#xff0c;其实通常break语句与if语句联用&#xff0c;用于满足某种条件直接退出循环…

break语句的作用

关于break语句的适用范围 1.情形&#xff1a;在循环体中&#xff0c;常常会有许多if语句&#xff0c;if语句内部往往会出现break或continue语句&#xff0c;那么此时跳出的究竟是if语句还是循环语句呢&#xff1f; 2.break语句的作用&#xff1a;跳出当前循环体&#xff0c;也…

不加群提取群成员_QQ群引流推广怎么做

日引粉200秘籍 一&#xff1a;如何做网络推广 百度推广 (点击上方视频观看) 二&#xff1a;正文 QQ群引流怎么做&#xff1f; 很多人在做引流的时候&#xff0c;都是同时去尝试了N种渠道和方法&#xff0c;却没有一种能带来好的效果&#xff0c;究其原因&#xff0c;并不是渠道…

不加群提取群成员深度体会,少走点儿弯路吧

QQ现在越来越有被微信取代日常使用的趋势&#xff0c;但QQ还是有很多不错的地方&#xff0c;比如QQ群&#xff0c;上面沉淀了很多有用的资源&#xff0c;特别适合我这种搞市场推广的苦逼销售&#xff0c;虽然不用像传统销售那样成天外头跑&#xff0c;不用发名片&#xff0c;不…

小技巧 - 怎样屏蔽群消息(包括 @全体成员)?

加的群太多后经常会弹出一些消息&#xff0c;我们该如何屏蔽这些群消息呢&#xff1f;有时候屏蔽了群消息还能收到全体成员的消息我们怎么把这种消息屏蔽掉呢&#xff1f; 方法 / 步骤 打开QQ&#xff0c;在联系人界面选择群。 打开群列表&#xff0c;找到你想屏蔽的群。进入群…

【7】不变子群和商群

【7】不变子群和商群 1.引例--通过计算左右陪集引出&#xff1a;2.不变子群的定义2.1性质和推论交换群的任何子群都是不变子群循环群的子群都是不变子群素数阶群的任何子群都是不变子群平凡子群是不变子群 2.2 群的中心 3. 具体例子4.不变子群的判定定理5.商群推论&#xff1a;…

用户、群组和权限

参考 用户、群组和权限 - 云社区 - 腾讯云 Linux系统的安全措施&#xff1a; Linux系统所采取的安全措施如下&#xff0c;用户登录系统时必须提供用户名和密码&#xff0c;以用户和群组来控制访问文件和其他资源&#xff0c;每个文件都属于一个用户并与一群文件相关&#xff…

企业微信外部群和内部群有什么区别?如何创建外部群

一、企业微信外部群和内部群的区别 1、成员来源渠道不同 企业微信内部群的群成员必须是同一公司的企业微信用户&#xff0c;而外部群是可以同时含有不同企业的企业微信用户与个人微信用户的。 PS&#xff1a;需要注意的是&#xff0c;因为微信和企业微信是两个不同的平台&…

如何搜索添加大量高质量微信社群

是不是想快速大量的添加高质量的微信社群&#xff0c;但是苦于找不到&#xff0c;甚至要花大量时间去找而头疼呢&#xff1f;现在看完下面的步骤&#xff0c;你如果还不明白怎么快速加群&#xff0c;那就怪小编&#xff1a;&#xff08;全免费的&#xff09; 每天更新大量的群&…

免费计算机群,获得大量的微信群的三种方法

随着微信的普及&#xff0c;微信群已经成为人与人们之间重要的交流工具之一&#xff0c; 这让一些想要从微信群了解到信息的人也蠢蠢欲动&#xff0c;那要怎么样获得大量的微信群呐?送你这三招。 方法一、微信群互换 通过“微信群互换”的前提是需要我们拥有一个以上的微信群&…

不加群提取群成员_快速提取PPT上的文字!

大家晚上好&#xff01; 众所周知&#xff0c;PPT的主打功能是展示&#xff0c;是利用一张一张的幻灯片来展示内容。如果是课件&#xff0c;需要收整PPT的内容来复习&#xff0c;有什么办法可以快速提取PPT上的字呢&#xff1f;下面琉璃为小伙伴介绍三种快速提取的方法。 准备工…