Как относишься к работе с недокументированным устройством

«Как относишься к работе с недокументированным устройством» — вопрос из категории Софт-скиллы, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый пример ответа, который можно адаптировать под свой опыт.

Ответ

Для меня это стандартная задача в embedded-разработке на C/C++. Часто приходится работать с новым чипом или платой, у которой есть только базовый даташит. Мой подход системный:

  1. Анализ железа: Ищу все доступные интерфейсы (UART, SPI, I2C, USB). С помощью логического анализатора или осциллографа снимаю сигналы, чтобы понять протокол и тайминги.
  2. Поэтапное исследование: Пишу небольшие программы на C для тестирования гипотез. Например, для reverse engineering UART:
// Пример поиска скорости UART методом перебора
#include <fcntl.h>
#include <termios.h>
#include <unistd.h>
#include <vector>
#include <iostream>

std::vector<speed_t> baud_rates = {B9600, B19200, B38400, B57600, B115200};

for (auto br : baud_rates) {
    int fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY);
    termios tty{};
    cfsetispeed(&tty, br);
    cfsetospeed(&tty, br);
    tty.c_cflag &= ~PARENB; // 8N1
    // ... настройка
    tcsetattr(fd, TCSANOW, &tty);
    // Пытаемся прочитать ответ на известную команду
    write(fd, "ATrn", 4);
    char buf[128];
    ssize_t n = read(fd, buf, sizeof(buf));
    if (n > 0 && strstr(buf, "OK")) {
        std::cout << "Found baud rate: " << br << std::endl;
        break;
    }
    close(fd);
}
  1. Документирование: Все найденные команды, регистры и протоколы сразу заношу в внутреннюю wiki. Главное — аккуратность, чтобы не отправить устройству команду, которая может его "сжечь".