总线学习4--UART

news2024/9/20 14:35:00

想来串口通信是我第一次接触嵌入式就知道的,一直调试也是用串口线,但是里面的原理还真不清楚。这次难得把环境弄出来了,就顺便学学。

一 环境搭建

还是老规矩,废话不多说,干就完事。

这次用的树莓派zero小板,一个USB转串口。接线真的很简单,RX->TX,TX->RX,再接个地(我的实验里面地不接也行)。电脑上串口终端软件用的是mobaXterm。代码还是老朋友micropython。

二 协议分析

这次实验的目标是做一个串口echo程序。最开始是直接用GPT的代码上来怼,本来以为很简单,一个小时结束战斗。但是真跑起来根本没法用。回显的全是乱码。没办法,又拿出祖传的逻辑分析仪看看。

先还是抓几个PC出来的波形吧。波特率设置的9600。很多协议,只要看了波形,真的很好懂。

传输数字1

因为波特率是9600,那么每个信号的时间就是1/9600秒,大概就是104us。所以可以看出,这里的波形是0 1000 1100。第一个下拉0是起始位。所以数据是1000 1100。

但是1的ascii码是49,换成二进制是110001这里好像是没对啊。看了很久眼睛都看痛了,终于发现110001如果补全就是0011 0001,刚好和上面的1000 1100是反的。查了一下这个原来叫LSB first。取数据的时候倒着取就行了。

传输数字2

有了1的经验,下面就简单很多,这个波形是0 0100 1100。2的ascii是50,刚好是110010,补全之后是0011 0010,刚好也是直接反过来就行。

总结

总结一下UART协议

基本就是两根线(不算地线),甚至你都可以理解成一根线,只是方向相反而已。也没有时钟那些乱七八糟的,时隙直接sleep就欧了。数据一次一个byte,高就是1,低就是0。真的很简单。。在嵌入式里面,不知道有没有比它更简单的协议。。。

上图的校验位据说基本上不会用的。。。

三 代码实现

解决了LSB first问题,后面没有太多难点。虽然说协议真的不难,但是编程的时候还是遇到一些坑。

1 需要微秒级的定时器。

GPT给的代码是:

baudrate = 1200
bit_time = 1 / baudrate

utime.sleep(bit_time)

事实上这样用根本就不准,取出来的值每次都不同。改成下面才算解决问题。

bit_time = 832
utime.sleep_us(bit_time)

2 Python的性能确实不大行

最开始设置的波特率是9600,已经算很低了,每个时隙是差不多100微妙。但是micropython软件处理这个时间好像也够呛,最后索性改成最小的波特率1200,每个时隙接近1毫秒,才算把问题解决。

3 调试

在以往上层纯软环境中,调试环境往往相对简单。直接用print或者cout都不用考虑太多。但是在底层编程中,print就会有影响了,因为print本上也是一个io操作。稍微不注意,就把程序的时间逻辑给破坏了。

    for i in range(8):
        if rx_pin.value():
            print("1")
            byte |= (1 << i)
        else:
            print("0")

最开始我是想这样看收到的数据,但是这个打印只要一加上,程序立马就混乱了。。。最后只有等一个byte抓完,再整体打印,这样就暂时没问题了。

做的好还是应该像Android那样,log是一个独立的系统,这样影响最小。

好了,解决完上面的问题,也就比较顺利了。

最后的结果:

最后的代码

import machine
import utime

# 定义 UART 参数
bit_time = 832

# 定义 GPIO 引脚
tx_pin = machine.Pin(0, machine.Pin.OUT)
rx_pin = machine.Pin(1, machine.Pin.IN)

# 初始化 TX 引脚为高电平(空闲状态)
tx_pin.value(1)

def uart_send_byte(byte):
    # 发送起始位(低电平)
    tx_pin.value(0)
    utime.sleep_us(bit_time)
    
    # 发送数据位(LSB first)
    for i in range(8):
        tx_pin.value((byte >> i) & 1)
        utime.sleep_us(bit_time)
    
    # 发送停止位(高电平)
    tx_pin.value(1)
    utime.sleep_us(bit_time)

def uart_receive_byte():
    # 等待起始位(低电平)
    while rx_pin.value() == 1:
        utime.sleep_us(2)
    
    # 等待半个位时间,进入数据位的中间
    utime.sleep_us(832 + 416)
    
    # 接收数据位
    byte = 0
    for i in range(8):
        if rx_pin.value():
            byte |= (1 << i)
        utime.sleep_us(bit_time)
    
    # 等待停止位
    #utime.sleep_us(bit_time)
    
    return byte

# UART Echo 功能实现
while True:
    byte = uart_receive_byte()
    print("Received:", chr(byte))  # 打印接收到的数据
    uart_send_byte(byte)           # 回显接收到的数据

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1983222.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

云计算实训19——上线一个静态的前端系统(续)

上线一个静态的前端系统(续) 准备工作 在eleme服务器上&#xff1a; 启动服务 启动rpcbind [rooteleme-static ~]# systemctl restart rpcbind 启动nfs [rooteleme-static ~]# systemctl restart nfs 在static-server主机上&#xff1a; 1.重启服务 启动smb [rootstatic…

重塑汽车制造未来:3D插图技术大师,零误差高效驱动新时代

在当今快速革新的汽车制造领域&#xff0c;高效、精准的产品设计与制造流程已成为众多车企破浪前行的核心引擎。但随着市场竞争的日益激烈&#xff0c;在产品设计与制造中&#xff0c;传统二维CAD设计的局限性越发明显——设计周期长、沟通成本高、错误频发及资源利用低效等问题…

AI算力租赁是什么,哪些行业会有需求?

一、AI算力租赁的定义与概述 AI算力租赁是指基于人工智能&#xff08;AI&#xff09;应用需求&#xff0c;将所需的计算能力&#xff08;即算力&#xff09;通过租赁服务的方式提供给企业和个人用户。这种服务允许用户根据需要租用人工智能计算资源&#xff0c;如图形处理单元…

[网鼎杯2018]Unfinish解题,五分钟带你解题

目录 前期准备 ​编辑 扫描目录 寻找注入点 构建payload&#xff1a; 开始注入&#xff1a; 寻找过滤规则 绕过过滤 构建python脚本 提交flag 总结 前期准备 这道题是2018年网鼎杯的一道题&#xff0c;是比较经典的一道sql二次注入的题&#xff0c;我们一起来看一下 …

B1.3 程序状态寄存器PSTATE的介绍

快速链接: . 👉👉👉 ARMv8/ARMv9架构入门到精通-[目录] 👈👈👈 付费专栏-付费课程 【购买须知】个人博客笔记导读目录(全部) B1.3 进程状态,PSTATE* 程序状态寄存器或PSTATE,是程序状态信息的抽象。所有指令集都提供操作 PSTATE 元素的指令。 以下 PSTATE 信…

第二十一天内容

上午 4、mysql基础命令 5、mysql操作命令 ------------------------------------------------------------------------------------------------------------------------------- 下午 1、脚本安装mysql 2、mysql命令回顾 3、mysql用户权限设置 4、命令练习 6、权限角色 7、…

按xls标签替换docx及xls内容

WPSoffice环境下&#xff0c;需要批量替换doc文档及xls表格某些内容&#xff0c;在windows下&#xff0c;可以用VBA宏实现&#xff0c;先建一个标签表格&#xff0c;然后按标签批量替换。但在Linux下&#xff0c;WPS表格宏不能跨文档操作WPS文字&#xff0c;于是想用python实现…

工程架构简析

文内项目 Github&#xff1a;XIAOJUSURVEY 架构 架构的设计最终是为了场景可以快速扩展&#xff0c;基于工程底座&#xff0c;使用者能够专注于业务领域的深入。 B端&#xff1a;面向问卷管理者&#xff0c;专注于问卷管理、问卷投放和数据分析三大核心能力的建设。&#xff0…

vue3实现商品图片放大镜效果(芋道源码yudao-cloud 二开笔记)

今天开发一个防某商城的商品图片放大镜&#xff0c;鼠标移动到图片位置时&#xff0c;右侧出现一个已放大的图片效果。 示例如下&#xff1a; 下图的图片的放大效果和小图的切换封装成了组件PicShow.vue&#xff0c;可根据需求自行修改&#xff0c;如下&#xff1a; 第一步&…

鸿蒙应用服务开发【钱包服务(ArkTS)】

介绍 基于Stage模型&#xff0c;提供钱包交通卡和Pass卡的开卡、预览卡、查询卡信息、更新卡片信息、删除卡片、初始化钱包环境等功能。 效果预览 具体实现 交通卡 在hms.core.payment.walletTransitCard中定义了钱包交通卡接口API&#xff0c;示例接口如下&#xff1a; /*…

【漏洞复现】用友NC Cloud系统queryPsnInfo接口SQL注入

文章目录 0x00 漏洞描述影响范围 0x01 测绘工具0x02 漏洞复现0x03 Nuclei检测脚本0x04 修复建议0x05 免责声明 0x00 漏洞描述 用友NC Cloud存是一款大型企业数字化平台。 在受影响的版本中&#xff0c;攻击者可以通过未授权访问 /ncchr/pm/obj/queryPsnInfo 接口&#xff0c;利…

综合安防管理平台LntonCVS视频监控汇聚平台视频数据智能化与资源共享方案

随着全球城市化进程的加快&#xff0c;智慧城市概念日益受到重视。在这一趋势下&#xff0c;LntonCVS视频汇聚平台作为新型智慧城市的重要智能基础设施之一&#xff0c;扮演着关键角色。该平台整合、接入和管理城市中各类视频资源&#xff0c;涵盖公共安全视频、交通监控、城市…

【五大海内外高校支持】2024年数字经济与计算机科学国际学术会议(DECS2024)

大会官网&#xff1a;www.icdecs.net 大会时间&#xff1a;2024年9月20-22日 大会地点&#xff1a;中国-厦门 截稿日期&#xff1a;详情见官网 支持单位 马来西亚理工大学 北京科技大学经济管理学院 南京信息工程大学 马来西亚敦胡先翁大学 大会嘉宾 大会主席 罗航…

opencascade AIS_ViewController源码学习 视图控制、包含鼠标事件等

opencascade AIS_ViewController 前言 用于在GUI和渲染线程之间处理视图器事件的辅助结构。 该类实现了以下功能&#xff1a; 缓存存储用户输入状态&#xff08;鼠标、触摸和键盘&#xff09;。 将鼠标/多点触控输入映射到视图相机操作&#xff08;平移、旋转、缩放&#xff0…

Mybatis(Day 18)

数据持久化是将内存中的数据模型转换为存储模型&#xff0c;以及将存储模型转换为内存中数据模型的统称。MyBatis 支持定制化 SQL、存储过程以及高级映射&#xff0c;可以在实体类和 SQL 语句之间建立映射关系&#xff0c;是一种半自动化的 ORM 实现。ORM&#xff08;Object Re…

系统运维——PXE自动安装系统

摘要 PXE&#xff08;Preboot Execution Environment&#xff0c;预启动执行环境&#xff09;是一种允许计算机通过网络启动操作系统而无需本地存储设备的技术。本文详细介绍了 PXE 的定义、架构、原理、应用场景及常见命令体系。以 RedHat7 为例&#xff0c;展示如何配置和使…

Tooltip 文字提示

在偶然维护前端开发时&#xff0c;遇到页面列表中某个字段内容太长&#xff0c;且该字段使用了组件显示&#xff0c;导致不能使用纯文本得那个省略号代替显示得css样式效果&#xff0c;如下 所以只能另辟溪路了&#xff0c; 1、最开始想到是使用横向滚动得效果来实现&#xff…

【Vue3】Pinia存储及读取数据

【Vue3】Pinia存储及读取数据 背景简介开发环境开发步骤及源码 背景 随着年龄的增长&#xff0c;很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来&#xff0c;技术出身的人总是很难放下一些执念&#xff0c;遂将这些知识整理成文&#xff0c;以纪念曾经努力学习奋斗的日…

如何用OceanBase与DataWorks,打造一站式的数据集成、开发和数据服务

导语&#xff1a;在OceanBase 2024年开发者大会的技术生态论坛上&#xff0c;阿里云DataWorks团队的高级技术专家罗海伟&#xff0c;详细阐述了一站式大数据开发治理平台DataWorks的能力&#xff0c;并对于如何基于OceanBase和Dataworks构建一站式数据集成、开发以及数据服务进…

解锁模数学习新境界:电路仿真软件,你的数字与模拟世界桥梁大师!

在这个科技日新月异的时代&#xff0c;模数转换&#xff08;A/D与D/A&#xff09;不仅是电子工程师的必修课&#xff0c;也是众多科技爱好者探索数字与模拟世界奥秘的钥匙。而今&#xff0c;一款强大的电路仿真软件&#xff0c;正悄然成为连接这两大领域的魔法棒&#xff0c;让…