USB串口通信,树莓派使用GPIO口,收发16进制数组的Python代码

工控机和树莓派采用USB转TTL串口通信,后者使用GPIO口,收发16进制数组的Python代码

接线

采用USB转TTL模块,Linux系统的工控机接USB插口,TTL模块输出RX、TX、VCC、GND,树莓派的GPIO14口也就是RXD0接TTL串口的TX。

USB转TTL-CH340模块

在树莓派上使用Python的RPi.GPIO库,配置GPIO14(RXD0)作为接收引脚。
在树莓派上编写接收数据的代码,通过GPIO.input(14)检测GPIO14(RXD0)的状态,如果为高电平表示有数据接收,然后使用ser.read(ser.in_waiting)读取串口接收缓冲区中的数据。

通信协议

串口通信发送一串数据,包含2个头、总长度为6个的16进制字符数组,表示为uint8 data[6]。每条数据前2个字节是0xAA,0xAA的开头;第3个字节是指令的类型;第4,5位是指令,它被编码为2位的uint8;采用CRC8进制对前面5位校验,得到第6位。典型符合规范的数据格式如下:
0xAA , 0xAA , 0x09 , 0x07 , 0x01 , 0x32
其中有0x07 , 0x01 是被编码好的指令。

发送

有无发送指令的python版的程序可以参考的。需要将每个子功能写成单独的函数,包括如打开串口、发送指令、指令的编码、CRC校验等

ChatGPT
以下是一个示例的Python程序,用于发送串口数据、进行指令编码和CRC校验的过程。程序假设使用pyserial库进行串口通信。

# -*- coding: UTF-8 -*-
#!/usr/bin/python3 python3
import serial
import struct
import time# 配置串口参数
port = '/dev/ttyUSB0'  # 串口设备路径
baudrate = 9600  # 波特率# 打开串口
ser = serial.Serial(port, baudrate)# 定义指令类型的常量
INSTRUCTION_TYPE = 0x09# CRC8校验函数
def crc8(data):crc = 0x00polynomial = 0x8C  # CRC-8多项式for byte in data:crc ^= bytefor _ in range(8):if crc & 0x80:crc = (crc << 1) ^ polynomialelse:crc <<= 1return crc & 0xFF# 将时间秒数编码为两位16进制数字
def encode_seconds(seconds):seconds_hex = hex(seconds)[2:].zfill(2)  # 将秒数转换为两位的十六进制字符串return int(seconds_hex, 16)  # 将十六进制字符串转换为整数# 编码指令
def encode_instruction(data):encoded_data = []for value in data:encoded_data.append(value & 0xFF)return encoded_data# 发送指令
def send_instruction(instruction):# 构建指令data = bytearray()data.extend([0xAA, 0xAA])  # 前导字节data.append(INSTRUCTION_TYPE)  # 指令类型data.extend(encode_instruction(instruction))  # 编码后的指令数据# 计算校验码crc = crc8(data[:5])  # 计算校验码时不包括最后一个字节(校验码本身)data.append(crc)  # 添加校验码的低字节return datatry:# 主循环while True:# 测试发送指令# instruction = [0x07, 0x08]  # 指令数据# 获取当前时间的秒数seconds = int(time.time())# print(seconds)# 发送时间秒数编码instruction = encode_seconds(seconds).to_bytes(4, 'big')# 发送一个字节的数据,高位在前data = send_instruction(instruction[2:4])formatted = ' '.join(f'{byte:02X}' for byte in data)print(formatted)# 发送指令ser.write(data)# # 接收指令# response = receive_command()# if response:#     print('Received:', response)# 休眠一段时间,控制发送频率time.sleep(0.2)  # 休眠0.2秒except KeyboardInterrupt:# Ctrl+C被按下,执行异常处理ser.close()print("程序终止,关闭串口")except Exception as e:# 其他异常处理print("发生异常:", str(e))ser.close()

在上述示例中,我们定义了一个encode_instruction()函数来对指令数据进行编码,将每个元素限定在0-255的范围内,并返回编码后的数据。然后我们构建指令,添加前导字节、指令类型、编码后的指令数据,并计算校验码。最后,我们使用ser.write()函数将指令数据发送到串口。

请注意,在实际应用中,你可能还需要添加错误处理、超时设置、数据处理等功能,以确保稳定和可靠的串口通信。以上示例仅提供了一个基本的框架,具体实现可能需要根据你的具体需求进行调整和扩展。

接收

串口通信接收一串数据,包含2个头、总长度为6个的16进制字符数组,表示为uint8 data[6]。每条数据前2个字节是0xAA,0xAA的开头;第3个字节是指令的类型;第4,5位是被编码好的指令,需要被解析为int16数字;采用CRC16进制对前面5位校验,得到第6位,MODBUS 算法。

有无python版的程序可以参考的。需要将每个子功能写成单独的函数,包括如打开串口、接收指令、指令的解析、CRC校验等
ChatGPT

以下是一个示例的Python程序,用于接收串口数据、进行CRC校验和解析指令的过程。程序假设使用pyserial库进行串口通信。

# -*- coding: UTF-8 -*-
#!/usr/bin/python3 python3
import serial
import struct
import RPi.GPIO as GPIO# 配置GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(14, GPIO.IN)  # GPIO14作为接收引脚# 配置串口参数
port = '/dev/serial0'  # 树莓派上UART接口所对应的串口设备路径
baudrate = 9600  # 波特率
# 打开串口
ser = serial.Serial(port, baudrate)# 配置GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(14, GPIO.IN)  # GPIO14作为接收引脚# 定义指令类型的常量
INSTRUCTION_TYPE = 0x09# CRC8校验
def crc8(data):crc = 0x00polynomial = 0x8C  # CRC-8多项式for byte in data:crc ^= bytefor _ in range(8):if crc & 0x80:crc = (crc << 1) ^ polynomialelse:crc <<= 1return crc & 0xFF# 解析指令
def parse_instruction(data):if len(data) != 6:print("Invalid instruction length")return# 校验头部if data[0] != 0xAA or data[1] != 0xAA:print("Invalid header")return# 校验指令类型if data[2] != INSTRUCTION_TYPE:print("Invalid instruction type")return# 校验CRCcrc = crc8(data[:5])  # 计算校验码时不包括最后一个字节(校验码本身)if crc != data[5]:print("CRC check failed")return# 获取指令数据instruction = data[3:5]# 执行相应的指令逻辑process_instruction(instruction)# 处理指令逻辑
def process_instruction(instruction):# 按照具体需求进行指令处理cmd16 = struct.unpack('<h', bytearray(instruction))[0]  # 解析为int16数字print("Received Instruction:", cmd16)try:# 接收数据while True:if GPIO.input(14):  # 检查GPIO14状态,判断是否有数据接收# data = ser.read(ser.in_waiting)  # 一直读取数据data = ser.read(6)  # 读取固定长度的数据# 接收数据if len(data) == 6 and data[:2] == b'\xAA\xAA':parse_instruction(data)except KeyboardInterrupt:# Ctrl+C被按下,执行异常处理ser.close()print("程序终止,关闭串口")except Exception as e:# 其他异常处理print("发生异常:", str(e))ser.close()

在上述示例中,我们定义了一个parse_instruction()函数来解析接收到的指令数据。首先,我们检查指令长度是否为6个字节,并进行CRC校验。如果校验失败或指令类型不匹配,将输出相应的错误信息。如果校验通过,我们解析指令数据并调用process_instruction()函数来执行相应的指令逻辑。

请注意,以上示例仅提供了一个基本的框架,你可能需要根据具体的需求进行调整和扩展。在实际应用中,你可能还需要添加错误处理、超时设置、数据处理等功能,以确保稳定和可靠的串口通信。

串口通信如何控制数据发送和解析的频率?

ChatGPT

在串口通信中,你可以使用不同的方法来控制数据发送的频率。以下是几种常见的方法:

  • 延时发送:在发送每个数据包之间添加固定的延时时间。你可以使用time.sleep()函数在发送数据包之间添加延时,以控制发送频率。例如,time.sleep(0.1)将在发送数据包后延迟100毫秒。这个方式不推荐。

  • 定时发送:使用定时器来定期发送数据。你可以使用Python的threading.Timer类创建一个定时器,并在定时器回调函数中发送数据。

在串口通信中,使用threading.Timer控制数据接收和解析的频率可以通过以下步骤实现:

  • 创建一个定时器对象,指定定时器的时间间隔。
  • 在定时器回调函数中执行数据接收和解析的逻辑。
  • 启动定时器,使其开始定时执行回调函数。

下面是一个示例,演示如何使用threading.Timer控制串口数据接收和解析的频率:


import serial
import threading# 配置串口参数
port = '/dev/ttyUSB0'  # 串口设备路径
baudrate = 9600  # 波特率# 打开串口
ser = serial.Serial(port, baudrate)# 定义数据接收和解析的函数
def receive_and_parse_data():# 接收数据data = ser.readline().strip()# 解析数据# TODO: 在这里添加你的数据解析逻辑print("Received data:", data)# 重新启动定时器,控制数据接收和解析的频率timer = threading.Timer(1.0, receive_and_parse_data)timer.start()# 启动定时器,控制数据接收和解析的频率
timer = threading.Timer(1.0, receive_and_parse_data)
timer.start()# 阻塞主线程,保持程序运行
while True:pass# 关闭串口
ser.close()

在上述示例中,receive_and_parse_data()函数被定时器调用,定时执行串口数据的接收和解析。定时器的时间间隔为1.0秒,你可以根据需要进行调整。

无论使用延时发送还是定时发送,都可以根据实际需求调整发送数据的频率。请注意,实际的发送频率可能受到串口传输速率、数据包大小和目标设备的处理能力等因素的限制。因此,需要根据具体的应用场景和需求进行调整和测试。

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

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

相关文章

配置树莓派作为一个Access Point(AP)

配置树莓派作为一个Access Point&#xff08;AP&#xff09; WLAN实验配置树莓派的内容&#xff1a; SSH&#xff08;使用Laptop方便打开树莓派命令行界面&#xff09; Hostapd v2.3或者最新版本 iperf2 配置SSH连接 SSH&#xff08;Secure Shell&#xff09;是一种用于安…

本人亲测树莓派4B ubuntu20.04server连接wifi 设置wifi静态ip 连接Xshell 详细避坑

一.前言 遇到的坑 镜像安装 网上有很多教程&#xff0c;注意的是我安装20.04MATE版时会出现安装系统崩溃的情况&#xff0c;而安装server版本则不会。 我的显示器是24寸&#xff0c;在连接显示器时需要在usercfg.txt中键入如下命令&#xff1a; framebuffer_width1920 framebuf…

SCI投稿Title Page、Cover letter、Highlights、Manuscript模板

参考&#xff1a; SCI投稿Cover letter模板 SCI 投稿全过程信件模板一览&#xff08;Cover letter&#xff0c;催稿信等&#xff09; SCI 投稿 3 个月迟迟无消息&#xff0c;竟只是漏了这个步骤… elsevier初次投稿模板 最新投稿信 Cover Letter 和Highlights 模板资料 1.第一…

Ghatgpt正式登录苹果手机应用商城,并支持Siri和快捷指令

根据最新信息&#xff0c;OpenAI 发布的 ChatGPT 官方 iOS 应用程序迎来了重大更新。该应用程序已经在上个月登陆了美国、英国、法国、德国和韩国等 App Store&#xff0c;并且成为该市场上最受欢迎的免费应用程序。 作为生产力类应用的领导者&#xff0c;该应用程序完全免费&a…

让对方计算机死机的代码,微信让对方死机代码是什么?一串代码卡死微信

随着网络技术的发达&#xff0c;越来越多的人学会写代码。不少人也会通过代码&#xff0c;给别人来一场恶作剧。就例如通过给对方发送一串代码便能让对方的微信死机&#xff0c;大家是不是都觉得很神奇呢?那么微信让对方死机的代码是什么呢?接下来小编就给大家分享一下。 漏洞…

java实验:完成一个电商购物平台的登录注册窗体

电商购物平台pro plus &#xff08;越来越像样了奥 文章目录 前言 一、实验内容 二、实验思路 三、实验代码 四、实验结果截图 总结 前言 继续对电商购物平台进行改进和升级&#xff0c;加上用户登录及注册页面 &#xff08;虽然前几次升级好像没发 一个有点小复杂的东…

B2C模式电商案例-用户注册与登录

1、用户注册-短信验证码 1.1分析 1.2后端 创建 SmsController类&#xff0c;调用阿里大鱼工具类&#xff0c;发送短信 package com.czxy.changgou4.controller;import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse; import com.czxy.changgou4.pojo.User; import …

用户注册登录退出功能的实现——淘淘商城(二十五)

静态资源配置用户注册页面 需求 分析总结 Controller层 用户登录页面 需求 分析总结 Controller层 门户工程整合单点登录系统 cookie的读写 需求开发 注册、登录、退出页面的跳转 需求开发 拦截器强制登录 需求Service层拦截器 运行工程 静态资源配置 taotao-sso的WEB-INF下…

JAVA实验:完成一个电商购物平台的登录注册窗体,点击“点我注册”,显示注册窗体,用户输入用户信息,点击提交后到达显示用户信息的窗体。

内容3&#xff1a;在内容2的基础上&#xff0c;用户点击登录注册窗体的登录按钮&#xff0c;到达商品信息查询的窗体&#xff0c;窗体如图3所示。 本次实验主要利用java类swing中的各种方法。 实验思路&#xff1a;通过实验所给出的窗口&#xff0c;使用swing中方法进行构建&a…

【Go实战 | 电商平台】(4) 用户注册

文章目录 1. 编写路由2. 注册路由3. 注册接口3.1 service层3.2 api层3.2 serializer 4. 注册服务 用到的包 github.com/gin-contrib/sessions github.com/gin-contrib/sessions/cookie github.com/gin-gonic/gin 1. 编写路由 新建一个WSGI应用程序实例。 r : gin.Default(…

Vue电商项目--登录与注册

登录注册静态组件 刚刚报了一个错误&#xff0c;找不到图片的资源 assets文件夹--放置全部组件共用静态资源 在样式当中也可以使用符号【src别名】。切记在前面加上 注册业务上 先修改原先的接口成这个按钮 然后把input框里面的数据保存到data中 注册业务下 就是点击获…

C++面经

编译、链接与库编译单文件编译多文件编译 动态链接与静态链接静态链接动态链接 面向对象c⾯向对象 三大特性封装继承多态静态多态&#xff08;模板或重载&#xff09;动态多态&#xff08;面向对象、继承、多态、虚函数&#xff09; 面向对象和面向过程语言的区别面向过程面向对…

GPT-4,究竟强大在哪里?

2023年3月15日&#xff0c;OpenAI向全世界进行了GPT-4的发布会&#xff0c;整个世界都为之沸腾了。GPT-4究竟是有多厉害&#xff1f;为什么能造成这么大的影响&#xff1f;今天小灰来仔细讲解一下。 基础配置 先说说基础配置&#xff0c;之前小灰分享过&#xff0c;GPT-3.5有17…

【EasyPoi实战系列】Spring Boot集成EasyPoi - 第467篇

历史文章&#xff08;文章累计460&#xff09; 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 6…

解密Prompt系列1. Tunning-Free Prompt:GPT2 GPT3 LAMA AutoPrompt

借着ChatGPT的东风&#xff0c;我们来梳理下prompt范式的相关模型。本系列会以A Systematic Survey of Prompting Methods in Natural Language Processing这篇综述为基础&#xff0c;分门别类的整理下这几年比较有代表性的prompt模型。或许你还以其他形式看到过prompt概念&…

未来式人工智能教育在国内的现状

无论是高空户外还是深海水下&#xff0c;或者火灾、地震现场&#xff0c;危险环境让身处其中的工作人员面临巨大威胁。而正在兴起的特种机器人&#xff0c;有望代替人类&#xff0c;在危险现场完成任务。格物斯坦表示&#xff1a;特种机器人&#xff0c;是机器人的一个重要分支…

chatgpt赋能python:Python如何隐藏进程

Python如何隐藏进程 介绍 进程是指运行中的程序在操作系统中的一个实例。在计算机系统中&#xff0c;进程通常都可以被用户或者其他程序所看到。然而&#xff0c;有时候我们需要隐藏进程&#xff0c;比如保护敏感信息或者防止恶意攻击。 Python是一种高级编程语言&#xff0…

UP主高薪裸辞转型独立开发者;LLM权威学习路线图;游戏开发最全AI工具盘点;LOGO制作保姆教程 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f916; Hugging Face 全球开源AI游戏开发挑战赛&#xff0c;7月8日开始 Open Source AI Game Jam 是 Hugging Face 举办的首场开源游戏开发挑…

ChatGPT到底是什么,带领大家详细解读!

前言 ChatGPT的强大程度相信很多同学都已经体验过了&#xff0c;无论是编写文章&#xff0c;问答&#xff0c;写代码展现除了非常惊艳的能力。一定喜欢技术的同学一定好奇&#xff0c;ChatGPT是如何做到“全知全能”&#xff0c;即会写文章&#xff0c;又会表达总结&#xff0…

IDE + ChatGPT,这款编辑器真的做到可以自动写代码了!

介绍 Cursor 是集成了 GPT-4 的 IDE 工具&#xff0c;目前免费并且无需 API Key&#xff0c;支持 Win、Mac、Linux 平台&#xff0c;可以按要求生成代码&#xff0c;或者让 AI 帮助优化代码&#xff0c;分析代码。Cursor目前已经集成了openai的GPT-4&#xff0c;它或将彻底改变…