1 заметка с тегом

эксперимент

Пишем код на python с помощью нейронки

В ноябре я писал статью про Быстрый Modbus и мне стало интересно, а возможно ли с помощью нейронки написать код сканирования устройств на шине?

Оказалось очень даже возможно. Взял демку альфы DeepSeek Coder, описал русскими словами, что хочу и через несколько итераций получил рабочий код на Python! Прям магия, мне понравилось.

Кусочки процесса

Выхлоп скрипта в консоли:

Выхлоп + я вывел кусочек содержимого скрипта командой cat

Итоговый код:

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()
 24   2 мес   ai   python   эксперимент