会讲故事的I2C通信时序

前言:

        相信各位在学习STM32时候的I2C通信肯定特别苦恼吧,这是什么通信时序,为什么起始终止发送SCL和SDA要那样,即使是深刻学习理解了一遍,时间长了之后也容易忘记,因为记的都是概念性的东西,枯燥无味的概念文字确实长时间后就容易忘记,那有没有什么方法可以让自己记牢一点呢?

        有,在我重新回顾去看了一遍江科大的I2C后,不经意间我想起来之前看过的一部电影《饥饿站台》,我就想到了用一个故事来理解记住I2C的各个时序图。

        感兴趣的话,不妨听听呗,说不定对你有收获。

故事背景:

先上I2C的各个时序图概念,稍稍回忆一下:(师出江科大)

这里硬件电路稍微讲一下,因为和我的故事背景有关系。

        这里我们的I2C是一主多从模式,即一个主机,其他都是从机通信,所以我们这里的SCL就由主机来单独控制,假设我们去掉左图中的两个上拉电阻,来看看SCL和SDA。

SCL:因为是一主多从模式,所以主机SCL配置推挽输出输出高低电平,从机SCL配置浮空输入或者上拉输入都可以;

SDA:因为主机和从机都可以控制SDA线,假如当主机和从机同时输出时,主机输出高电平,从机输出低电平,这时候SDA就发生短路了,这是不能发生的。所以,I2C就规定所有的主机从机的SCL都配置成开漏输出模式,并且SCL和SDA外接一个上拉电阻,就像右图的硬件电路一样。

所以当SCL和SDA都空闲时,因为有一个弱上拉电阻拉着输出高电平,就好像SCL和SDA是一根杆子,弱上拉电阻是一根弹簧拉着SCL和SDA杆子,因为是主从机是开漏输出,输出高电平时引脚浮空,输出低电平时为强下拉,所以会把SCL和SDA杆子往下拉。
        所以,联想一下饥饿站台的监狱模式,我们的故事背景就出来了,假设我们的主机是一个监狱长,监狱长在监狱最上层,从机是一个个犯人在监狱下面的每一层。 

监狱长和犯人(也就是主机和从机)会通过可升降平台(SCL)和平台上的信息(SDA)互相交流。

I2C时序图故事讲解:

起始条件:

        这里我们假设站台下面的那根绳子是起始和终止信号的(SDA)表示。

当平台(SCL)空闲时,平台因为弹簧(上拉电阻)的原因会升在高处,这时,如果有犯人(从机)要和主机通信,犯人就可以拉一下绳子(SDA),绳子由上往下拉,即SDA由高到低电平,这时候监狱长收到了犯人的信息,就知道要开始I2C通信了。

终止条件:

当互相收发完信息后,平台(SCL)会上升回去,如果不行通信了,犯人拉着SDA的绳子就放开,绳子由下往上收缩,即低电平到高电平,监狱长(主机)就知道犯人(从机)不想通信了,就终止I2C通信。

发送一个字节:


每次平台SCL将下来,即低电平,监狱长就会跟着平台下来,并且把平台上的东西(SDA数据)发给需要I2C通信的犯人,因为高层的会先到,所以是高位先发,在发送完之后,平台(SCL)上升,犯人开始接收自己发到的东西(SDA数据),发送一位是如此,发送一个字节即八次来回。

接收一个字节:

当有犯人(从机)要给监狱长(主机)发送信息时,平台(SCL)就会降下来(低电平),犯人(从机)把要给监狱长的信息放到SDA上,因为是高层先到,所以是高位先行,接着平台上升(高电平),监狱长(主机)读取SDA数据,因为SCL上升上去了,犯人无法放信息数据,所以SDA就不会有数据变化,接受一位如此,接收八位字节重复八次即可。

发送应答:

当监狱长在接收犯人的八次数据后,会在SCL平台上放上自己对SDA数据的反应,比如0就是批准(应答),1就是收到但是不批准(非应答),然后犯人判断监狱长的反应应答是怎么样的。

接收应答:

当监狱长(主机)在发送完八次数据(即一个字节)之后,需要判断犯人是否收到自己的信息,就会在下一个SCL上拿信息数据SDA,来判断是否有犯人收到自己的信息,0就是表示有犯人收到自己的数据了,1就是没有,因为需要接收犯人的信息,所以一开始就不能在SDA上放数据。

结语:

第一次编故事,编的不好,如有错误,请大家见谅!

<think>好的,我现在需要解决用户遇到的FileNotFoundError问题。首先,用户提供的错误信息显示在运行Ultralytics YOLOv8时,程序找不到指定的图片路径`/home/zard/Pictures/2.jpeg`。我应该从哪些方面入手呢? 首先,确认文件路径是否正确。用户提到的路径是`/home/zard/Pictures/2.jpeg`,但可能用户的实际路径与此不同。可能存在拼写错误或大小写问题,比如`.jpeg`和`.jpg`的区别。需要建议用户检查路径的每个部分是否正确,包括目录名和文件名。 其次,检查文件是否存在。用户可能误将文件放在其他目录下,或者文件名不同。建议用户使用`ls`命令或文件管理器直接查看该路径是否存在该文件。如果不存在,需要重新放置文件或更正路径。 然后,考虑权限问题。即使用户路径正确,但文件或上级目录的权限可能不允许程序读取。需要检查文件权限,使用`ls -l`查看,并确保用户有读取权限。如果没有,需要修改权限或更改文件位置。 另外,注意相对路径和绝对路径的使用。用户可能在代码中使用了相对路径,而当前工作目录与预期不符,导致路径解析错误。建议用户使用绝对路径,或者在代码中打印当前工作目录,确认相对路径的基准是否正确。 还要检查代码中的路径处理是否正确。例如,路径中的空格或特殊字符是否被正确转义,字符串拼接是否无误。可能用户代码中存在拼接错误,导致最终路径不正确。 环境问题也可能导致路径错误。用户可能在conda环境中运行,但环境变量或路径设置有问题。需要确认环境是否激活正确,以及路径是否在环境中可访问。 如果用户是从其他脚本或配置文件中获取路径,需要检查这些外部输入的准确性。比如,如果路径来自命令行参数或配置文件,用户可能输入了错误的路径,或者参数传递有误。 最后,建议用户添加异常处理,比如使用try-except块捕获FileNotFoundError,并打印更详细的错误信息,帮助定位问题。同时,可以在代码中先检查文件是否存在,再进行处理,避免程序崩溃。 总结一下,解决步骤应该是:验证路径存在性和正确性→检查权限→确认路径处理方式→检查环境配置→添加错误处理。需要逐步排除可能性,帮助用户找到具体原因。</think>### **Ultralytics YOLOv8 FileNotFoundError 深度解决方案** --- #### **一、错误根源定位** 错误信息`FileNotFoundError: /home/zard/Pictures/2.jpeg does not exist`直接表明**文件路径解析失败**,具体可分为以下维度: $$ \text{故障原因} = \begin{cases} \text{物理路径不存在} & (\exists x \in \text{路径节点}, x \notin \text{真实文件系统}) \\ \text{路径权限限制} & (\text{执行用户} \ngeq \text{文件读权限}) \\ \text{路径格式错误} & (\text{相对路径/绝对路径转换异常}) \end{cases} $$ --- #### **二、关键诊断步骤** 1. **路径存在性验证** 在终端执行精确路径检查: ```bash ls -l /home/zard/Pictures/2.jpeg # 注意区分大小写和扩展名 # 预期输出: # -rw-r--r-- 1 user group 1048576 Jun 15 10:00 /home/zard/Pictures/2.jpeg ``` - 若输出`No such file`:说明文件确实不存在 - 若输出`Permission denied`:权限问题 2. **扩展名敏感度测试** JPEG文件常见扩展名变体: ```bash file /home/zard/Pictures/2.* # 检查.jpeg/.jpg/.JPG等变体 ``` 3. **路径符号解析** 检查软链接导致的路径误导: ```bash readlink -f /home/zard/Pictures # 解析真实物理路径 ``` --- #### **三、优先级修复方案** **场景1:文件确实不存在** ```python # 修改预测代码中的源路径(示例) from ultralytics import YOLO model = YOLO('yolov8n.pt') results = model.predict( source='/correct/path/to/image.jpg', # ← 修正此处路径 save=True ) ``` **场景2:权限问题** ```bash # 修改文件权限(危险操作前建议备份) sudo chmod +r /home/zard/Pictures/2.jpeg # 添加读权限 sudo chown $USER:$USER /home/zard/Pictures/2.jpeg # 修改属主 ``` **场景3:路径格式错误** ```python # 使用Python的os.path进行路径规范化 import os input_path = "~/Pictures/2.jpeg" # 原始路径 abs_path = os.path.expanduser(input_path) # 解析波浪号→ /home/zard/Pictures/2.jpeg if not os.path.exists(abs_path): print(f"警报:路径{abs_path}不存在!") ``` --- #### **四、高级调试技巧** 4. **环境路径追踪** 在Python代码中插入调试语句: ```python import os print("当前工作目录:", os.getcwd()) # 检查工作目录是否预期 print("路径是否存在:", os.path.exists('/home/zard/Pictures/2.jpeg')) ``` 5. **Ultralytics源码级调试** 定位到`loaders.py`第342行: ```python # 修改ultralytics/data/loaders.py 添加调试信息 print(f"正在尝试加载: {p}") # ← 插入此行 if not p.exists(): raise FileNotFoundError(f"{p} does not exist") ``` 6. **文件系统监控(Linux)** 使用`inotifywait`追踪文件访问事件: ```bash sudo apt install inotify-tools inotifywait -m /home/zard/Pictures # 监控目录访问事件 ``` --- #### **五、预防性编程策略** 7. **防御性路径检查** 在调用predict前添加验证: ```python from pathlib import Path def validate_path(input_path): path = Path(input_path).expanduser().resolve() if not path.exists(): raise ValueError(f"路径{path}不存在") return str(path) model.predict(source=validate_path('~/Pictures/2.jpeg')) ``` 8. **异常捕获与提示优化** 增强错误信息的可读性: ```python try: results = model.predict(source=source_path) except FileNotFoundError as e: print(f""" 路径错误诊断报告: - 原始路径:{source_path} - 解析后绝对路径:{Path(source_path).resolve()} - 文件存在性:{'存在' if Path(source_path).exists() else '不存在'} - 建议操作:检查大小写、扩展名、软链接 """) raise ``` --- #### **六、典型错误对照表** | 现象 | 解决方案 | 验证命令 | |------|----------|----------| | 文件名大小写错误 | 统一使用小写命名 | `ls -l | grep -i 2.jpeg` | | 隐藏字符问题 | 重命名文件 | `cat -v 2.jpeg` | | NTFS/FAT32分区挂载问题 | 检查挂载点 | `mount \| grep Pictures` | | 文件系统损坏 | 运行fsck检查 | `sudo fsck /dev/sdXX` | --- #### **七、跨平台兼容处理** 9. **Windows路径转换** 处理反斜杠和盘符: ```python import platform def format_path(path): if platform.system() == 'Windows': return path.replace('/', '\\').replace('C:', 'C:\\') return path ``` 10. **Docker环境路径映射** 确保卷挂载正确: ```bash docker run -v /host/path:/container/path ultralytics/yolov8 ``` --- **最终验证流程:** 1. 在终端直接访问目标路径 2. 确保Python解释器有足够权限 3. 检查路径字符串中的特殊字符 4. 在代码入口处添加路径预验证 若问题仍未解决,请提供: 1. `ls -l /home/zard/Pictures` 完整输出 2. Python代码中source参数的赋值方式 3. 操作系统类型及文件系统格式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值