newlined 发表于 2024-9-9 09:02 你编写过单片机代码,并且使用串口, 应该会发现 如果程序没有做特定处理,上电初期出现一两个乱码是很常见现象。 一但因为各种原因,出现误判的起始位,必定会有乱码,这时候,起始位和停止位的作用就体现出来了,乱码最多不会超过8个字节。一定会纠正过来,如果自己编写上下位机代码,停止位长度扩大到8位,那么乱码最多也就一个字节。 |
newlined 发表于 2024-9-9 09:02 对,这些问题正是编程时要考虑及规避的 |
dalaoshi 发表于 2024-9-10 02:53 对的,应该是这样,当出现乱码后,直到出现一个字节的停顿,然后才重新开始,8楼lkc8210 老师说过:不要把起始位当作一个位,用的到的只是那一个下降沿,也就是接收方收到这个下降沿,定时器开始跑,计数,相当于每接收一个字节就同步一次,所以一般不会出现逻辑错误,前几天我算过,串口接收方定时器的溢出速率是串口波特率的4倍,正好在中间采样一次。 |
lkc8210 发表于 2024-9-9 09:22 也许我有些明白了,您说的对,不要把起始位当作一个位,用的到的只是那一个下降沿,接收方收到这个下降沿,马上开始计数,相当于每接收一个字节的数据,就同步一次时钟,时钟不会出现累计的误差,这就是称为异步传输的原因? |
| @xiaobendan001,“后面的持续的高电平就告诉接收端本次结束了,用来复位接收用的计数器”我的困惑归根到底就是接收方如何判断一个字节的接受完成,您这句话提醒了我,接收方是不是不定时强制复位接受计数器,比如每当收到10个位的1时,这时肯定是空闲状态,强制复位接受计数器,然后再收到低电平,则开始计数,接收数据,接收完一个字节,复位接受计数器,然后再收到低电平则认为是下一字节的起始位,连续收到持续的高电平,再强制复位一次,确保下一次正确识别起始位? |
newlined 发表于 2024-9-9 09:02 如果数据不断传送,当然就一直乱下去,直到最少出现一个字节的停顿,这时全是高电位,停止位也已收到,等再接到一个低电位,就表示是起始位,又再同步了。 |
| 没学过数字电路和通讯吧,这个是按时间采样数据的 |
newlined 发表于 2024-9-9 09:02 我的理解是发送一个0,告诉对方我要发东西了,约定了波特率就定义了每个信号的宽度,从第一个0开始,每隔一个宽度时间记录一个信号,直到8(9)个信号接完了就算一组信号完成了。后面的持续的高电平就告诉接收端本次结束了,用来复位接收用的计数器。中间有干扰当然就是错误的数据了。所以才有校验啊,校验不对就扔掉数据重新等待下次的。 |
lkc8210 发表于 2024-9-9 09:22 是的,应是检测下降沿,问题是收到1后,再收到0,也是先收到一个下降沿。 |
qq475878026 发表于 2024-9-9 09:08 第二位开始应该收到的是数据了 |
|
在串行通信(通常称为串口通信)中,数据是以一连串的比特流形式发送的。为了确保接收端能够正确地解析这些比特流,通信协议规定了一些特殊的位来同步收发双方的数据传输过程。其中,起始位(Start Bit)和停止位(Stop Bit)就是这样的标志位。 起始位(Start Bit) 起始位是一个逻辑低电平(0),用来标识一个字符帧的开始。 在空闲状态下,串行线路上通常保持高电平(逻辑1)。当线路从高电平转变为低电平时,接收方就知道一个新的字符即将到达。 起始位之后跟着的是数据位,即实际要传输的信息。 停止位(Stop Bit) 停止位是一个或多个逻辑高电平(1),用来标识一个字符帧的结束。 停止位可以是1位、1.5位或者2位长度,这取决于通信双方的约定。 发送完数据位后,发送方会发送停止位,告知接收方该字符帧已经结束。 如何区分 实际上,在硬件层面上,起始位和停止位是通过电平的变化来自动检测的,并不需要用户手动去区分它们。硬件(如微控制器中的UART接口)根据预先设置好的配置(例如波特率、数据位数、奇偶校验位、停止位数等)自动处理这些位。 在编程配置串口通信时,你需要设定好起始位、数据位、奇偶校验位以及停止位的具体参数。例如,在大多数情况下,起始位始终是一个低电平位,而停止位是一个或多个高电平位。这些参数的选择会影响到数据传输的可靠性。 总之,在实际应用中,你只需要按照所使用的通信协议来正确配置串口参数即可,硬件会自动处理起始位和停止位的识别与使用。如果你正在编写驱动程序或底层固件,则需要理解这些位是如何工作的,并确保你的代码正确地实现了这些位的生成和检测。 |
|
以我理解 不要把起始位当作一个位 用的到的只是那一个下降沿 当收到下降沿就开始定时扫描(如9600,就是104us) 扫描8次之后,就完成一次通信 结束位也不是一个位 只是用来回复高电平,为下一个起始位(下降沿)作准备 |
newlined 发表于 2024-9-8 16:31 既然叫起始位那第一位收到的就是起始位,第二位收到的才是0 |
188610329 发表于 2024-9-8 21:51 我的意思是如何定义一次传输的开始,如果双方都认为是闲置状态,那么发送方发出一个低电平,接收方会识别为起始位,开始收数据,那没有问题。如果上电的一瞬间,电路电平不稳定,或者电路出了问题,比如说传输过程中出现干扰,甚至断路,然后又连接上了,这个时候肯定会出现乱码,如果双方不重现确认一次起始位,会一直乱下去吗? |
|
你对"位"这个字怎么理解? 既然叫"起始位", 那么这个位置自然就是固定的0, 既然叫"停止位"那么这个位置就是固定的1,和数据位的0/1所在位置不同,如何会无法区分呢? 发送FF 也好 发送00也好,始终都是要由起始位开始的,既然开始了,怎么会认为是空闲呢? |
| 首先,开始数据传输之前,双方会约定一个传输速率,即我们所说的波特率;在不同时钟的主机和从机中,主机都需要计数n次以达到一个波特率的传输时间。如果所使用的uart协议中规定起始位为低电平,停止位为高电平,数据位长度固定为8bit,停止位1bit,那么接受方就会侦测起始位,并且在每个计数周期进行一次数据采样,直到停止位。 |
huashanhui20 发表于 2024-9-7 22:10 是的,波特率最重要,波特率要设定相同,关键是如何确定起始位,就是收到一个0后,如何确定这个是0还是起始位,也就是说如何定义发一个字节结束,知道一个字节结束后,再来一个0,就可以认为是起始位,不会是连续的10个高电平后来的0是起始位吧,我曾用示波器观察过连续发数据时的波形,发完一个字节后的空闲时间很短,也就是一个BIT多点,然后就是起始位了。 |
| 串口通信中,首先最重要的是波特率,收发双方约定多少时间为一个bit位,然后空闲是高电平,当接收方收到一个起始位(也就是符合一个bit位的低电平)就可以认为是一帧数据,至于后面的8个数据位只要符合0的时长就认为是0,符合1就认为是1,如果发送FF它也不会认为是空闲,因为有起始位0是低电平 |