单片机串口通信奇偶校验

合集下载

51单片机串口通信程序。。含详细例子

51单片机串口通信程序。。含详细例子
while(RI == 0); RI = 0; c = SBUF; // 从缓冲区中把接收的字符放入 c 中 SBUF = c; // 要发送的字符放入缓冲区 while(TI == 0); TI = 0; } }
4.//////////////// /////////////////////////////////////////////////////////
pw.fpReadSign(); SendData();//通知上位机,送出读出器件特征字 }
void Erase()//擦除器件 {
pw.fpErase(); SendData();//通知上位机,擦除了器件 }
void Write()//写器件 {
BYTE n; pw.fpInitPro();//编程前的准备工作 SendData();//回应上位机表示进入写器件状态,
{
unsigned char c;
TMOD = 0x20; // 定时器 1 工作于 8 位自动重载模式, 用于产生波特率
TH1=(unsigned char)(256 - (XTAL / (32L * 12L * baudrate)));
TL1=(unsigned char)(256 - (XTAL / (32L * 12L * baudrate))); SCON = 0x50; PCON = 0x00; TR1 = 1; IE = 0x00; // 禁止任何中断 while(1) {
///////////////////////////////////////////////////////////////////////////////// //所支持的 FID,请在这里继续添加
///////////////////////////////////////////////////////////////////////////// extern void PreparePro00();//FID=00:AT89C51 编程器 extern void PreparePro01();//FID=01:AT89C2051 编程器 extern void PreparePro02();//FID=02:AT89S51 编程器

VB MSComm串口通讯处理奇偶校验异常

VB MSComm串口通讯处理奇偶校验异常

串口通讯时如果两台通讯设备奇偶校验不一致可能会出接收错误。

最近用VB编写上位机,发现当上位机设置为奇校验,下位机设置为无校验将会出现接收数据错误的情况。

最后调试发现,VB MSComm控件会自动处理奇偶校验异常,并将错误的值替换成ASCII?也就是0x63,举个例子。

当下位机发送2字节数据:0x100x12给上位机,这时由于奇偶校验异常,MSComm会发送0x630x630x100x124个字节数据给应用程序。

这个时候,如果应用程序没有处理奇偶校验异常,将会错误的将4个字节数据当成正确数据,从而出现通讯故障。

错误解决方法1.上位机识别奇偶校验异常然后进行纠正。

parity bit是指同一定数据位数一起传输的位,以提供简单的错误检查。

当使用校验位时,MSComm控件把在数据中已经设置的所有位(值为1)都加起来并检查其和为奇数或偶数(根据当端口开时奇偶校验的设置)。

按照缺省规定,MSComm控件用问号(?)替换非法字符。

若设置ParityReplace为一个空字符串(""),则当奇偶校验错误出现时,字符替换无效。

但OnComm事件仍然产生,并且设置CommEvent属性为comEventRXParity。

ParityReplace字符被用语面向字节的操作,它必须是单字节字符。

可指定0到255之间的任何ANSI字符代码。

数据类型Case comEvReceiveIf串口控制块_1.串口接收状态=True Then收到数据的长度=Form1.MSComm1.InBufferCountReDim收到的数据(收到数据的长度)收到的数据=Form1.MSComm1.InputCall数据接收(收到的数据,收到数据的长度,1)Else'清空BUFFER收到数据的长度=Form1.MSComm1.InBufferCount收到的数据=Form1.MSComm1.InputEnd IfCase comEventRxParityIf串口控制块_1.串口接收状态=True Then收到数据的长度=Form1.MSComm1.InBufferCountReDim收到的数据(收到数据的长度)收到的数据=Form1.MSComm1.InputElse'清空BUFFER收到数据的长度=Form1.MSComm1.InBufferCount收到的数据=Form1.MSComm1.InputEnd IfEnd Select上面代码的思路是:一旦MSComm控件接收到数据出现奇偶校验异常,将会产生comEventRxParity事件,并且将接收到的数据替换成0x63,但是正确的数据还会保存在MSComm的接收缓冲区中。

串口校验方式分析

串口校验方式分析

串口校验方式分析串口通讯过程中有五种校验方式,分别是无校验(None),奇校验(Odd),偶校验(Even), 1 校验(Mark), 0 校验(Space)0在RS232/RS485/RS422通讯中,通过串口发送一字节(8BIT)数据时,首先发送起始位(固定为0),然后发送8位数据(先低位后高位),如果校验方式不是无校验(None),则紧接着会发送一位校验位,最后发送停止位。

停止位固定为1。

停止位依据串口属性的设置可为1位,1.5位或2位。

为了说明简洁起见,下面均假设停止位位数为1而数据位位数为8。

在数据发送时,如果校验方式设置为无校验(None),则不发送校验位;否则会发送一位校验位。

具体地,如果校验方式设置为1校验(Mark),校验位固定为1;如果校验方式设置为0校验(Space),校验位固定为0;如果校验位为奇校验(Odd),或者偶校验(Even),那么校验位可能为0也可能为1,依据所发送的数据计算得出。

计算方法:如果是奇校验,那么8 位数据和1位校验位的累加和必是奇数;对应的,如果是偶校验,8位数据和1位校验位的累加和必为偶数。

比如,数据37,其二进制编码为00100101,编码中含有5个0和3个1, 5*0+3*13,如果采用奇校验,那么校验位为0;如果使用偶校验,校验位则为1。

串口MSConun控件在接收数据时,如果无校验,则只要检测到串口出现了数据,数据总能收到(试验发现,即使停止位为0也不会被认为是错误帧而遭遇抛弃);而采用了某种校验后,只有校验通码正确的数据才能被正确地收到。

试验中发现,发生校验错的那些数据在后面能校验通过的数据被收到时才被输出,输出值一律为5BH。

为什么是5BH ('[')呢?不明白,纳闷中…下面是试验过程中的截图:第一组试验:发送方发送的1个数据桢有10位组成:1位起始位,8位数据位,1位停止位试验(1. 1)发方:9600, N, 8, 1 (发出的数据位数为8)收方:9600, N, 8, 1解读:协议完全匹配,所有数据均能被正确收到。

奇偶校验原理

奇偶校验原理

奇偶校验原理奇偶校验是一种常见的数据传输错误检测方法,它通过在数据位中添加一个奇偶校验位来检测数据传输过程中的错误。

在计算机领域,奇偶校验被广泛应用于串行通信、存储系统和网络传输等领域。

本文将介绍奇偶校验的原理及其在数据传输中的应用。

奇偶校验的原理很简单,它通过对数据位进行统计,使得数据位中包含的1的个数为奇数或偶数。

具体来说,对于奇校验,校验位被设置为1,使得整个数据位中包含的1的个数为奇数;而对于偶校验,校验位被设置为0,使得整个数据位中包含的1的个数为偶数。

在接收端,通过统计接收到的数据位中1的个数,就可以判断数据传输过程中是否出现了错误。

在实际应用中,奇偶校验通常被用于串行通信中。

在串行通信中,数据是逐位传输的,因此很容易受到噪声和干扰的影响。

通过在每个数据字节的最后添加一个奇偶校验位,发送端可以在发送数据时计算出奇偶校验位,并将其附加到数据字节的末尾。

在接收端,接收到数据后,可以再次计算奇偶校验位,并与接收到的校验位进行比较,从而检测出数据传输过程中是否出现了错误。

除了串行通信外,奇偶校验还可以应用于存储系统中。

在存储系统中,数据的传输和存储也容易受到噪声和干扰的影响。

通过在存储的数据块中添加奇偶校验位,可以在读取数据时检测出存储过程中是否出现了错误,从而保障数据的完整性。

此外,奇偶校验还可以应用于网络传输中。

在网络传输中,数据的传输路径往往非常复杂,容易受到各种因素的影响。

通过在数据包中添加奇偶校验位,可以在数据包到达目的地后检测出数据传输过程中是否出现了错误,从而保障数据的准确传输。

总之,奇偶校验作为一种简单有效的数据传输错误检测方法,在计算机领域得到了广泛的应用。

通过在数据中添加奇偶校验位,可以在数据传输过程中及时检测出错误,保障数据的准确性和完整性。

在实际应用中,我们可以根据具体的需求选择奇校验或偶校验,并将其应用于不同的数据传输场景中,以提高数据传输的可靠性和稳定性。

uart奇偶校验原理

uart奇偶校验原理

uart奇偶校验原理UART(Universal Asynchronous Receiver/Transmitter)是一种常见的串行通信接口,广泛应用于各种电子设备中。

奇偶校验是UART通信中常用的一种错误检测机制。

本文将详细介绍UART奇偶校验的原理及其应用。

一、UART通信简介UART是一种全双工的串行通信协议,用于在计算机内部或计算机与外部设备之间传输数据。

它通过引脚间的电气信号传输数据,一般由发送器(Transmitter)和接收器(Receiver)两部分组成。

UART通信的特点是简单、实用、可靠,适用于各种设备之间的数据传输。

二、奇偶校验的概念奇偶校验是一种常见的数据传输错误检测机制。

在UART通信中,数据以二进制的形式传输,每个数据位都有一个奇偶校验位。

奇偶校验位的值根据数据位中1的个数确定,可以是奇校验或偶校验。

1. 奇校验:校验位设置为使数据中1的个数加上校验位的1的个数为奇数。

2. 偶校验:校验位设置为使数据中1的个数加上校验位的1的个数为偶数。

三、奇偶校验的原理奇偶校验是通过在数据位后添加一个校验位来完成的。

校验位的值由数据位中1的个数决定,从而实现对数据的校验。

校验位的生成和校验过程如下:1. 生成校验位:发送器在发送数据时,根据数据位中1的个数自动生成校验位。

如果是奇校验,校验位的值为1减去数据位中1的个数的余数;如果是偶校验,校验位的值为数据位中1的个数的余数。

2. 校验数据:接收器在接收数据时,根据接收到的数据位和校验位进行校验。

如果是奇校验,接收器对接收到的数据位中1的个数进行求和,然后判断校验位的值是否与求和结果奇偶性一致;如果是偶校验,接收器也对接收到的数据位中1的个数进行求和,然后判断校验位的值是否与求和结果奇偶性相反。

四、奇偶校验的应用奇偶校验主要用于UART通信中对数据的错误检测。

在数据传输过程中,接收器会通过校验位判断数据位中是否存在错误。

如果校验位的值与数据位中1的个数不一致,则说明数据传输过程中发生了错误。

简述at89c51单片机内部串行接口的4种工作方式

简述at89c51单片机内部串行接口的4种工作方式

简述at89c51单片机内部串行接口的4种工作方式
AT89C51单片机内部串行接口有4种不同的工作方式,它们分别是:
1. 模式0:异步串口通信方式,使用1个起始位,8个数据位和1个停止位,波特率可通过定时器控制。

2. 模式1:8位UART通信方式,使用1个起始位,8个数据位和1个停止位,波特率可通过定时器控制,可以设置奇偶校验位。

3. 模式2:SPI总线方式,支持主从机通信,数据传输时可以通过两根寄存器选择要传输的数据的方向。

4. 模式3:带自动重发机制的多机通信方式,支持多个从机的通信,主机发送数据后会收到从机的确认信号,如果没有收到则会自动重发。

串口通信协议:数据包校验与常用校验算法

串口通信协议:数据包校验与常用校验算法

串口通信协议:数据包校验与常用校验算法1.数据校验过程由于数据传输距离的因素影响,计算机和受控设备间的通信数据就常常出现不可预知的错误。

为了防止这些错误所带来的影响,一般在通信时采取数据校验方法,而奇偶校验和循环冗余码校验就是其中最常用的校验算法。

串行数据在传输过程中,由于干扰可能引起信息的错误,出现“误码”。

我们把如何发现传输中的错误,叫“检码”;发现错误后,如何进行修订,叫“检错”。

之前,就有过提示,为了保证数据在传输过程中不会出错,每个数据包后面一般都会加上校验字节。

校验过程是发送端(TX端)和接收端(RX端)共同完成的过程。

如上图所示,首先,TX端按照用户层协议(数据包格式)将数据根据校验算法计算出TX校验字节,并将TX校验字节按照协议放在数据包的指定位置。

RX端接收到数据包后,在指定位置取出TX校验字节,同时,再将接收到的数据按规定方式计算出RX校验字节,如果RX校验字节与接收到的TX校验字节相等,则说明数据包是有效的,否则就应该放弃该数据包。

2.简单粗暴地奇偶校验最简单粗暴的方法就是“奇偶校验”了,即在传输字符的各位之外,再传送一位奇/偶校验位。

可采用的策略分为奇校验和偶校验。

2.1 奇校验所有传送的位数(含字符的个数位和校验位)中,“1”的个数为奇数,如1 0110,0101;0 0110,00012.2 偶校验所有传送的位数(含字符的各位数和检验位)中,“1”的个数为偶数,如1 0100,0101;0 0100,0001奇偶校验能够检测出信息传输过程中的部分错误的数据(一位错误的代码能够检出,两位及以上的错误代码不能检出)。

奇偶检验有一个劣势,就是他只能发现错误,而不能纠正错误;一旦发现错误,那么没办法,只能重发。

但是由于奇偶校验使用起来非常简单,仍然被广泛使用。

但是仍存在一些良好的矫正错误数据的方法,并具有自动訆错能力,如循环冗余码(CRC)检错等。

3.异或校验异或校验方法也是非常简单,而且非常通用,虽然使用该方法校验后仍存在出错的可能,但是因为异或算法非常简单,编程毫不费力,一般新手都用这种方法。

51单片机C语言应用开发实例精讲8结构实例6:单片机的串口通信

51单片机C语言应用开发实例精讲8结构实例6:单片机的串口通信

8. 结构实例6:单片机串口通信虽然那个流水灯游戏的可玩性和按键手感问题还值得再好好提升一下,但小月更希望调剂一下,转而开始了对手头烧写板上关于RS-232转换部分的学习。

小月的做法并不难以理解,毕竟与RS-232转换的相关电路在原理图中还是相当显眼的,甚至于他手头编程器的别名就是RS-232转换器。

图8.1 单片机中负责RS-232通讯的电路在烧写器一端与电脑连接的两个接头中,9针的RS-232接口就是串口通信线,而另一个USB口仅接通了+5V和GND,只有给烧写器供电的作用。

这样就可以知道,电脑可以通过RS-232对单片机的内部程序进行改写。

那么,这就意味着单片机与电脑间必然可以进行数据的交换,这种交换,就叫做通信。

所谓串口通信,就是指这种基于RS-232串口的通信方式。

RS-232(ANSI/EIA-232标准)是IBM-PC及其兼容机上的串行连接标准。

最早是为使电脑通过电话线系统相互通信的调制解调器上而是设计的。

后来发展到连接鼠标或打印机上,目前已经被支持设备的即插即用和热插拔功能的USB所替代,但仍广泛的用于工业仪器仪表中,同时也是单片机最基础和最常见的通信方式。

不过要把“最基础和最常见”这两个最拆开来说,就要在后面加上“之一”了。

虽然目前的通信技术日新月异,但这种说法在今后很长一段时期内都是成立的,也正因为这样的特点,STC的51系列单片机都是默认通过RS-232方式进行烧写的。

作为两台设备之间进行的通信,必然需要共同遵守某种规定或规则,包括交流什么、怎样交流及何时交流。

这个规则就是通信协议。

RS-232通信中通信协议的原则就是串口按位(bit)发送和接收数据。

线路上,RS-232通信使用3根线完成,分别是地线、发送、接收。

端口能够在一根线上发送数据的同时在另一根线上接收数据,即全双工传输。

全双工传输是传输制式的一种分类方式中的一类,除此还有单工传输和半双工传输。

单工传输,是指消息只能单方向传输的工作方式。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

单片机串口通信奇偶校验
在串口通信中,每个数据位都需要通过传输线路进行传输,传输过程中可能会出现噪声、电磁干扰等干扰因素,从而导致传输的数据出错。

为了避免这种情况的发生,通常采用奇偶校验的方式来保证数据的正确性。

奇偶校验是一种简单的校验方法,通过在传输的数据位中添加一位校验位来保证数据的正确性。

校验位的取值可以是“奇校验”或“偶校验”,具体来说,当数据位中“1”的个数为奇数时,奇校验位的取值为“0”;当数据位中“1”的个数为偶数时,奇校验位的取值为“1”;同理,偶校验位的取值则正好相反。

在单片机中实现奇偶校验非常简单,只需要在发送数据的函数中添加校验位的计算和发送即可。

例如,在使用UART发送数据时,可以在发送函数中添加如下代码:
```c
unsigned char parity = 0; // 奇偶校验位
for (i = 0; i < data_len; i++) {
if (data[i] == '1') {
parity++;
}
}
if (parity % 2 == 1) {
// 奇校验
UART_SendData('0');
} else {
// 偶校验
UART_SendData('1');
}
```
在接收数据时,需要再次进行奇偶校验来验证数据的正确性。

例如,在使用UART接收数据时,可以在接收函数中添加如下代码:
```c
unsigned char parity = 0; // 奇偶校验位
for (i = 0; i < data_len; i++) {
if (data[i] == '1') {
parity++;
}
}
if (parity % 2 != parity_bit) {
// 校验失败,数据出错
} else {
// 校验通过,数据正确
}
```
值得注意的是,奇偶校验并不能保证数据的百分之百正确,只能
在一定程度上提高数据传输的正确率。

因此,在实际应用中,还需要采用其他更加可靠的校验方法来保证数据的正确性。

相关文档
最新文档