Пишем код на python с помощью нейронки
В ноябре я писал статью про Быстрый Modbus и мне стало интересно, а возможно ли с помощью нейронки написать код сканирования устройств на шине?
Оказалось очень даже возможно. Взял демку альфы DeepSeek Coder, описал русскими словами, что хочу и через несколько итераций получил рабочий код на Python! Прям магия, мне понравилось.
Выхлоп скрипта в консоли:
Итоговый код:
import serial
import time
# Константы для настройки порта
SERIAL_PORT = '/dev/ttyACM0'
BAUD_RATE = 115200
# Отдельные байты для команд
BROADCAST_ADDRESS = 0xFD
EXTENDED_FUNCTION_CODE = 0x46
START_SCAN_SUBCOMMAND = 0x01
CONTINUE_SCAN_SUBCOMMAND = 0x02
END_SCAN_SUBCOMMAND = 0x04
# Функция для вычисления контрольной суммы
def calculate_crc(data):
crc = 0xFFFF
for pos in data:
crc ^= pos
for _ in range(8):
if ((crc & 1) != 0):
crc >>= 1
crc ^= 0xA001
else:
crc >>= 1
return crc
# Функция для создания команды с контрольной суммой
def create_command(broadcast, function_code, subcommand):
command = bytes([broadcast, function_code, subcommand])
crc = calculate_crc(command)
command += crc.to_bytes(2, 'little') # Контрольная сумма в little-endian
return command
# Функция для отправки команды и получения ответа
def send_command(ser, command):
ser.write(command)
time.sleep(0.1) # Ждем ответ
response = ser.read(ser.inWaiting())
# Фильтруем ответ, удаляя лишние байты 0xFF в начале
response = bytes(b for b in response if b != 0xFF)
return response
# Функция для преобразования массива байтов в массив строк в шестнадцатеричном формате
def bytes_to_hex_array(byte_array):
return [f"0x{byte:02X}" for byte in byte_array]
# Функция для обработки ответа
def process_response(response):
if not response:
print("Сканирование завершено.")
return True # Возвращаем True, чтобы остановить цикл
# Проверка, что ответ содержит функцию конца сканирования
if response[2] == END_SCAN_SUBCOMMAND:
print("Сканирование завершено.")
return True # Возвращаем True, чтобы остановить цикл
else:
# Преобразуем байты в строки в шестнадцатеричном формате и выводим их
hex_array = bytes_to_hex_array(response)
print("Ответ устройства:", hex_array)
return False # Возвращаем False, ч�бы продолжить цикл
# Главная функция
def main():
# Открываем последовательный порт
ser = serial.Serial(SERIAL_PORT, BAUD_RATE, timeout=1)
# Создаем команду начала сканирования
start_scan_command = create_command(BROADCAST_ADDRESS, EXTENDED_FUNCTION_CODE, START_SCAN_SUBCOMMAND)
# Начинаем сканирование
response = send_command(ser, start_scan_command)
if not process_response(response):
# Если сканирование не завершено, продолжаем
while True:
continue_scan_command = create_command(BROADCAST_ADDRESS, EXTENDED_FUNCTION_CODE, CONTINUE_SCAN_SUBCOMMAND)
response = send_command(ser, continue_scan_command)
if process_response(response):
break # Выходим из цикла, если сканирование завершено
# Закрываем последовательный порт
ser.close()
if __name__ == "__main__":
main()