从英特尔十六进制记录文件打印行

Printing Lines from Intel HEX Record File

提问人:Zantaros 提问时间:3/29/2019 最后编辑:Zantaros 更新时间:3/29/2019 访问量:406

问:

我正在尝试通过串行连接将英特尔十六进制文件的内容发送到微控制器,微控制器将处理发送的每一行,并根据需要将它们编程到内存中。处理代码期望在十六进制文件中显示行时发送,包括每行末尾的换行符。

此代码在 Windows 10 电脑上的 Visual Studio 2013 中运行;作为参考,微控制器是 ARM Cortex-M0+ 型号。

但是,以下代码似乎没有按照我预期的方式处理英特尔十六进制记录文件。

...
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 不是很有经验,所以我可能会忽略一些东西。

visual-c++ fstream iostream ifstream 十六进制文件

评论

0赞 PeterT 3/29/2019
您是否在与文件相同的目录中启动程序?
0赞 Zantaros 3/29/2019
该文件与代码存储在同一个文件夹中。我也刚刚尝试将文件与 .exe 一起存储在 Debug 文件夹中;那也行不通。
0赞 PeterT 3/29/2019
重要的是“当前工作目录”是什么。当您在资源管理器中双击时,它是 *.exe 文件的位置,如果您在 Visual Studio 中启动它,则默认情况下它是 vcxproj 文件的文件夹
0赞 Zantaros 3/29/2019
这奏效了。谢谢!

答:

0赞 PeterT 3/29/2019 #1

*.hex 文件包含非 ASCII 数据,很多时候在命令行终端上打印时可能会出现问题。

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

因此,请确保以 和 如果要打印十六进制字符的模式打开文件,printf 说明符为 or for char。binaryifstream hexfile("pdu.hex", ifstream::binary);%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;
        }
    }
}

评论

0赞 Zantaros 3/29/2019
这似乎并没有解决问题。请参阅编辑问题。
0赞 Zantaros 3/29/2019
不过,我可能会从中加入一些想法。谢谢!