我正在创建一个转储路由器闪存的应用程序(类似于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库来连接串行端口。
谢谢,安德鲁·博格
发布于 2014-02-10 16:49:05
我不确定你的问题是否正确,但我会试一试。
如果您请求特定长度/大小的数据(读取计数(菜单选项) ),那么当您的程序停止获取字节流时,您只需计算您的程序获得的字节数,并将其与您再次请求的字节数进行比较。
希望我能帮上忙,如果我错了,请让我知道!;)
https://stackoverflow.com/questions/21671508
复制相似问题