从英特尔HEX记录文件打印行

时间:2019-03-28 18:21:07

标签: visual-c++ fstream iostream ifstream hex-file

我正在尝试通过串行连接将Intel Hex文件的内容发送到微控制器,该微控制器将处理发送的每一行,并根据需要将它们编程到内存中。处理代码希望这些行按其在Hex文件中出现的样子发送,包括每行末尾的换行符。

此代码正在Windows 10 PC上的Visual Studio 2013中运行;供参考,该微控制器是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循环,因为该文件无法打开。我不知道为什么会这样,因为该文件存在并且可以在其他程序(如记事本)中打开。但是,我对文件I / O的经验还不是很丰富,所以我可能会忽略某些东西。

1 个答案:

答案 0 :(得分:0)

*。hex文件很多时候都包含非ascii数据,这些问题可能会在命令行终端上打印出来。

我只是想说您应该尝试以二进制格式打开文件,并将字符打印为十六进制数字。

因此,请确保使用binaryifstream hexfile("pdu.hex", ifstream::binary);模式打开文件,如果要打印十六进制字符,则char的printf指定符为%x%hhx。 / p>

整个程序如下所示:

#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;
        }
    }
}