用micropython 操作stm32f4单片机实现串口通讯

from buzzer import Buzzer
import pyb
import machine  # 导入 machine 模块以访问硬件功能
import time  # 导入 time 模块以使用与时间相关的函数
from TOFSense import TOFSense_F #导入TOFSense_F板块
import binascii #二进制到 ASCII 的转换(编码)和 ASCII 到二进制的转换

def read_data():        
        data = bytearray()  # 使用字节数组  
          
        try:  
            uart_channel.read()  # 读取数据  
            time.sleep(0.1)  # 等待一段时间  
            data += uart_channel.read(16)  # 将读取的数据添加到字节数组中  
    #         data = data.rstrip(b'\0')  # 删除可能的尾随空字节  
        except Exception as e:  
            print(f"Error occurred: {e}")  
            return None  # 或其他适当的错误处理  
          
        try:  
            data_hex = binascii.hexlify(data).decode()  # 将字节数组转换为十六进制字符串  
            return data_hex  
        except Exception as e:  
            print(f"Error converting data to hex: {e}")  
        return None  # 或其他适当的错误处理
    
if __name__ == "__main__":
    # 初始化Buzzer对象 串口2 RX->PD6   TX->PD5
    buzzer = Buzzer('PE11', 1, 2)  # 假设PE11引脚支持PWM,使用定时器1和通道2
    uart_channel = pyb.UART(2, baudrate=921600)  # 修改为TOFSense所连接的串口
    # 等待串口初始化完成  
    time.sleep(1)
    
    
    tof_f = TOFSense_F() # 确保TOFSense_F类在MicroPython环境中可用或已导入
    time.sleep(0.5)
    

    # 示例调用:蜂鸣器以60%占空比,100ms开启,100ms关闭的模式重复发声20次
    buzzer.beep(60, 100, 100, 3)  # 注意这里添加了闭合的括号)
    while True:
        dataB=read_data()
        if tof_f.unpack_data(dataB):
              print(" dis: {:.3f}".format(tof_f.dis/10,)) 以下两个文件

class TOFSense_F:    
    def __init__(self):    
        self.id = 0    
        self.system_time = 0    
        self.zone_map = 0  # 如果你的设备有此属性的话    
        self.dis = 0    
        self.dis_status = 0    
        self.signal_strength = 0    
        self.range_precision = 0    
    
    def validate_checksum(self, data, expected_checksum):
 
        num = len(data) // 2

        checksum = sum(int(data[i : i + 2], 16) for i in range(0, num * 2, 2))
#         tempT = [data[i : i + 2] for i in range(0, num * 2, 2)] 
#         print(tempT)
        calculated_checksum = hex(checksum)[-2:]
#         calculated_checksum = checksum & 0xFF  # 取低8位作为校验和
       
        return calculated_checksum == expected_checksum    
        
#     def unpack_data(self, str_data):
#         
#         if not self.validate_checksum(str_data[:-2], str_data[-2:]):  
#             return False  
#         temp = [str_data[i : i + 2] for i in range(0, len(str_data), 2)]  
#         self.id = int(temp[3], 16)  # 传感器ID  
#         self.system_time = int(temp[7] + temp[6] + temp[5] + temp[4], 16)  # 传感器上电时间  
#         self.dis = (int(temp[10] + temp[9] + temp[8], 16)) / 1000  # 测距距离 单位m  
#         self.dis_status = int(temp[11], 16)  # 距离状态指示  
#         self.signal_strength = int(temp[13] + temp[12], 16)  # 信号强度  
#         self.range_precision = int(temp[14], 16)  # 重复测距精度  
#         return True
    def unpack_data(self, str_data):  
        if str_data is None or len(str_data) < 14:  # 添加对str_data长度的检查  
            return False  
          
        if not self.validate_checksum(str_data[:-2], str_data[-2:]):    
            return False  
          
        temp = [str_data[i : i + 2] for i in range(0, len(str_data), 2)]    
          
        # 确保temp有足够的元素来进行索引操作  
        if len(temp) < 14:  
            return False  # 或其他适当的处理方式  
          
        self.id = int(temp[3], 16)  # 传感器ID    
        self.system_time = int(temp[7] + temp[6] + temp[5] + temp[4], 16)  # 传感器上电时间
        
       # self.dis = (int(temp[10] + temp[9] + temp[8], 16)) / 1000  # 测距距离 单位m
        # 注意:这里我们假设每个元素都是有效的十六进制数字符串
        self.dis = (int(temp[10], 16) << 16) | (int(temp[9], 16) << 8) | int(temp[8], 16)
        
        
        self.dis_status = int(temp[11], 16)  # 距离状态指示    
        self.signal_strength = int(temp[13] + temp[12], 16)  # 信号强度    
        self.range_precision = int(temp[14], 16)  # 重复测距精度    
        return True另外一个文件

# buzzer.py -- put your Buzzer class code here!
import pyb
import time

class Buzzer:
    def __init__(self, pin_name, timer_num, channel_num, freq=2000):
        # 初始化引脚和定时器通道作为PWM输出
        self.pin = pyb.Pin(pin_name, pyb.Pin.OUT)
        self.timer = pyb.Timer(timer_num, freq=freq)
        self.pwm_channel = self.timer.channel(channel_num, pyb.Timer.PWM, pin=self.pin)

    def beep(self, duty_percent, on_time_ms, off_time_ms, repeat):
        # 控制蜂鸣器发声的函数
        # duty_percent 是占空比的百分比,范围从0到100
        for _ in range(repeat):
            # 开启蜂鸣器
            self.pwm_channel.pulse_width_percent(duty_percent)
            time.sleep_ms(on_time_ms)
            
            # 关闭蜂鸣器(通过设置占空比为0)
            self.pwm_channel.pulse_width_percent(0)
            time.sleep_ms(off_time_ms)
 

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

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

相关文章

postman中获取随机数、唯一ID、时间日期(包括当前日期增减)截取指定位数的字符等

在Postman中&#xff0c;您可以使用内置的动态变量和编写脚本的方式来获取随机数、唯一ID、时间日期以及截取指定位数的字符。以下是具体的操作方法&#xff1a; 一、postman中获取随机数、唯一ID、时间日期&#xff08;包括当前日期增减&#xff09;截取指定位数的字符等 获取…

《智能体雏形开发(高阶实操)》开发计划概述

智能体雏形开发计划 通过本计划,逐步完成一个可以真实运行的智能体雏形。 最终完成一个**“用户日志文件生成日报,日报再进一步汇总成周报”**的任务驱动型智能体雏形 第一阶段:基础准备与环境搭建 1. 学习基础知识 了解智能体的概念、类型和技术框架。学习大模型(如阿里…

【VUE3】npm : 无法加载文件 D:\Program\nodejs\node_global\npm.ps1,因为在此系统上禁止运行脚本。

npm : 无法加载文件 D:\Program\nodejs\npm.ps1。未对文件 D:\Program\nodejs\npm.ps1 进行数字签名。无法在当前系统上运行该脚本。有关运行脚本和设置执行策略的详细信息&#xff0c;请参阅 https:/go.microsoft.com/fwlink/?LinkID135170 中的 about_ Execution_Policies。…

级联树结构TreeSelect和上级反查

接口返回结构 前端展示格式 前端组件 <template><div ><el-scrollbar height"70vh"><el-tree :data"deptOptions" :props"{ label: label, children: children }" :expand-on-click-node"false":filter-node-me…

Ansible自动化一键部署单节点集群架构

自动化部署利器&#xff1a;Ansible 一键部署脚本 在现代IT基础设施管理中&#xff0c;Ansible以其简洁、强大的自动化能力脱颖而出。以下是精心打造的Ansible自动化一键部署脚本&#xff0c;旨在简化部署流程&#xff0c;提升效率&#xff0c;确保一致性和可靠性。 通过这个…

基于智能语音交互的智能呼叫中心工作机制

在智能化和信息化不断进步的现代&#xff0c;智能呼叫中心为客户提供高质量、高效率的服务体验&#xff0c;提升众多品牌用户的满意度和忠诚度。作为实现智能呼叫中心的关键技术之一的智能语音交互技术&#xff0c;它通过集成自然语言处理&#xff08;NLP&#xff09;、语音识别…

CLIP模型也能处理点云信息

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

【开源免费】基于Vue和SpringBoot的服装生产管理系统(附论文)

博主说明&#xff1a;本文项目编号 T 066 &#xff0c;文末自助获取源码 \color{red}{T066&#xff0c;文末自助获取源码} T066&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析…

R语言机器学习论文(六):总结

文章目录 介绍参考文献介绍 本文采用R语言对来自进行数据描述、数据预处理、特征筛选和模型构建。 最后我们获得了一个能有效区分乳腺组织的随机森林预测模型,它的性能非常好,这意味着它可能拥有非常好的临床价值。 在本文中,我们利用R语言对来自美国加州大学欧文分校的B…

CSP/信奥赛C++语法基础刷题训练(36):洛谷P11229:[CSP-J 2024] 小木棍

CSP/信奥赛C语法基础刷题训练&#xff08;36&#xff09;&#xff1a;洛谷P11229&#xff1a;[CSP-J 2024] 小木棍 题目描述 小 S 喜欢收集小木棍。在收集了 n n n 根长度相等的小木棍之后&#xff0c;他闲来无事&#xff0c;便用它们拼起了数字。用小木棍拼每种数字的方法如…

Kibana server is not ready yet

遇到“Kibana server is not ready yet”错误通常表示Kibana无法连接到Elasticsearch。以下是一些常见原因及其解决方案&#xff1a; 1.常见原因 1.1.Elasticsearch未运行&#xff1a; 确保Elasticsearch服务已启动并正常运行。您可以通过访问 http://localhost:9200 来检查…

中间件之Elasticsearch

一、简介 Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎&#xff0c;基于RESTful web接口。Elasticsearch是用Java开发的&#xff0c;并作为Apache许可条款下的开放源码发布&#xff0c;是当前流行的企业级搜索引擎。Elasticsearch…

常见排序算法总结 (三) - 归并排序与归并分治

归并排序 算法思想 将数组元素不断地拆分&#xff0c;直到每一组中只包含一个元素&#xff0c;单个元素天然有序。之后用归并的方式收集跨组的元素&#xff0c;最终形成整个区间上有序的序列。 稳定性分析 归并排序是稳定的&#xff0c;拆分数组时会自然地将元素分成有先后…

http(请求方法,状态码,Cookie与)

目录 1.http中常见的Header(KV结构) 2.http请求方法 2.1 请求方法 2.2 telnet 2.3 网页根目录 2.3.1 概念 2.3.2 构建一个首页 2.4 GET与POST方法 2.4.1 提交参数 2.4.2 GET与POST提交参数对比 2.4.3 GET和POST对比 3.状态码 3.1 状态码分类 3.2 3XXX状态码 3.2 …

365天深度学习训练营-第P6周:VGG-16算法-Pytorch实现人脸识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 文为「365天深度学习训练营」内部文章 参考本文所写记录性文章&#xff0c;请在文章开头带上「&#x1f449;声明」 &#x1f37a;要求&#xff1a; 保存训练过…

Laravel 代理收益排行榜

创建了一个收入表 CREATE TABLE income_logs (id int(11) unsigned NOT NULL AUTO_INCREMENT,order_id int(11) NOT NULL COMMENT 订单ID,type int(11) NOT NULL DEFAULT 0 COMMENT 类型 0 支出 1收入,user_id int(11) NOT NULL COMMENT 消费者用户,price decimal(10,2) NOT…

【Linux】设计文件系统(C实现)

要求&#xff1a; (1)可以实现下列几条命令 dir 列文件目录 create 创建文件 delete 删除文件 read 读文件 write 写文件 (2)列目录时要列出文件名、存取权限&#xff08;八进制&#xff09;、文件长度、时间&#xff08;创建时间&#xff0c;修改时间以及…

开源用户体验调查管理平台Formbricks

什么是 Formbricks &#xff1f; Formbricks 是一个开源的调查和体验管理平台&#xff0c;旨在帮助用户在应用内、网站、链接和电子邮件中收集用户和客户的反馈。它为开发者提供了一个隐私优先的替代方案&#xff0c;支持自托管或使用 Formbricks 云服务&#xff0c;并提供了丰…

0.Git初步概念

1.Git应用场景 场景一&#xff1a;资料备份 场景二&#xff1a;代码还原(回滚) 场景三&#xff1a;协同开发 场景四&#xff1a;追溯问题代码的开发人和开发时间 解决方式&#xff1a;版本控制 2.版本控制方式 a、集中式版本控制工具 用户将代码集中存储到中央服务器&#x…

040集——CAD中放烟花(CAD—C#二次开发入门)

效果如下&#xff1a; 单一颜色的烟花&#xff1a; 渐变色的火花&#xff1a; namespace AcTools {public class HH{public static TransientManager tm TransientManager.CurrentTransientManager;public static Random rand new Random();public static Vector3D G new V…