Python应用开发——串口通信

这篇具有很好参考价值的文章主要介绍了Python应用开发——串口通信。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Python应用开发——串口通信

前言

在嵌入式开发中我们经常会用到串口,串口通信简单,使用起来方便,且适用场景多,因此串口常常用来输出调试Log或者跟其他外设进行通讯,也可以用作上位机和下位机之间的通讯。那这一讲我就简单介绍一下如何用Python编写一个串口收发程序。

1 环境搭建

Python的环境这里就不具体介绍了,网上教程也很多,我主要介绍一下我们这一讲用到的类库以及当前的版本。

package version
time 注:python标准库,无需安装
pyserial v3.5

注:不懂如何安装库的同学请自行查阅资料。

特别说明:本文举的例子皆是基于windows系统下python3来实现的,其他平台不一定完全适配。

2 硬件准备

我们要通过电脑的USB接口发送串口数据,在硬件上首先得保证有可用的串口设备接入,并且正确的安装了驱动。
我这里用的是一个CH340的串口转TTL的模块来测试的。
可以用两个这种模块相互收发,也可以单个模块自发自收,或者接入其他嵌入式设备也行。

硬件接入之后我们可以在设备管理器看到设备的端口号,如下图所示:
python串口通信的接收与发送,Python,python,串口,嵌入式

3 代码编写与测试

3.1 简单测一下串口收发

示例代码如下:

import serial #导入模块

try:
    # 端口号,根据自己实际情况输入,可以在设备管理器查看
    port = "COM6"
    # 串口波特率,根据自己实际情况输入
    bps = 9600
    # 超时时间,None:永远等待操作,0为立即返回请求结果,其他值为等待超时时间(单位为秒)
    time = 5
    # 打开串口,并返回串口对象
    uart = serial.Serial(port, bps, timeout = time)

    # 串口发送一个字符串
    len = uart.write("hello world".encode('utf-8')) 
    print("send len: ", len)

    # 串口接收一个字符串
    str = ''
    for i in range(len):
        str += uart.read().decode("utf-8")
    print("receive data: ", str)

    # 关闭串口
    uart.close()

except Exception as result:
    print("******error******:", result)

运行测试:
python串口通信的接收与发送,Python,python,串口,嵌入式
我这里是自发自收,如果运行没有出错并且成功发送和接收到正确的数据,说明串口通信是走通了,那么接下来就可以继续完善这个流程。
如果出现其他问题,则需要检查硬件和软件,确保所有配置都没问题才能继续进行下一步。

3.2 补充细节

1、串口发送各种不同类型的数据。
串口数据常用字符串和十六进制(hex)表示。下面列举了一些例子,可以作为一种参考。

示例如下:

data1 = "hello world"        # 字符串
data2 = b"hello world"       # bytes
data3 = "你好"               # 中文字符串
data4 = 0x0A                 # 整形(以16进制表示)
data5 = [0x10, 0x11, 0x12]   # 列表/数组(以16进制表示)

len = uart.write(data1.encode('utf-8'))         # 发送字符串"hello world"
len = uart.write(data2)                         # 发送字符串"hello world"
len = uart.write(data3.encode('utf-8'))         # 以utf-8编码方式发送字符串"你好"(6字节)
len = uart.write(data3.encode('gbk'))           # 以gbk编码方式发送字符串"你好"(4字节)
len = uart.write(chr(data4.encode("utf-8"))     # 发送16进制数据0x0A(1字节)
for x in data5:                                 # 遍历列表/数组的所有元素并依次发送
    len = uart.write(chr(x).encode("utf-8")) 

2、完善串口接收流程
串口接收跟发送一样,接收数据也是常用字符串和十六进制(hex)表示。
可以根据以下两种方式接收数据:

str = uart.read(uart.in_waiting).decode("utf-8")   # 以字符串接收
str = uart.read().hex()                            # 以16进制(hex)接收

接收的时间很短,大部分时间其实是在等待接收,所以我们需要加一个死循环或者循环线程来确保串口一直在等待接收。
示例如下:

while True:
    if uart.in_waiting:
        # str = uart.read(uart.in_waiting).decode("utf-8")   # 以字符串接收
        str = uart.read().hex()                            # 以16进制(hex)接收
        print(str)                                         # 打印数据

3、扫描端口。
在不知道串口端口号的情况下可以先扫描一下可用的端口。
示例如下:

import serial 
import serial.tools.list_ports

port_list = list(serial.tools.list_ports.comports())
print(port_list)
if len(port_list) == 0:
   print('无可用串口')
else:
    for i in range(0,len(port_list)):
        print(port_list[i])

3.3 完善整个收发流程

根据上面举的一些例子,我们把整个流程补充完整。
示例如下:

# 导入模块
import threading
import time
import serial
import serial.tools.list_ports

# 自定义变量
port = "COM6"  # 端口号,根据自己实际情况输入,可以在设备管理器查看
bps = 9600     # 串口波特率,根据自己实际情况输入
timeout = 5       # 超时时间,None:永远等待操作,0为立即返回请求结果,其他值为等待超时时间(单位为秒)
rxdata = ''    # 接收的数据

# 扫描端口
def check_uart_port():
    port_list = list(serial.tools.list_ports.comports())
    # print(port_list)
    if len(port_list) == 0:
        print('can not fine uart port')
        return False
    else:
        for i in range(0,len(port_list)):
            print(port_list[i])
    return True

# 打开串口
def open_uart(port, bps, timeout):
    try:
        # 打开串口,并返回串口对象
        uart = serial.Serial(port, bps, timeout=timeout)
        return uart
    except Exception as result:
        print("can not open uart")
        print(result)
        return False

# 发送数据
def uart_send_data(uart, txbuf):
    len = uart.write(txbuf.encode('utf-8'))  # 写数据
    return len

# 接收数据
def uart_receive_data(uart):
    if uart.in_waiting:
        rxdata = uart.read(uart.in_waiting).decode("utf-8")   # 以字符串接收
        # rxdata = uart.read().hex()  # 以16进制(hex)接收
        print(rxdata)  # 打印数据

# 关闭串口
def close_uart(uart):
    uart.close()

# 创建一个线程用来等待串口接收数据
class myThread (threading.Thread):   # 继承父类threading.Thread
    def __init__(self, uart):
        threading.Thread.__init__(self)
        self.uart = uart
    def run(self):                   # 把要执行的代码写到run函数里面 线程在创建后会直接运行run函数
        while True:
            # print("thread_uart_receive")
            uart_receive_data(self.uart)  # 接收数据
            # time.sleep(0.01)

# 主函数
def main():
    # 扫描端口
    result = check_uart_port()
    if(result == False):
        return

    # 打开串口
    result = open_uart(port, bps, timeout)
    if (result == False):
        return
    else:
        uart1 = result

    # 创建一个线程用来接收串口数据
    thread_uart = myThread(uart1)
    thread_uart.start()

    while True:
        # 定时发送数据
        txbuf = "hello world"
        len = uart_send_data(uart1, txbuf)
        print("send len: ", len)
        time.sleep(1)

# 启动主函数
main()

运行测试:
python串口通信的接收与发送,Python,python,串口,嵌入式
这里还是自发自收,但是改成定时1s循环发送一帧数据,如果是实际使用的话就不要短接TX和RX了,串口是全双工,收发是可以同步进行的。

结束语

关于如何使用Python实现串口通信就讲到这里,在Python这个领域我也是小白一个,我只是根据以往嵌入式的经验写了这么一套代码,如果有哪里写的不对或者写的不够好的,欢迎评论区留言指正,谢谢!文章来源地址https://www.toymoban.com/news/detail-625532.html

到了这里,关于Python应用开发——串口通信的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 如何使用Python进行桌面应用开发?

    Python提供了多个库和框架来进行桌面应用开发。以下是使用Python进行桌面应用开发的常用方法之一: PyQt:PyQt是一个用于开发跨平台桌面应用的Python库,它提供了丰富的GUI组件和工具。以下是使用PyQt创建桌面应用的基本步骤: a. 安装PyQt库:使用pip命令安装PyQt库,例如: p

    2024年02月17日
    浏览(44)
  • Python桌面应用开发之PyQt

    Tkinter:优势是免安装、相对简单,缺点是功能少,无界面设计工具。 PyQT:使用率高,功能最为强大,代码可维护性和易读性高。 WxPython:介于Tkinter和PyQT之间,相当于压缩版QT。 总结:三种框架各有优劣,有时间可以全部学习,并不复杂。如果只选一种,这里推荐使用最主

    2024年02月13日
    浏览(49)
  • 嵌入式Linux应用开发笔记:串口

    串口(UART)是嵌入式设备中比较常用的功能。这篇文章将记录下应用程序中串口操作相关内容。 这篇文章中内容均在下面的开发板上进行测试: 《新唐NUC980使用记录:自制开发板(基于NUC980DK61YC)》 这篇文章是在下面文章基础上进行的: 《新唐NUC980使用记录(5.10.y内核)

    2024年02月09日
    浏览(50)
  • 【python】web应用开发DRF框架

    【python】web应用开发DRF框架 Django rest_framework, 简称 drf, 可以更方便的使用django写出符合 RESTful 规范的接口, (缩减编写api接口的代码) Django REST framework是一个建立在Django基础之上的Web应用开发框架(Django的一个app),可以快速的开发REST API接口应用 在REST framework中,提供了序列化器

    2024年02月11日
    浏览(57)
  • 【Python开发】FastAPI 11:构建多文件应用

    以往的文件都是将对外接口写在一个文件里边,而作为应用来说,接口是不可避免分散到多个文件中的,比如某文件负责注册登录模块,某文件负责内管模块,某文件负责业务模块等。FastAPI 也提供了APIRouter 这一工具来进行灵活构建应用,本文将是它的示例。 目录 1 APIRout

    2024年02月10日
    浏览(45)
  • Python如何利用API进行数据交互和应用开发

    Python如何利用API进行数据交互和应用开发 公共参数 请求地址 名称 类型 必须 描述 key String 是 调用key(必须以GET方式拼接在URL中) secret String 是 调用密钥 api_name String 是 API接口名称(包括在请求地址中)[item_search,item_get,item_search_shop等] cache String 否 [yes,no]默认yes,将调用缓存

    2024年02月15日
    浏览(43)
  • python之TCP的网络应用程序开发

    本博客的内容基于我个人学习黑马程序员课程的学习笔记整理而成。我特此声明,所有版权属于黑马程序员或相关权利人所有。本博客的目的仅为个人学习和交流之用,并非商业用途。 我在整理学习笔记的过程中尽力确保准确性,但无法保证内容的完整性和时效性。本博客的

    2024年02月05日
    浏览(44)
  • Python Flask框架-开发简单博客-项目布局、应用设置

    作者:Eason_LYC 悲观者预言失败,十言九中。 乐观者创造奇迹,一次即可。 一个人的价值,只在于他所拥有的。所以可以不学无术,但不能一无所有! 技术领域:WEB安全、网络攻防 关注WEB安全、网络攻防。我的专栏文章知识点全面细致,逻辑清晰、结合实战,让你在学习路

    2024年02月02日
    浏览(47)
  • 1+x_大数据应用开发(python)职业技能(中级)

    大数据应用开发(python)职业技能等级证书(中级),1+x证书考题。 题库就是这些题,博主考试的时候全是下面的原题,总分100等于理论40+实操60,二者相加超过60分即可,建议大家把重点放在实操题上。 文末有百度网盘下载地址,供大家免费下载csv文件。 只要大家把这三套

    2024年02月05日
    浏览(49)
  • 区块链主要应用领域,写给正在求职的Python开发

    从完全去中心化到有效去中心化 区块链的三个效用 区块链与物联网 区块链与人工智能 发展趋势 二、区块链主要应用领域 =========== (一)在金融领域应用 ===========================================================================================================================================================

    2024年04月17日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包