树莓派串口(UART)编程Python示例

本文详细介绍树莓派串口(UART)配置与使用方法,包括端口设置、minicom安装与使用、pyserial库安装及串口回显程序编写。适合初学者快速上手。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

树莓派串口(UART)编程Python示例

20170123103950947-0

前言

本文将详细介绍树莓派的串口(UART)配置和使用,并结合一个modbus RTU从机的例子说明树莓派串口的应用。
在开始前说明以下几点
1.树莓派UART端口的位置
TXD位于HEAD-8
RXD位于HEAD-10
GND位于HEAD-6(可选其他GND)
2.树莓派的TXD应接USB转串口设备的RXD,当然如果测试失败请交换RXD和TXD的顺序
3.经过很多次的测试(N>25),当波特率为115200时打开树莓派的UART时,树莓派会莫名其妙的发送一字节0xF8,该问题始终无法解决。不过波特率为9600时并没有此问题,猜测是树莓派硬件或内核驱动问题。
4.树莓派的串口默认为SSH调试使用,若要使用串口需要修改两处文件。
5.2016.11起新系统需要通过这个方法开启SSH服务

修改两处文件

1./boot/cmdline.txt
输入以下指令

1

sudo nano /boot/cmdline.txt

删除以下部分

1

console=ttyAMA0,115200 kgdboc=ttyAMA0,115200

最终变为

1

dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait

2./etc/inittab
输入以下指令

1

sudo nano /etc/inittab

注释最后一行内容

1

#T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100

使用minicom

配置完之后便可测试一下树莓派的UART是否正常工作,而minicom便是一个简单好用的工具。minicom是linux平台串口调试工具,相当于windows上的串口调试助手。
1.minicom安装

1

sudo apt-get install minicom

2.minicom启动

1

2

minicom -b 9600 -o -D /dev/ttyAMA0

#-b代表波特率,-D代表端口,/dev/ttyAMA0 类似于windows中的COM1,-o功能暂时未知。

20170131223351560-0

3.minicom发送内容
直接在控制台中输入内容即可,如果minicom打开了回显可在控制台中观察到输出内容,如果回显关闭则控制台中没人任何反应,千万不要以为minicom没有正常工作。
4.minicom回显控制
先Ctrl+A,再E。可翻转回显状态(原来回显打开则此事回显关闭)
5.minicom回显关闭
先Ctrl+A,再Q。

使用pyserial

minicom仅满足调试用途,如果需要编程解决问题那么python的serial扩展库——pyserial则是一个不错的选择。pyserial模块非常好用,后面的文章还会分析如何使用pyserial控制GPRS模块。
1.pyserial安装
安装pyserial扩展库有很多种方法,可使用pip或者easy_install安装,也可以直接选择apt-get工具安装。
若使用apt-get工具安装,可输入以下指令

1

sudo apt-get install python-serial

2.串口回显程序
非常简单的一个串口程序,树莓派通过串口返回接收的内容。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

# -*- coding: utf-8 -*

import serial

import time

# 打开串口

ser = serial.Serial("/dev/ttyAMA0", 9600)

def main():

    while True:

        # 获得接收缓冲区字符

        count = ser.inWaiting()

        if count != 0:

            # 读取内容并回显

            recv = ser.read(count)

            ser.write(recv)

        # 清空接收缓冲区

        ser.flushInput()

        # 必要的软件延时

        time.sleep(0.1)

    

if __name__ == '__main__':

    try:

        main()

    except KeyboardInterrupt:

        if ser != None:

            ser.close()

总结

由于可借助python标准库使得树莓派的串口格外好用。是不是可以拿树莓派做一个Modbus RTU从机,的确可以请期待后面的博文吧。

参考资料
1.minicom使用国外博客
2.elinux python-serial 安装pyserial及例程等

出处:http://blog.youkuaiyun.com/xukai871105

更多树莓派串口相关内容:http://shumeipai.nxez.com/?s=%E4%B8%B2%E5%8F%A3

<think>好的,我现在需要帮助用户解决在树莓派上使用Python通过串口发送数据包的问题。用户希望得到具体的实现方法或代码示例。首先,我需要回忆一下相关的知识,并结合提供的引用内容来构建一个有效的回答。 首先,用户提到了树莓派Python串口通信以及发送数据包。根据引用[1],串口通信的基本流程包括发送端读取文件并通过串口发送,接收端接收数据并写入文件。但用户的需求是发送数据包,可能涉及结构化数据,比如多字节或二进制数据。引用[2]提到了使用Python的struct模块来处理结构化二进制数据,并指出在Arduino端可能需要手动处理字节顺序。这提示我在发送数据时需要考虑数据的打包和解析。 接下来,我需要确保代码示例的正确性。Python中常用的串口库是pyserial,需要先安装。引用[2]和[3]都提到了使用struct模块来处理二进制数据,所以代码中应该包含如何打包数据为字节流,并通过串口发送。 用户可能的需求包括如何安装必要的库、配置树莓派串口、打包数据以及实际的发送代码。需要注意树莓派串口默认可能用于蓝牙,因此可能需要修改配置启用UART。此外,数据包的格式需要明确,比如包含校验和以确保完整性。 在代码示例中,应该展示如何打开串口、打包数据(例如使用struct.pack)、计算校验和,并循环发送数据。同时,要提醒用户注意串口的参数设置,如波特率、超时时间等,以及树莓派串口的设备名称(通常是/dev/ttyS0或/dev/ttyAMA0)。 然后,生成的相关问题需要围绕用户可能遇到的后续问题,比如如何接收数据、处理校验和错误、提升传输效率等。这些问题可以帮助用户进一步深入理解串口通信的不同方面。 最后,需要确保回答结构清晰,分步骤说明,并验证代码的正确性。可能还需要提示用户检查硬件连接和配置,因为这些都是常见的问题点。</think>在树莓派上使用Python实现串口数据包发送,需通过`pyserial`库完成硬件交互,结合`struct`模块实现结构化数据打包。以下是分步骤实现方法: --- ### 一、环境准备 1. **启用树莓派串口** ```bash sudo raspi-config # 选择 Interfacing Options -> Serial -> 关闭shell访问 -> 启用硬件串口 ``` 重启后设备路径为`/dev/ttyAMA0`(树莓派3B+及更新型号)[^1] 2. **安装依赖库** ```bash pip install pyserial ``` --- ### 二、数据包发送代码实现 ```python import serial import struct import time # 初始化串口(参数根据实际设备调整) ser = serial.Serial( port='/dev/ttyAMA0', # 硬件串口路径 baudrate=115200, # 波特率 bytesize=serial.EIGHTBITS, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, timeout=1 ) def create_packet(data): """构造带校验的数据包""" header = b'\xAA\x55' # 包头标识 payload = struct.pack('>I2f', len(data), data[0], data[1]) # 打包长度+两个浮点数 checksum = sum(payload) % 256 # 简单校验和 return header + payload + bytes([checksum]) # 示例数据发送 sample_data = (3.1415, -2.718) # 包含两个浮点数的元组 try: while True: packet = create_packet(sample_data) ser.write(packet) print(f"已发送数据包: {packet.hex(' ')}") time.sleep(1) except KeyboardInterrupt: ser.close() ``` --- ### 三、关键代码解析 1. **数据打包**:使用`struct.pack` - `'>I2f'`表示大端格式的:4字节无符号整型 + 2个4字节浮点数 - 支持的类型参考:[struct格式字符表](https://docs.python.org/3/library/struct.html#format-characters) 2. **校验和计算**:`sum(payload) % 256`实现简单校验,实际项目建议使用CRC校验 3. **硬件参数**: - 波特率需与接收端一致 - 流控根据硬件情况设置`rtscts`/`dsrdtr`参数 --- ### 四、调试技巧 1. **本地回环测试**:短接树莓派TX/RX引脚自发自收 2. **十六进制查看**:`hexdump -C /dev/ttyAMA0` 3. **示波器验证**:检查实际电平信号 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值