N 3 串口
一、串口
UART:Unervisal Async Recveiver Transimitter,通用异步收发器。(全双工,串行)
RXD:接收信号线
TXD:发送信号线
CH340:电平转换芯片
单工:通信时,数据接收方和发送方是固定的,通过一根信号线实现数据收发数据传输的方
向是单一的(只能由发送方发给接收方)。
半双工:通信时,数据接收方和发送方不是固定的(双方都可以发送或接收数据)通过一根
信号线实现数据收发,数据传输的方向可以是双向的(同一时刻,数据传输的方向
是单一的)。
I2C:SLC(时钟线) SDA(数据线)
全双工:通信时,数据接收方和发送方不是固定的(双方都可以发送或接收数据)通过两根
信号线实现数据收发,数据传输的方向是双向的。
UART、SPI(MOSI MISO CS片选线)
串口发送数据:遵循LSB低位先行原则,先发送数据低位,再发送高位MSB
串行:通过一根信号线将要发送的数据逐个bit逐个bit的进行发送
1.传输速度慢;2.成本低,实现简单;3.传输距离远(RS485 差分,抗干扰性好)
并行:通过多根信号线同时去传输多个bit
1.传输速度快;2.成本高,实现复杂;
3.传输距离近(30米以内,存在信号偏移、电磁波干扰)
奇校验:奇校验值为1,若数据位中1的个数加上奇校验中的"1,保持1的总个数为奇数个,则
代表奇校验通过。
偶校验:偶校验值为0',若数据位中1'的个数加上偶校验中的"0,保持1的总个数为偶数个,
则代表偶校验通过。
奇偶校验无法判断偶数个bit出错的问题。
串口通信参数:
波特率(bits per second),每秒传输bie数量 。(2400,4800,9600,115200)
8:8位数据位 N:None无校验 O:odd奇校验 E:Even偶校验
1:1位停止位
同步:有时钟线,通信双方可以通过时钟线来实现通信频率同步。
异步:没有时钟线,通信双方无法通过时钟线实现同步。
串口是一种异步通信协议,但可以通过波特率实现类似同步。
TTL: 高电平:5V 低电平:0V
RS232: 负逻辑 高电平:-3 V - -15V 低电平:3V - 15V
RS485: 差分 高电平: 2V - 6V 低电平: -2V - -6V
二、串口寄存器
串口寄存器:发送接收缓冲器 SBUF
2400bps TL1=232 TH1=232
定时器初值的计算公式:2"-2smod * focs / 32 / bps / 12
#include <reg51.h> #include "uart.h" xdata char recv_buffer[32]; unsigned int pos = 0; // 串口接收中断服务函数 void uart_handler(void) interrupt 4 { if ((SCON & (1 << 0)) == 1) { if (pos < 32) { recv_buffer[pos++] = SBUF; recv_buffer[pos] = 0; } } SCON &= ~(1 << 0); } // 串口初始化 void uart_init(void) { // 1. 配置串口工作模式:SM0 0 SM1 1 8位UART模式 SCON &= ~(3 << 6); SCON |= (1 << 6); // SM1 SCON &= ~(1 << 7); // SM0 // 2. 允许串口接收数据 SCON |= (1 << 4); // 3. PCON 波特率加倍 PCON &= ~(3 << 6); PCON &= ~(1 << 6); PCON |= (1 << 7); // 4. 配置定时器1工作模式:8位自动重装载 TMOD &= ~(0x0F << 4); TMOD |= (1 << 5); // 5. 设置定时器1初值:2400bps TL1 = 232; TH1 = 232; // 6. 允许定时器1开始计数 TCON |= (1 << 6); // 7. 允许CPU响应所有中断 IE |= (1 << 7); // 8. 允许串口产生中断 IE |= (1 << 4); } // 发送单个字符 void uart_sendchar(char ch) { SBUF = ch; // 判断是否发送完8位数据 while ((SCON & (1 << 1)) == 0); SCON &= ~(1 << 1); } // 发送字符串 void uart_sendstr(const char *p) { while (*p) { uart_sendchar(*p++); } } // 发送指定长度数据 void uart_sendbuff(const char *p, int len) { while (len--) { uart_sendchar(*p++); } }三、Modbus协议
Modbus协议 主机->从机:
起始位 地址码 功能码 数据位1 数据位2 校验码 结束位
0xAA 0x01 0x01 0x42 0x00 0xEE 0xBB
01:控制led
02:控制数码管
03:控制蜂鸣器
04:温度采集
数据流向位:主机->从机(0);从机->主机(1)
