当前位置: 首页 > news >正文

自学嵌入式 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_buffer[0] == 0xaa && (unsigned char)recv_buffer[6] == 0xbb)

{

if((unsigned char)recv_buffer[1] == 0x01)

{

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

{

sum += (unsigned char)recv_buffer[i];

}

if(sum == (unsigned char)recv_buffer[5])

{

ret = recv_buffer[2];

}

}

}

return ret;

}

//xdata char tmp[32] = {0};

void do_handler(unsigned int n)

{

unsigned int num = 0;

switch(n)

{

case 1:

led_init();

led_show(recv_buffer[4]);

break;

case 2:

digiter_show(recv_buffer[4]);

break;

case 3:

Timer0_Init();

break;

default:

break;

}

}

void callback(void)

{

xdata char send_buffer[32] = {0};

int i = 0;

unsigned char sum = 0;

memcpy(send_buffer,recv_buffer,7);

send_buffer[2] |= (1 << 7);

if((unsigned char)recv_buffer[0] == 0xaa && (unsigned char)recv_buffer[6] == 0xbb)

{

if((unsigned char)recv_buffer[1] == 0x01)

{

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

{

sum += send_buffer[i];

}

send_buffer[5] = sum;

}

}

uart_sendbuffer(send_buffer,7);

}

int main()

{

int ret = 0;

xdata char buf[32] = {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;

}

http://www.dtcms.com/a/315243.html

相关文章:

  • 力扣热题100——双指针
  • 应⽤层协议HTTP
  • 个推1.0版本
  • 自动化测试工具Katalon之BDD
  • 鸿蒙开发-端云一体化--云数据库
  • Qt 自动无法加载数据库为空
  • 知识管理中的人工智能:概述、主要功能和管理工具
  • 专访 Giants Protocol 创始人:新加坡主权基金正式押注进军 RWA
  • 深入理解 mmap:原理、用法与实战全解析
  • Linux 进程间通信底层原理(1):匿名与命令管道
  • LLM Prompt与开源模型资源(4)提示词工程进阶指南
  • Node.js高并发接口下的事件循环卡顿问题与异步解耦优化方案
  • 抛出自定义异常
  • 普及冲奖——贪心补题报告
  • MySQL详解
  • Docker 和Docker-compose常用命令
  • STM32标准库的工程创建
  • 推荐广告搜索三种业务的区别
  • 非机动车乱停放识别准确率↑37%:陌讯多特征融合算法实战解析
  • 04-Chapter02-Example01
  • 【cooragent多智能体】各个单智能体的输入与输出(实际案例)
  • Jmeter进阶(笔记)
  • 进程间通信:管道与共享内存
  • 亚马逊广告进阶:如何选择提曝光还是控曝光
  • 【C++】石头剪刀布游戏
  • Makefile文件写法模板
  • 刷题记录0804
  • app-1
  • 1行JS实现无限滚动加载(Intersection Observer版)
  • vcpkg在vs/vscode下用法