Сброс флэш-памяти с маршрутизатора с помощью C
Я создаю приложение, которое сбрасывает флэш-память маршрутизатора (аналогично brn-tool). Флэш-память маршрутизатора может быть выгружена из его загрузчика, к которому я уже могу получить доступ через последовательный кабель.
До сих пор созданное приложение может захватить 10000 байт (максимальных байт, которые загрузчик возвращает за один цикл).
У меня проблемы с получением остальных байтов флэш-памяти.
Как упоминалось ранее, байты могут быть прочитаны из меню загрузчика, выбрав соответствующую опцию и введя количество байтов для чтения. Код выглядит следующим образом.
int ReturnByte(int FileDescriptor, char * StartAddress)
{
// Create the Variable to hold the Start Address in Hexadecimal Notation
char ModdedStartAddress[10];
// Convert the Decimal Input to Hexadecimal
sprintf(ModdedStartAddress,"%X", (unsigned int)strtol(StartAddress, NULL, 10));
// Append a \r to simulate an Enter Press
ModdedStartAddress[strlen(ModdedStartAddress)] = '\r';
// Go inside the Read Menu
char Character = 'R';
write(FileDescriptor, &Character, 1);
// Input the Starting Read Address
write(FileDescriptor,ModdedStartAddress, sizeof(ModdedStartAddress ) - 1);
// Set the Data Length to 1 Byte
Character = '3';
write(FileDescriptor, &Character, 1);
// Set the Read Count to 10000
write(FileDescriptor, "10000\r", sizeof("10000"));
return 10000;
}
При однократном запуске метод работает нормально и правильно выводит 10000 байт.
Однако для создания полного Flash-дампа указанный выше метод должен запускаться несколько раз с другим начальным адресом. Когда метод запускается несколько раз, последовательность для меню и т. Д. Не выполняется внутри подсказки, а выполняется, пока данные из памяти возвращаются устройством.
Обзор того, как работает меню, выглядит следующим образом:
Read Menu (Option R)
Start Address to Read
Data Length (Set to 3 for 1 Byte)
Read Count (Set to a maximum of 10000)
*The Router starts outputting a hex dump*
Back to Menu
Я пытаюсь выяснить, есть ли способ проверить, что все данные были отправлены с последовательного порта, чтобы повторно запустить метод.
Я использую библиотеку termios для соединения с последовательным портом.
Спасибо, Эндрю Борг
1 ответ
Я не уверен, что я правильно понял ваш вопрос, но я постараюсь попробовать.
Если вы запрашиваете конкретную длину / размер данных (счетчик чтения (опция меню)), поэтому, когда ваша программа перестает получать поток байтов, вы просто подсчитываете полученные вами байты и сравниваете их с количеством запрошенных вами байтов. для повторного считывания.
Надеюсь, я помогу, если я не прав, пожалуйста, дайте мне знать!;)