串口怎样配置才能无论奇偶校验都能正常接收_(七)串口(串行)通信

(七)串口(串行)通信

一、简介

如果将单片机比作一个人的话,每个单片机都是一个个体,大多数人是无法一个人在这个社会上生存的,通常都需要和领导、家人、朋友、甚至陌生人进行交流,而在交流的时候,交流的双方必须采用相同的语言才能进行正常交流,一个说英语,一个说汉语那沟通就费劲了,当然了这也是可以沟通的,毕竟还有翻译(电平转换,协议转换)。串行口就是单片机行业中非常流行的一种通信协议(语言),也是比较基础的一种通信协议,基本上弄明白了串口,其他如IIC、SPI(也都属于串行的范畴,只不过实现方式稍微有点不同)就很简单了。

二、通信原理

我在前面就说过了,单片机无非是输入输出,无论是点亮LED还是串口,使用的都是普通IO口,也就是高低电平的转换,达到通信的目的。串口通信也不过是更有规律的、符合某项规定的电平转换方式而已。

首先不考虑串口的协议规定,我们先做一些约定:
  1. 我们有两个单片机A和B,如下图

  2. A作为发送数据方、B作为接收方,P0.0---->P1.0

  3. A、B的晶振频率可以不同

  4. A发送的速度和B接收的速度相同,比如,A每秒发送1bit数据,B每秒接收1bit数据,这个很关键

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用C51实现串行通信时,可以通过添加奇偶校验来提高通信的可靠性。奇偶校验是通过在每个数据字节中添加一个校验位来实现的,这个校验位表示这个数据字节中1的个数是奇数还是偶数。 以下是一个简单的C51程序,用于实现带奇偶校验串行通信: ``` #include <reg51.h> #define BUFFER_SIZE 10 // 缓冲区大小 #define EVEN_PARITY 0 // 偶校验 #define ODD_PARITY 1 // 奇校验 unsigned char buffer[BUFFER_SIZE]; // 缓冲区 unsigned char rx_count = 0; // 接收计数器 /* 串口接收中断处理函数 */ void UART_ISR () interrupt 4 { unsigned char c; if (RI) { // 接收到数据 RI = 0; c = SBUF; /* 检查奇偶校验,如果校验错误则丢弃这个数据 */ if (check_parity(c)) { buffer[rx_count++] = c; if (rx_count >= BUFFER_SIZE) { rx_count = 0; } } } } /* 发送一个字节 */ void UART_send_byte (unsigned char b) { ES = 0; // 关闭串口接收中断 /* 计算奇偶校验位 */ b = (b & 0x7f) ^ ((b & 0x3f) >> 1) ^ ((b & 0x1f) >> 2) ^ ((b & 0x0f) >> 3) ^ ((b & 0x07) >> 4) ^ ((b & 0x03) >> 5) ^ ((b & 0x01) >> 6); /* 添加奇偶校验位 */ if (parity == EVEN_PARITY) { b &= 0xfe; // 把奇偶校验位设为偶数 } else { b |= 0x01; // 把奇偶校验位设为奇数 } /* 发送数据 */ SBUF = b; while (!TI); // 等待发送完成 TI = 0; ES = 1; // 打开串口接收中断 } /* 检查奇偶校验 */ unsigned char check_parity (unsigned char b) { unsigned char parity = b & 0x80; // 保存奇偶校验位 b &= 0x7f; // 去掉奇偶校验位 /* 计算奇偶校验 */ b = b ^ (b >> 4); b = b ^ (b >> 2); b = b ^ (b >> 1); /* 检查奇偶校验是否正确 */ if ((b & 0x01) == parity) { return 1; // 校验正确 } else { return 0; // 校验错误 } } /* 主函数 */ void main () { unsigned char i; /* 初始化串口 */ TMOD = 0x20; // 设定计数器1工作模式2(自动重装载) TH1 = 0xfd; // 设定计数器1的重载值,用于产生波特率为9600的波特率发生器 TL1 = TH1; TR1 = 1; // 启动计数器1 SM0 = 0; // 设置串口工作方式为8位数据位,无校验位,1位停止位 SM1 = 1; EA = 1; // 打开总中断 ES = 1; // 打开串口接收中断 while (1) { /* 发送数据 */ for (i = 0; i < BUFFER_SIZE; i++) { UART_send_byte(buffer[i]); } } } ``` 在这个程序中,我们首先定义了一个缓冲区来保存接收到的数据。接着定义了一个中断处理函数,用于处理串口接收中断。在这个中断处理函数中,我们首先检查接收到的数据的奇偶校验位是否正确,如果正确,就把这个数据存放到缓冲区中。在发送数据时,我们先计算出每个数据字节的奇偶校验位,并添加到数据字节中。然后再把数据发送出去。 需要注意的是,在本程序中我们采用的是计算奇偶校验位的一种简单方法,实际上在工业控制系统中通常采用更复杂的方法来计算奇偶校验位。因此,如果你在实际应用中使用本程序,请仔细检查奇偶校验的实现方法是否符合你的要求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值