我有一个我认为简单的问题,但不幸的是我无法自己找到解决方案。
我在.txt文件中有一个带有十六进制数据的数组(例如0x01 0x02 [...]),并希望将此数据用于另一个函数。 目的是,除了不改变静态值并向ECU发送请求之外,还要使用数组的某些部分(在此示例中为数组100)。
当我从文件中读取带有fileGetString的数据并将其打印到控制台时,它会没问题(如0x01 0x02等等)。
当我尝试将它用于下面看到的功能时,它不会采用正确的十六进制值(例如StringLongWrite [100] = 0xFF),但在跟踪数据中只使用" 30"。
因此,对于以下示例,所发送的请求将是11 12 13 30而不是11 12 13 FF。
有没有一种简单的方法可以解决这个问题? (最初我得到了我想用格式编写的数据" 01 02 03 ... FF ..."在.txt文件中并且已将其转换为" 0x01 0x02 0x03 ... 0xFF ..."数据,以防第一个数据类型更易于使用...)
非常感谢和问候罗伯特
case 1: /* write memory */
if(something);
glbHandleWrite = openFileRead ("test.txt",0);
if (glbHandleWrite != 0 && fileGetString(StringLongWrite, elcount(StringLongWrite), glbHandleWrite) != 0)
{
SendReq[0] = 0x11;
SendReq[1] = 0x12;
SendReq[2] = 0x13;
SendReq[3] = StringLongWrite[100];
SendRequest(ServicePhys, 4);
setTimer( TimeOutTimer, TimeOutLong);
write ("data %s", StringLongWrite);
break;
}
else write("Data file cannot be opened ");
答案 0 :(得分:2)
0x30
是字符'0'
的ASCII码。
您需要将字符串"0x30"
转换为数字,例如。使用strtol()
:
on start
{
message 0x123 msg;
char StringLongWrite[32] = "0x01 0x02 0x03";
long data[2];
dword pos = 0;
pos = strtol(StringLongWrite, pos, data[0]);
pos = strtol(StringLongWrite, pos, data[1]);
pos = strtol(StringLongWrite, pos, data[2]);
write("0x%02x,0x%02x,0x%02x", data[0], data[1], data[2]);
msg.dlc = 8;
msg.byte(0) = 0x42;
msg.byte(1) = data[0];
msg.byte(2) = data[1];
msg.byte(3) = data[2];
output(msg);
}