自学嵌入式 day 42 串口通信

一、UART:通用的异步收发器,串行(全双工、串口、异步通信)

二、通信方式:

1、单工:事先确定发送方和接收方,两个主机之间通过一根数据线进行传输,数据在传输时方向具有单一性

2、半双工:两个主机之间通过一根数据线传输,通信的主机可作为发射方也可以作为接收方,数据的传输方向是双向的,(同一时刻数据的传输方向单向)

3、全双工:两根数据线进行传输,传输方向是双向的

三、主机和从机的区别

1、主机:拥有绝对的控制权,主机想何时发起通信就可以通信,给从机下发指令

2、从机:无法发起通信,完成主机下发的指令,并将结果上交给主机

四、UART数据传输的顺序

串口通信中,遵行LSB(低位)传输

五、串行与并行

1、串行:通信传输数据时,通过一根线实现,需要按照一个bit的次序先后传输(资源消耗小,传输速度慢)

2、并行:多个bit再多根数据线进行传输(资源消耗大,传输速度快)

六、串口通信时序

起始位+数据位(8bit)+校验位+停止位

注:奇校验:总1的个数保持在奇数个

偶校验:总1的个数保持在偶数个

七、波特率

每秒传输的bit数量

八、同步和异步

串口通信通过波特率实现同步

12C通过时钟线实现同步

TTL、RS232、RS5485电器属性:

1)TTL:TTL电平 ->高电平:5v 低电平:0v

2)RS232:负逻辑 高电平:-3 -15v 低电平:3-15v

3)RS485:差分信号 高电平:7-12v 低电平:-1 -15v

九、UART相关寄存器配置

1、SCON:串口控制寄存器

1)将SCON寄存器中的bit6和bit7清零

2)将SCON寄存器bit6置一,代表串口工作在方式一

3)将SCON寄存器bit4置一,允许串口接收数据

4)T1,R1需要配置

2、PCON:电源控制寄存器

1)将PCON中bit6清零,代表通过SCON中的bit7和bit6指定串口工作模式

2)将PCON中bit7置一,代表波特率翻倍

3、TCON、TMOD:定时器模式选择、定时器控制寄存器

1)将TMOD高4位清零

2)将TMOD中的bit5置一,代表在8位自动重装模式

3)为定时器赋初值,(TL,TH)公式:2^8 - 2^mod*focs/32/bps/12

4)将TCON中的bit6置一,代表计数器开始计数

#include "uart.h"

#include"delay.h"

#include"led.h"

#include"digiter.h"

#include"timer.h"

#include<stdio.h>

#include <string.h>

#include<string.h>

int parse(void)

{

int i = 0;

unsigned char sum = 0;

int ret = 0;

if((unsigned char)recv_buffer0 == 0xaa && (unsigned char)recv_buffer6 == 0xbb)

{

if((unsigned char)recv_buffer1 == 0x01)

{

for(i;i < 5;i++)

{

sum += (unsigned char)recv_bufferi;

}

if(sum == (unsigned char)recv_buffer5)

{

ret = recv_buffer2;

}

}

}

return ret;

}

//xdata char tmp32 = {0};

void do_handler(unsigned int n)

{

unsigned int num = 0;

switch(n)

{

case 1:

led_init();

led_show(recv_buffer4);

break;

case 2:

digiter_show(recv_buffer4);

break;

case 3:

Timer0_Init();

break;

default:

break;

}

}

void callback(void)

{

xdata char send_buffer32 = {0};

int i = 0;

unsigned char sum = 0;

memcpy(send_buffer,recv_buffer,7);

send_buffer2 |= (1 << 7);

if((unsigned char)recv_buffer0 == 0xaa && (unsigned char)recv_buffer6 == 0xbb)

{

if((unsigned char)recv_buffer1 == 0x01)

{

for(i;i < 5;i++)

{

sum += send_bufferi;

}

send_buffer5 = sum;

}

}

uart_sendbuffer(send_buffer,7);

}

int main()

{

int ret = 0;

xdata char buf32 = {0};

uart_init();

while(1)

{

// digiter_show(1);

if(pos != 0)

{

delay(0xafff);

ret = parse();

do_handler(ret);

if(ret != 0)

{

callback();

}

pos = 0;

}

}

return 0;

}

相关推荐
SHENGWEI胜为3 小时前
交换机端口显示正常,终端却获取不到 IP 地址?从 DHCP 流程定位故障
服务器·网络·测试工具·缓存·通信工程
IMPYLH5 小时前
Linux 系统备份与镜像
linux·服务器·网络
淘气包海鸟6 小时前
水声网络框架
网络·ns3·水
国科安芯7 小时前
星间激光通信终端CANFD控制网络的时延确定性与辐射可靠性
网络·嵌入式硬件·信息与通信·canfd·低轨卫星·商业航天·抗辐射
中屹指纹浏览器svip7 小时前
网络抖动会标记账号异常?分清两种波动
网络
承渊政道7 小时前
Linux网络学习【传输层协议UDP】
linux·网络·网络协议·学习·ubuntu·udp
小此方8 小时前
Linux网络(三十三):告别O(n)噩梦:从select/poll的挣扎到epoll红黑树+回调的降维打击,一文打通IO多路复用
linux·网络·驱动开发
2301_777998348 小时前
Linux 网络:数据链路层
linux·服务器·网络
国科安芯8 小时前
空间锂离子电池组管理系统CANFD通信网络的辐射可靠性设计
网络·信息与通信·canfd·电池·低轨卫星·抗辐射
2401_868534788 小时前
网规物流企业网络问题
网络