c语言模拟uart协议的收发

article/2025/9/17 5:54:18

这篇文章注重思想的讲解,理解下来肯定对uart协议有一个更深的认识。

uart协议,通常用在嵌入式设备之间的通信。像下面这样:

问题一:uart是全双工还是半双工?

你完全可以将两个设备想象成两个人,上图中的两条线想象成A和B的对话。A对B说话和B对A说话的一个场景。问大家一个问题,你对A说话的同时能不能听到A跟你说话?当然可以嘛。所以你在说话的同时还能接收到别人说的话,我们可以推出uart协议当然也是全双工协议,因为设备A在发送消息的同时还能接收设备B的消息。大家也可以简单记一下,如果某个通信协议使用两根线来作为数据线,那这个协议多半就是全双工协议。

问题二:波特率是个啥东西?

        这样说吧,人说话的正常频率是500~3000Hz(百度来的),你可以将波特率比做这个频率。

当你以正常说话频率跟A(是个正常人)说话的时候A能听到吗?当然能。

那如果一只蝙蝠跟A(是个正常人)说话A听得到吗?当然不能。

我又问,如果设备A以一个正常波特率跟设备B通信设备B能听到吗?如果设备B设置的波特率跟设备A设置的波特率几乎相等还是可以听到的,注意这两个波特率大小可以有差值。但是差值大了设备B肯定会听错设备A发送过来的信息,就好比一个人跟你说话,他用的说话频率比常人高,但是你还是可以将就听到,但是有很大可能你会听错。所以我们可以得出,设备A和设备B设置的波特率大小应该相等,当然,如果大小相差非常小一般也没问题,比如在某些情况下相差1到小几十也是问题不大的。好了,说回波特率,波特率为每一秒传输多少个bit。如果波特率为9600,那就是1s传输9600bit的数据,我们可以求出1/9600就为传输一个bit数据需要花费的时间,也就是104us左右。这个数据下面编程要使用

问题三:uart是同步还是异步通信:

我直接说是异步通信吧,原因很简单,设备A和设备B在通信的时候他们之间没有时钟线,所以他们没有公共的时钟,没有公共的时钟线,他们就只能使用不同的时钟源了,所以他们是异步通信。

所以记住:一般来说一个通信协议如果有一根是时钟线,那么他们多半是同步通信。

废话少说编程了:

先来看时序:注意这里每一个数据的发送周期都是104us,对应波特率9600

 这是我画的一个最常用的时序图,其实还有校验位我没有画出来,因为一般平时不会用到。

上面的时序就为一包数据,也可以理解成是设备A对设备B通信的最小单位,一共有10位也就是10个bit。

直接上代码了:

1.发送数据到其他设备:

void uart_send_a_pack(uint8_t data){
    uint8_t i = 0;
    //开始
    set_high();//拉高uart_tx数据线,根据自己板子的引脚图来找到uart_tx数据线所对应的管脚
    delay_us(104);//        1/9066约等于104us
    set_low(); //拉低uart_tx,因为时序图写了拉低就开始传输
    delay_us(104);
    for(i = 0; i < 8; i++){
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, (0x01 & (data >> i)));
        delay_us(104);
    }
    //拉高停止
    set_high();
    delay_us(104);//一包数据发送结束
}

大家注意上面代码中每次对数据线的操作周期都是104us。

2.接收其他设备的数据:

下面代码中read()其实就是返回uart_rx数据线的电平状态

uint8_t uart_read_a_pack(){
    while(read()){}//如果检测到起始位(0)就跳出循环。没有检测到起始位就一直循环
    uint8_t i = 0;
    uint8_t data = 0;
    //开始采集数据
    for(i = 0; i < 8; i++){
        delay_us(104);
        data += (read() << i);  
    }
    delay_us(104);

    //读停止位
    if(read()){
        return data; //如果读到停止位那就返回data
    }else{
        return 0;//如果没有读到停止位就返回0,这里处理得不够好,大家可以自行提升一下
    }
}

上面我们已经实现了可以发送一个字节给其他设备

这下我们可以直接用自己的函数来做重定向:

int fputc(int ch, FILE* f){
    uart_send_a_pack(ch);
    return ch;
}

之后我们可以愉快的用printf函数通过uart发送消息到其他设备了。

当然你也可以选择可以封装发送字符串的函数,比如这样:

void uart_send_string(uint8_t* stringData){
    for(uint32_t i = 0; i < strlen((char*)stringData); i++){
        uart_send_a_pack(stringData[i]);
    }
}

封装自己的接收uart消息的函数,如下:
void uart_read_string(uint8_t* data, uint8_t len){
    for(uint8_t i = 0; i < len; i++){
        data[i] = uart_read_a_pack();
    }
}


http://chatgpt.dhexx.cn/article/JnMYjS9V.shtml

相关文章

UART协议详解

通用异步收发传输器&#xff08;Universal Asynchronous Receiver/Transmitter)&#xff0c;通常称作UART。 定义&#xff1a;UART是一种通用串行数据总线&#xff0c;用于异步通信。该总线双向通信&#xff0c;可以实现全双工传输和接收。在嵌入式设计中&#xff0c;UART用于主…

Linux·UART协议

目录 一、什么是UART&#xff1f; 二、UART的帧格式 2.1 为什么UART的传输需要起始位&#xff1f; 2.2 UART基本的数据形式 2.3 为什么UART的数据位可变&#xff1f; 三、UART的波特率 3.1 什么是波特率 3.2 如何换算波特率 3.3 波特率和采样频率是一样的吗&#xff1f…

通信协议(一)——UART协议

1、知识点 基础部分参考&#xff1a;UART串口发送模块设计Verilog_发光中请勿扰的博客-CSDN博客_uart设计verilog &#xff08;1&#xff09;什么是串口&#xff08;UART&#xff09;&#xff1f; 串口作为常用的三大低速总线&#xff08;UART、SPI、IIC&#xff09;之一&#…

uart协议学习,从了解到入门,看这篇文章

uart协议从了解到入门 背景知识介绍&#xff1a;1、并行和串行的意思&#xff1a;2、串转并和并转串传输&#xff1a;3、单工、半双工、全双工区别&#xff1a; uart协议介绍1、uart简介2、uart通信3、uart工作原理 uart的优缺点 背景知识介绍&#xff1a; 1、并行和串行的意思…

FPGA实现uart协议

简介 使用verilog实现uart协议&#xff0c;能够和pc进行通信&#xff0c;实现串口回环功能&#xff0c;各参数设置如下&#xff1a; 波特率&#xff1a;115200数据位&#xff1a;8停止位&#xff1a;任意校验位&#xff1a;无 系统时钟为50M&#xff0c;115200波特率下&…

协议篇之UART协议

协议篇之UART协议 一、写在前面二、UART协议简介三、UART协议数据帧结构3.1 UART发送过程3.2 UART接收过程3.3 UART传输速率 四、UART收发模块设计4.1 UART接收模块设计4.2 UART发送模块设计4.3 UART回环顶层模块4.4 UART回环上板验证 五、写在最后 一、写在前面 由于设计需要&…

UART通信协议

UART通信协议 UART ( universal asynchronous receiver-transmitter&#xff09;是一种采用异步串行通信方式的通用异步收发传输器;它在发送数据时将并行数据转换成串行数据来传输&#xff0c;在接收数据时将接收到的串行数据转换成并行数据。UART串口通信需要两根信号线来实现…

UART协议讲解

UART协议讲解 一、什么是UART协议二、通信方式的分类1、串行通信&#xff08;一&#xff09;、同步通信和异步通信&#xff08;二&#xff09;、单工和半双工以及全双工 2、并行通信 三、UART协议具体介绍1、UART数据传输的格式2、UART电平标准 三、UART的优缺点四、参考 一、什…

【数字IC】深入浅出理解UART协议

深入浅出理解UART协议 一、什么是UART&#xff1f;二、UART的帧格式2.1 为什么UART的传输需要起始位&#xff1f;2.2 UART基本的数据形式2.3 为什么UART的数据位可变&#xff1f; 三、UART的波特率3.1 什么是波特率3.2 如何换算波特率3.3 波特率和采样频率是一样的吗&#xff1…

最详细的 UART协议 分析在这里!

1. 协议基础 1.1. 协议简介 UART是“Universal Asynchronous Receiver/Transmitter”&#xff0c;通用异步收发器的缩写。在19世纪60年代&#xff0c;为了解决计算机和电传打字机通信&#xff0c;Bell发明了UART协议&#xff0c;将并行输入信号转换成串行输出信号。因为U…

UART协议

UART协议 简介 UART是通用异步收发传输器&#xff08;Universal Asynchronous Receiver/Transmitter)&#xff0c;通常称作UART&#xff0c;是一种异步收发传输器,是设备间进行异步通信的关键模块。UART负责处理数据总线和串行口之间的串/并、并/串转换&#xff0c;并规定了帧…

【云域网络社区】云域网络社区APP

【软件名称】云域社区 【功能介绍】资源分享&#xff0c;游戏交流交友 【下载地址】http://sss.shmmec.com/apk.apk 图片

怎么划分领域、子域、核心域、通用域和支撑域

怎么划分领域、子域、核心域、通用域和支撑域 如何理解领域和子域&#xff1f;什么是领域什么是子域怎么划分领域和子域如何理解核心域、通用域和支撑域&#xff1f;为什么要划分核心域、通用域和支撑域 总结 DDD 的知识体系提出了很多的名词&#xff0c;像&#xff1a;领域、子…

网络安全-域服务器(二)

域服务器&#xff1a; 域服务器&#xff08;一&#xff09;&#xff1a;网络安全-域&#xff08;一&#xff09;_IT之一小佬的博客-CSDN博客域服务器&#xff08;二&#xff09;&#xff1a;网络安全-域服务器&#xff08;二&#xff09;_IT之一小佬的博客-CSDN博客 域 11.O…

网课管理系统

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a; 3. 功能简介 用户中心 1.1用户注册&#xff1a;用户需要注册才能登陆进入web 1.2用户登录&#xff1a;通过判断匹配来进…

如何搭建域服务器

实验名称&#xff1a;如何搭建域服务器 实验环境&#xff1a;wind2003*2 实验过程&#xff1a; 由于Windows Server 2003在默认的安装过程中DNS是不被安装的&#xff0c;所以我们需要手动去添加&#xff0c; 添加方法如下:“开始—设置—控制面板—添加删除程序”&#xff…

搭建域环境(win)

目录 常见域环境是用&#xff1a;win2012 win7 win2003 本blog环境&#xff1a;Windows Server 2012 R2 and Win2008 1.Window Server 2012 R2 服务器配置 1&#xff09;变更计算机名DC&#xff08;用于存储活动目录数据库的计算机&#xff09; 2&#xff09;设置服务器…

网络教学管理系统

1、项目介绍 网络教学管理系统拥有三种角色 管理员&#xff1a;专业管理、班级管理、学生教师管理、公告管理、留言板管理、学习资料管理、教学视频管理、试题管理等 教师&#xff1a;系统留言、发布作业等 学生&#xff1a;可以查看作业视频、登录注册、下载作业资料等 2、…

域控-笔记二(域权限,域组,域管理,Kerberso 协议)

文章目录 一. 域环境搭建1.1 添加AD功能1.2 安装1.3 部署 二. 如何加入域2.1 加入域2.2 域中主机登录2.3 退出域2.4 添加域用户 三. 域权限3.1 A-G-DL-P策略3.2 组几个比较重要的域本地组几个比较重要的全局组、通用组的权限 四. 域管理4.1 域用户账户的管理4.2 组的管理4.3 组…

中职网络搭建 域用户密码设置

中职网络搭建 密码设置 域密码策略&#xff1a; 进入域控制器组策略&#xff08;组策略管理&#xff09; 计算机配置–Windows设置–安全设置–账户策略–密码策略 “密码必须符合复杂性要求”&#xff1a;密码设置必须要有数字、大写字母、小写字母、字符&#xff0c;四种中…