我正在尝试通过串行连接将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并不十分熟练,所以我可能会忽略一些东西。
* .hex文件包含非ascii数据,很多时候可能会在命令行终端上打印出问题。
我只想说你应该尝试将文件作为二进制文件打开并将字符打印为十六进制数字。
因此,请确保使用binary
以ifstream hexfile("pdu.hex", ifstream::binary);
模式打开文件,如果要打印十六进制字符,则printf说明符为%x
或%hhx
表示char。
整个程序看起来像这样:
#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;
}
}
}