Печать строк из файла записи Intel HEX - PullRequest
0 голосов
/ 28 марта 2019

Я пытаюсь отправить содержимое файла Intel Hex по последовательному соединению на микроконтроллер, который будет обрабатывать каждую отправленную строку и программировать их в памяти по мере необходимости.Код обработки ожидает отправки строк по мере их появления в шестнадцатеричном файле, включая символы новой строки в конце каждой строки.

Этот код выполняется в Visual Studio 2013 на ПК с Windows 10;для справки, микроконтроллер представляет собой модель ARM Cortex-M0 +.

Однако следующий код, похоже, не обрабатывает файл записей Intel Hex так, как я ожидал.

...
int count = 0;
char hexchar;
unsigned char Buffer[69]; // 69 is max ascii hex read length for microcontroller
ifstream hexfile("pdu.hex");
while (hexfile.get(hexchar))
{
    Buffer[count] = hexchar;
    count++;
    if (hexchar == '\n')
    {
        for (int i = 0; i < count; i++)
        {
            printf("%c", Buffer[i]); 
        }
        serial_tx_function(Buffer); // microcontroller requires unsigned char
        count = 0;
    }
}
...

В настоящее время вызов последовательной передачи закомментирован, и цикл for предназначен для проверки правильности чтения файла.Я ожидаю увидеть каждую строку шестнадцатеричного файла, распечатанного на терминал.Вместо этого я ничего не получаю.Любые идеи?

РЕДАКТИРОВАТЬ: После дальнейшего исследования я определил, что программа даже не входит в цикл while, потому что файл не открывается.Я не знаю, почему это так, поскольку файл существует и может быть открыт в других программах, таких как Блокнот.Однако я не очень разбираюсь с файловым вводом / выводом, поэтому я могу что-то упустить.

1 Ответ

0 голосов
/ 29 марта 2019

*. Шестнадцатеричные файлы содержат не-ascii данные, которые часто могут вызывать проблемы при печати на терминалах командной строки.

Я бы просто сказал, что вы должны попытаться открыть файл в двоичном виде и распечатать символы в виде шестнадцатеричных чисел.

Поэтому убедитесь, что вы открываете файл в режиме binary с помощью ifstream hexfile("pdu.hex", ifstream::binary);, и если вы хотите напечатать шестнадцатеричные символы, спецификатор printf будет %x или %hhx для символа.

Вся программа будет выглядеть примерно так:

#include <iostream>
#include <fstream>
#include <cassert>

int main()
{
    using namespace std;
    int count = 0;
    char hexchar;
    constexpr int MAX_LINE_LENGTH = 69;
    unsigned char Buffer[MAX_LINE_LENGTH]; // 69 is max ascii hex read length for microcontroller
    ifstream hexfile("pdu.hex",ios::binary);
    while (hexfile.get(hexchar))
    {
        assert(count < MAX_LINE_LENGTH);
        Buffer[count] = hexchar;
        count++;
        if (hexchar == '\n')
        {
            for (int i = 0; i < count; i++)
            {
                printf("%hhx ", Buffer[i]);
            }
            printf("\n");
            //serial_tx_function(Buffer); // microcontroller requires unsigned char
            count = 0;
        }
    }
}
...