该笔记记录树莓派python项目485串口调试时在GPT查询的一些问题。最终需要解决的是串口通信一直报故障:bus_write 12292 0 write error Response length is invalid 0的问题。
进行了串口设置和检查,重新配置python库,查询串口情况,预设串口频率,等方法。
以上想到的内容均已确认正常,未查到最终通信故障原因。
下一步使用minicom通信测试查询,等待后期检查结果。。。欢迎网友提供意见!
第一部分,树莓派python库路径之间的关系:
1.树莓派的python库在哪个文件路径
在树莓派上,Python库通常会被安装在以下路径中:
/usr/lib/python3/dist-packages/
或者
/usr/local/lib/python3.X/dist-packages/
其中,3.X是Python的版本号。在这些路径下,你可以找到已安装的Python库的文件和文件夹。如果你使用的是Python 2.x,那么路径可能会有所不同。你可以使用以下命令来查找Python库的路径:
python3 -c "import site; print(site.getsitepackages())"
2.在usr/lib中找到三个文件夹分别是python2.7、python3、python3.9,怎么确定使用python XX.py时使用的是哪个环境?使用pip list查看的是哪个的环境
当你使用 python XX.py
命令时,会根据系统的默认 Python 版本来执行脚本。如果你想确定使用的是哪个 Python 环境,可以使用以下方法:
-
使用
which python
命令会显示系统默认的 Python 解释器的路径。这可以帮助你确定使用的是哪个 Python 版本。 -
可以使用
python --version
或python -V
命令来查看当前默认的 Python 版本。 -
如果你想在脚本中指定使用特定的 Python 版本,可以在脚本的开头添加 shebang 行,比如
#!/usr/bin/python3
,这样执行脚本时就会使用指定的 Python 版本。
使用 pip list
命令查看的是当前默认 Python 环境下安装的包。如果你想查看其他 Python 环境下安装的包,可以先切换到该环境,然后再运行 pip list
命令。
3.使用which python查询到在/usr/bin中有个python,这个文件和usr/lib中的python文件夹有什么关系?想更改默认python要怎么操作
在Linux系统中,/usr/bin/python
文件通常是一个符号链接(symbolic link),指向系统默认的 Python 解释器。而 /usr/lib/python3.X
文件夹则包含了 Python 标准库和第三方库。
要更改系统默认的 Python 版本,可以使用以下方法之一:
-
更新符号链接:可以通过更新
/usr/bin/python
符号链接来更改系统默认的 Python 版本。首先,确定你想要将系统默认的 Python 版本更改为哪个版本,然后使用以下命令更新符号链接:sudo ln -sf /usr/bin/python3.X /usr/bin/python
其中
/usr/bin/python3.X
是你想要设置为默认的 Python 解释器的路径。 -
使用 update-alternatives:在一些 Linux 发行版中,可以使用
update-alternatives
命令来管理系统中的默认版本。你可以使用以下命令来设置默认的 Python 版本:sudo update-alternatives --config python
然后根据提示选择你想要设置为默认的 Python 版本。
无论哪种方法,更改系统默认的 Python 版本都需要以管理员权限运行。请谨慎操作,以免对系统造成不必要的影响。
4.etc/文件中也有python3、python3.9文件夹,这里的又是什么
在 /etc
目录中的 python3
和 python3.9
文件夹通常是用于存储与 Python 相关的配置文件和其他系统级别的设置。这些文件夹中可能包含 Python 解释器的配置文件、环境变量设置、软链接以及其他与 Python 版本和环境相关的文件。
/etc
目录通常用于存储系统级别的配置文件,包括各种软件和服务的配置信息。因此,/etc/python3
和 /etc/python3.9
文件夹中的内容可能涉及到系统范围内的 Python 配置和设置。
请注意,具体的目录结构和内容可能因不同的操作系统版本和发行版而有所不同。如果你对这些文件夹中的内容感兴趣,可以查看其中的文件以了解系统中 Python 相关的配置信息。
5.使用pip list查到的默认库与usr/lib中找到三个文件夹python2.7、python3、python3.9都不相符,怎么找到默认库打开的是哪里的环境
在使用 pip list
命令查看已安装的包时,你可能会看到多个 Python 环境中安装的包,这可能包括系统默认的 Python 环境、虚拟环境、或者其他自定义的 Python 环境。如果你想确定当前默认的 Python 环境是哪一个,可以尝试以下方法:
-
查看默认 Python 版本:你可以通过在命令行中输入
python --version
或者python3 --version
来查看系统默认的 Python 版本。这将告诉你当前默认的 Python 版本是什么。 -
查看默认 Python 解释器路径:你可以使用
which python
或者which python3
命令来查看系统默认的 Python 解释器的路径。这将告诉你系统默认的 Python 解释器所在的位置。 -
查看环境变量:你可以查看系统的环境变量,特别是
PATH
环境变量,来确定系统默认的 Python 环境。在命令行中输入echo $PATH
可以查看当前的PATH
环境变量设置。
一旦你确定了系统默认的 Python 环境,你就可以根据需要切换到其他环境,或者查看其他环境中安装的包。
6.(不重要的提问)
输入python3 -V后得到Python 3.9.2。使用which python查询到/usr/bin/python3.9。在/usr/lib中看到python3中只有一个dist-packages文件夹,文件夹内有很多py文件或者egg-info文件。在/usr/lib/python3.9中有很多文件夹:asyncio、collections、dist-packages和py文件。从文件结构上判断,哪一个是在用的默认库。想切换到另一个要怎么做。或者能不能将库合并,因为我要用到的包分别在这两个路径中
根据你提供的信息,你的系统中同时存在两个 Python 环境,一个是系统默认的 Python 3.9,另一个是位于 /usr/lib/python3
中的 Python 3。这两个环境中分别包含了一些库和模块。
如果你想切换到另一个 Python 环境,可以考虑使用虚拟环境。虚拟环境可以帮助你在同一台机器上同时管理多个独立的 Python 环境,以便于在不同的项目中使用不同的库和工具。
你可以使用 Python 内置的 venv
模块或者 virtualenv
包来创建和管理虚拟环境。以下是使用 venv
模块创建虚拟环境的基本步骤:
-
创建虚拟环境:
python3 -m venv /path/to/new/virtual/environment
-
激活虚拟环境:
- 在 Linux 或 macOS 中,使用以下命令激活虚拟环境:
source /path/to/new/virtual/environment/bin/activate
- 在 Windows 中,使用以下命令激活虚拟环境:
/path/to/new/virtual/environment/Scripts/activate
- 在 Linux 或 macOS 中,使用以下命令激活虚拟环境:
-
安装需要的包: 在激活的虚拟环境中使用
pip
安装需要的包:pip install package_name
这样,你就可以在不同的虚拟环境中安装和管理不同的包,而不会相互干扰。
至于合并两个 Python 环境中的库,这可能会比较复杂,因为不同的 Python 版本和环境可能依赖不同的库版本,合并可能会导致冲突和不兼容性。因此,我建议你在需要时使用虚拟环境来管理不同的库和环境。
第二部分,使用虚拟环境
1.怎么查看我安装的所有版本
你可以使用以下命令来查看你系统中安装的所有 Python 版本:
ls /usr/bin/python*
这将列出系统中所有以 python
开头的可执行文件,包括不同版本的 Python 解释器。你也可以使用以下命令来查看所有已安装的 Python 版本及其路径:
ls -l /usr/bin/python*
这将显示每个 Python 解释器的详细信息,包括路径和符号链接。
2.这个创建的虚拟环境在哪,库路径在哪。怎么删除虚拟环境。怎么将usr/lib中已经有python3库安装到虚拟环境里(最后一个问题没解决,因为与默认库冲突,最终未使用虚拟环境)
创建的虚拟环境通常位于你执行创建命令的当前工作目录下。例如,如果你在 /home/user
目录下执行创建虚拟环境的命令,那么虚拟环境将会被创建在 /home/user/myenv
目录下。
虚拟环境中的库路径通常位于虚拟环境目录下的 lib/python3.x/site-packages
目录中,其中 3.x
是你使用的 Python 版本号。在这个目录下,你可以找到虚拟环境中已安装的库。
要删除虚拟环境,只需关闭当前虚拟环境,然后删除虚拟环境目录即可。在终端中执行以下命令来关闭虚拟环境:
deactivate
然后,使用文件管理器或终端中的 rm -rf
命令来删除虚拟环境目录。
要将系统中已安装的 Python 3 库安装到虚拟环境中,你可以在激活虚拟环境后使用 pip
命令来安装这些库。例如:
pip install package_name
这将会将指定的库安装到当前激活的虚拟环境中。
第三部分,解决串口库serial使用故障(最终清除所有安装的serial库重新安装一次,解决默认库与其他库间的干扰)
1.已经确认安装了serial和 serial.tools.list_ports库在python3中,但是使用的默认库python3.9中只有单独的seria.py文件。现在运行时报以下错误,应该怎么解决from serial import serial.tools.list_ports
根据你描述的情况,你似乎遇到了一个导入库的问题。如果你已经确认安装了 serial
和 serial.tools.list_ports
库,但是在运行时仍然报错,可能是因为你的导入语句有问题。
首先,你应该使用以下导入语句来导入 list_ports
:
from serial.tools.list_ports import comports
然后,你可以使用 comports
函数来列出可用的串行端口。例如:
from serial.tools.list_ports import comports
ports = comports()
for port, desc, hwid in ports:
print(f"Port: {port}, Description: {desc}, Hardware ID: {hwid}")
补充第一部分,库默认安装的最终可能路径
为什么pip install安装库包时安装在了/home/pi/.local/lib/python3.9路径下,而不是在/usr/lib/python3.9/中。他们之间有什么关系吗。两个路径中相同名称的包会不会互相干扰,怎么去除干扰
pip install
安装库包时将其安装到 /home/pi/.local/lib/python3.9
而不是 /usr/lib/python3.9
的原因是因为它们代表不同的安装位置。这涉及到Python的包管理和环境设置。
/usr/lib/python3.9
是系统级的Python安装目录,通常包含系统级的Python包和库。这些包是系统范围内的,对所有用户都可用。/home/pi/.local/lib/python3.9
是用户级的Python安装目录,通常包含特定用户安装的Python包和库。这些包只对特定用户可用,不会影响其他用户。
这两个路径中的相同名称的包不会直接互相干扰,因为它们代表不同的环境。然而,如果你在代码中使用了不同路径中相同名称的包,可能会导致混淆和意外行为。
为了解决这种情况,你可以考虑以下方法:
-
使用虚拟环境:使用虚拟环境可以帮助你在项目之间隔离依赖关系,避免不同包之间的冲突。你可以使用
venv
或者virtualenv
创建一个独立的Python环境,并在其中安装项目所需的包。 -
检查Python路径:确保在代码中正确地设置了Python路径,以便导入正确的包。你可以通过打印
sys.path
来检查Python解释器的模块搜索路径,确保它指向你期望的位置。 -
清理不需要的包:如果你确定不需要
/usr/lib/python3.9
或/home/pi/.local/lib/python3.9
中的特定包,你可以通过pip uninstall
命令来删除它们,以避免混淆和冲突。
总之,要解决这个问题,你需要确保在正确的环境中安装和使用包,并且避免不同环境中相同名称的包导致的混淆。
第四部分,串口和系统中的文件关系
在树莓派查到的serial0 -> ttyAMA0这个是什么,和引脚有什么关系
在树莓派上,serial0
到 ttyAMA0
的映射关系是指树莓派上的串口设备。在树莓派上,有两个主要的串口设备,分别是 ttyAMA0
和 ttyS0
。
-
ttyAMA0
是树莓派上的第一个串口设备,通常对应的引脚是 GPIO 14 (TX) 和 GPIO 15 (RX)。 -
ttyS0
是树莓派上的第二个串口设备,通常对应的引脚是 GPIO 14 (TX) 和 GPIO 15 (RX)。
在树莓派3及之前的版本中,默认情况下,serial0
实际上是指向 ttyAMA0
的,而在树莓派3及之后的版本中,默认情况下,serial0
实际上是指向 ttyS0
的。
因此,serial0
到 ttyAMA0
的映射关系表示了树莓派上的默认串口设备。如果你要在树莓派上使用串口通信,通常会使用这些设备来进行通信。你可以在树莓派的GPIO引脚上找到对应的引脚来连接串口设备。
需要注意的是,如果你在使用树莓派时进行了相关的配置更改,这些映射关系可能会有所不同。因此,在使用串口设备时,最好查阅树莓派型号和操作系统版本对应的官方文档,以确保正确地使用串口设备。
第五部分,树莓派系统配置
已经打开rasp-config中串口后,其实不需要再做设置。下面第四个问题做出了回答。
1.在网上查到在boot目录下找到config.txt文件要配置:最有一行添加dtoverlay=pi3-miniuart-bt 这是配置什么。 修改/boot/cmdline.txt 添加console=serial0,115200 又是配置什么。 详细解释
在树莓派系统中,config.txt
文件和 cmdline.txt
文件是用来配置系统启动参数和硬件设置的重要文件。
-
在
config.txt
文件中添加dtoverlay=pi3-miniuart-bt
一行的配置是用来启用树莓派3的mini UART功能,并禁用蓝牙功能。这个配置的作用是将树莓派3的蓝牙模块从默认的 UART0 移动到 mini UART 上,以便释放 UART0 用于其他串口设备,比如 RS485 转 USB 模块。 -
在
cmdline.txt
文件中,console=serial0,115200
部分的配置是用来指定串口输出的参数,其中serial0
表示使用树莓派上的 UART0 串口,115200
表示波特率为 115200。这个配置告诉系统将控制台输出重定向到 UART0 串口,并且设置波特率为 115200。
综合来说,这两个配置文件的修改都是为了配置树莓派系统的串口功能,包括启用 mini UART,禁用蓝牙功能,并且指定控制台输出的串口和波特率。这些配置对于与串口设备进行通信非常重要,特别是在使用 RS485 通信时。
2.做第二项配置后出现以下故障:
port = Serial(PORT, baudrate=115200, timeout=0.2)
File "/usr/lib/python3/dist-packages/serial/serialutil.py", line 244, in __init__ self.open()
File "/usr/lib/python3/dist-packages/serial/serialposix.py", line 325, in open raise SerialException(msg.errno, "could not open port {}: {}".format(self._port, msg))
serial.serialutil.SerialException: [Errno 13] could not open port /dev/ttyAMA0: [Errno 13] Permission denied: '/dev/ttyAMA0' ,解释并给出解决步骤
(我直接修改了权限解决问题)
这个错误提示表明你的程序尝试打开 /dev/ttyAMA0
串口时遇到了权限问题。一般来说,这是因为当前用户没有足够的权限来访问串口设备。
要解决这个问题,你可以尝试以下几个步骤:
-
确保用户具有串口访问权限:将当前用户添加到
dialout
组,该组通常具有对串口设备的访问权限。你可以使用以下命令将用户添加到dialout
组:sudo usermod -a -G dialout <your_username>
请将
<your_username>
替换为你的实际用户名。添加用户到dialout
组后,你需要注销并重新登录以使更改生效。 -
确保串口设备权限正确设置:检查
/dev/ttyAMA0
的权限设置是否正确。你可以使用以下命令来检查:ls -l /dev/ttyAMA0
如果权限设置不正确,你可以使用以下命令更改它:
sudo chmod a+rw /dev/ttyAMA0
请注意,更改设备权限可能需要管理员权限。
-
确保串口设备没有被其他程序占用:有时候其他程序或服务可能会占用串口设备,导致你的程序无法打开它。你可以通过关闭其他可能占用串口的程序或服务来尝试解决这个问题。
3.使用sudo chmod a+rw /dev/ttyAMA0设置权限后错误消失,但是为什么重启后权限被还原了。怎么解决
当你使用 sudo chmod a+rw /dev/ttyAMA0
命令更改 /dev/ttyAMA0
的权限时,这种更改是暂时的,重启后权限会被还原。这是因为在 Linux 系统中,/dev
目录下的设备文件的权限和属性通常是由 udev
管理的,udev
是一个设备管理守护进程,负责设备的热插拔、设备文件的创建和管理等任务。
为了永久修改设备文件的权限,你可以通过创建一个 udev
规则来实现。下面是一个示例:
-
创建一个新的
udev
规则文件,比如99-serial-ports.rules
:sudo nano /etc/udev/rules.d/99-serial-ports.rules
-
在打开的文件中添加以下内容:
SUBSYSTEM=="tty", ATTRS{devpath}=="1.3", GROUP="dialout", MODE="0666"
这个规则的含义是,当系统检测到一个
tty
子系统的设备,且devpath
为1.3
时(这个路径可能需要根据你的具体情况进行调整),将设备的所属组设置为dialout
,权限设置为0666
。 -
保存并关闭文件,然后重新加载
udev
规则:sudo udevadm control --reload-rules
-
重启系统或者拔出再插入串口设备,让
udev
规则生效。
完成上述步骤后,udev
规则将会永久地修改 /dev/ttyAMA0
的权限设置,使得你的程序可以在重启后继续访问串口设备。
4.为什么boot/cmdline.txt添加 console=serial0,115200 前没有这个权限问题,现在还原boot/cmdline.txt也能解决权限问题吗
在 Raspberry Pi 上,添加 console=serial0,115200
到 boot/cmdline.txt
文件中会将串口设备 serial0
用作控制台输出。这可能会对串口设备的权限产生影响,因为操作系统可能会将串口设备用作控制台而不允许其他程序访问它。
如果在添加 console=serial0,115200
之前没有串口权限问题,那么还原 boot/cmdline.txt
文件可能会解决权限问题。你可以尝试将 boot/cmdline.txt
文件还原为之前的状态,然后重新启动系统,看看是否解决了串口权限问题。
另外,如果你不需要将串口设备用作控制台输出,你可以尝试在 boot/cmdline.txt
文件中删除 console=serial0,115200
,这样系统将不再将串口设备用作控制台,从而可能解决串口权限问题。
请记住,在进行任何更改之前,最好先备份 boot/cmdline.txt
文件,以防止出现意外情况。
5.树莓派的485通信频率是自适应与通信代码注册时设定的吗,不需要在boot/cmdline.txt设置串口设备用作控制台?或者不在boot/cmdline.txt设置时需要在其他位置设置?
树莓派上的 RS485 通信频率通常是由通信代码或者通信库中的参数来设定的,而不是在 boot/cmdline.txt
文件中设置。RS485 通信需要设置波特率、数据位、停止位等参数,这些通常是在代码中直接设置的。
关于串口设备用作控制台,如果你不需要将串口设备用作系统控制台,那么你可以不在 boot/cmdline.txt
中设置串口设备用作控制台。如果你的程序需要独占访问串口设备,那么确保没有其他程序将串口设备用作控制台是很重要的。
在你的代码中,你需要明确地指定要使用的串口设备,并设置相应的通信参数。通常情况下,这些设置是在代码中进行,而不是在系统的启动文件中进行。
总的来说,RS485 通信频率是由通信代码中的参数设定的,而串口设备用作控制台的设置通常是在系统启动文件中进行的。如果你的程序需要独占访问串口设备,确保没有其他程序将串口设备用作控制台是很重要的。
希望这些信息对你有所帮助。如果你有其他问题或需要更多解释,请随时告诉我。