Modbus 问答hex码

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

ser = serial.Serial("/dev/ttyUSB2",115200,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)