树莓派同时收发hex和ascill的程序

这些Python代码片段展示了如何使用RaspberryPi通过串口进行Modbus通信,包括发送和接收ASCII及Hex编码的数据。代码中涉及了`serial`库来处理串口通信,`pymodbus`库用于Modbus协议操作,以及数据的转换和解析。示例涵盖了发送查询帧、接收响应、错误处理和数据解码等基本功能。
摘要由CSDN通过智能技术生成

Modbus 问答hex码

                        
import RPi.GPIO as GPIO
import serial
import string
import binascii
import time

ser = serial.Serial("/dev/ttySC0",9600,timeout=1)

# Send modbus device inquiry frame (hex code)
ser.write(bytes.fromhex('01 03 00 00 00 02 C4 0B '))

# Modbus device returns response frame rate (hex code)
ser.flushInput()
data = ""
print("You can always receive data, press Ctrl + C to exit")
while 1:
    while ser.inWaiting() > 0:
        data = ser.readline()
    if data != "":
        print(str(binascii.b2a_hex(data))[2:-1])
        data = ""

树莓派判断并接收ascill 和 hex的 程序

import serial

ser = serial.Serial(
    # Your serial port name
    port='/dev/ttyUSB0',
    # Baud rate
    baudrate=9600,
    # Data bits
    bytesize=serial.EIGHTBITS,
    # Parity
    parity=serial.PARITY_NONE,
    # Stop bits
    stopbits=serial.STOPBITS_ONE
)

while True:
    # Read one byte of data
    data = ser.read()

    # Check if it's an ASCII character
    if data.isalpha():
        # Print the character
        print(data)
    # Otherwise, it's a hex value
    else:
        # Convert the hex value to an integer
        data = int(data, 16)
        # Print the integer
        print(data)
import serial

ser = serial.Serial('/dev/ttyUSB0', 115200) # 串口名称和波特率
while True:
    # 发送ASCII数据
    ser.write('Hello, world!\r\n'.encode())

    # 发送Hex数据
    ser.write(bytes.fromhex('01 02 03 04 05 06'))

    # 读取并解码ASCII数据
    data = ser.readline().decode().strip()
    if data:
        print('Received ASCII: {}'.format(data))

    # 读取Hex数据
    data = ser.read(6)
    if data:
        print('Received Hex: {}'.format(data.hex()))

ser.close() # 关闭串口

import serial


# 配置串口
ser = serial.Serial('/dev/ttyS0', 9600)  # 根据实际串口配置更改端口和波特率

# 发送ASCII数据
def send_ascii(data):
    ser.write(data.encode())

# 发送16进制数据
def send_hex(data):
    ser.write(bytes.fromhex(data))

# 接收数据
def receive():
    data = ser.readline().decode().strip()
    if data.startswith(":"):
        # 如果收到16进制数据,则返回16进制字符串
        return data.strip(":")
    else:
        # 否则返回ASCII字符串
        return data

# 示例
send_ascii("Hello, World!")
send_hex("1a2b3c")
data = receive()
print(data)
import serial
import binascii

# 打开串口
ser = serial.Serial('/dev/ttyUSB0', 9600)

# 发送HEX格式数据
hex_data = b'\x01\x02\x03\x04'
ser.write(hex_data)

# 接收HEX格式数据
hex_str = ser.read(4)
hex_data = binascii.hexlify(hex_str)
print('Received HEX data:', hex_data)

# 发送ASCII格式数据
ascii_str = 'Hello, world!'
ser.write(ascii_str.encode())

# 接收ASCII格式数据
ascii_data = ser.readline()
print('Received ASCII data:', ascii_data.decode())
import serial

ser = serial.Serial('/dev/ttyUSB0', 115200)  # 串口通信设置

while True:
    if ser.in_waiting > 0:  # 如果串口有数据可读取
        data = ser.read()  # 读取一个字节
        if data == b':':  # 如果读到了 ':' 字符,说明后面是 hex 数据
            hex_data = bytearray.fromhex(ser.readline().decode().strip())  # 读取一>
            print("Received hex data:", hex_data)
        else:  # 如果不是 ':' 字符,说明是 ASCII 数据
            ascii_data = data + ser.readline()  # 读取一行数据
            print("Received ASCII data:", ascii_data.decode().strip())
import serial
from pymodbus.client.sync import ModbusSerialClient
from pymodbus.exceptions import ConnectionException

# 打开串口,根据实际情况修改端口号和波特率
ser = serial.Serial('/dev/ttyS0', 9600)

# 创建 Modbus 串口客户端
client = ModbusSerialClient(method='rtu', port='/dev/ttyS0', baudrate=9600)

# 连接 Modbus 设备
try:
    if not client.connect():
        raise ConnectionException("连接 Modbus 设备失败")
except ConnectionException as e:
    print(e)

# 读取传感器的寄存器数据
sensor_address = 1  # 传感器地址
start_register = 0  # 起始寄存器地址
register_count = 2  # 寄存器数量
response = client.read_holding_registers(start_register, register_count, unit=sensor_address)

# 打印读取到的数据(以16进制形式显示)
if response.isError():
    print("读取寄存器失败,错误代码:", response.functionCode)
else:
    data = response.registers
    print("读取到的数据:", ' '.join(hex(d) for d in data))

# 发送16进制数据到传感器
data_to_send = [0x01, 0x03, 0x00, 0x00, 0x00, 0x02, 0xC4, 0x0B]
ser.write(bytes(data_to_send))

# 读取传感器的响应数据
data_received = ser.read(10)  # 读取10个字节的数据
print('Received data: ', ' '.join(hex(b) for b in data_received))

# 关闭 Modbus 客户端和串口
client.close()
ser.close()
import os
import tkinter as tk
import time
from tkinter.filedialog import askdirectory
import numpy as np


import serial  # 导入串口包
from threading import Thread

import binascii
import RPi.GPIO as GPIO
from tkinter.filedialog import askdirectory


ser = serial.Serial(
    port='/dev/ttyUSB0',
    baudrate=921600,
    bytesize = 8,
    stopbits = 1,
    timeout=1
)
ser.flushInput()  # 清空缓冲区

def bytes2Hex(argv):        #十六进制显示 方法1
    try:
        result = ''
        hLen = len(argv)
        for i in range(hLen):
            hvol = argv[i]
            # if hvol == 0xfe:    #遇到0xfe换行
            #     result += '\r\n'
            hhex = '%02x '%hvol #转为0xff,
            result += hhex
    except:
        pass
    return result

def sends():
    """ 发送数据 """
    data=[0xCC,0x01,0x09,0x00,0x00,0x02,0xD8,0x0D,0x0A]  #获取光谱数据
    #data=[0xCC, 0x01, 0x09, 0x00, 0x00, 0x0F, 0xE5, 0x0D, 0x0A]  #获取光谱频率
    ser.write(data)  # 发送

if __name__ == '__main__':
     
    sends()
    time.sleep(0.5)
    data = ser.read_all()
    content = bytes2Hex(data)
    print(len(data))
    print(content)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

信看

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值