stm32在sd卡上保存十六进制数
stm32 save hex number on sd card
我使用此代码将数据保存在 SD 卡上。它对字符很有用,但是当我想保存十六进制数字时,它的输出是不可取的。
FATFS myfatfs;
FIL myfile;
UINT my_biytes;
char my_data[1];
// or uint_8
char myfilename;
/* USER CODE BEGIN 2 */
f_mount(&myfatfs, SDPath ,1)
/* USER CODE END 2 */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
f_open (&myfile , "test2.txt" , FA_WRITE| FA_OPEN_ALWAYS );
data= 0x03;
sprintf(my_data, "%x",data);
// or sprintf(my_data, "%c",data);
f_lseek(&myfile, f_size(&myfile));
f_write(&myfile, my_data, sizeof(my_data), &my_biytes);
f_close(&myfile);
}
当我使用 %x 时,它保存了“3”,但我需要“03”。
当我使用 %c 时,它会保存“03”的 ascii 形式的“ETX”
如何在 sd 卡上的 txt 文件中正确保存十六进制数!!
当数据为 0x03 时,我希望在 my_data 中有 03;所以我应该写 %02x 然后两个数字 (03) 将进入 my_data 变量。
我应该这样定义 my_data 和 sprintf:
uint8_t my_data[2]
sprintf(my_data, "%02x",data);
首先,您写入文件的“my_data”数组长度为“1”。这意味着,你只写一个字符。 "0x03" 是 4 个字符。
其次,性格和价值观不一样。意思是,数字 3 与字符“3”不同。数字 3 是 0x03 或十六进制的 0x3(或者只是十六进制的 3,只要你知道它是十六进制的)或二进制的 0b00000011。所以当你将 0x03 写入文件时,你会得到 0x03 表示的 ascii 字符。如果接收方的某种软件可以读取该字符并将其简单地转换为 uint8_t,它将正确解释所有内容。你什么都不用做,完全没有问题。它不是 human-readable 0x03,因为在文件中 0x03 被视为和显示为一个字符,但接收程序很容易将其识别为整数。 0x03 值在那里,这只是一个解释问题。将该 char 视为 uint,您将获得您的价值。
或者,如果您真的想将整个字符串“0x03”写入文件(除非有充分的理由专门使用这种格式,否则在接收端投射传入数据几乎是一种处理能力的浪费更容易),你将不得不手动 assemble 这个字符串(字符数组)。您必须将数字 3 转换为字符“3”,手动将“0x0”附加到“3”,然后编写一个包含 4 个字符的数组。并且接收者仍然会将它视为字符的 arrach,您必须将其转换为十六进制数。发射端很头疼,接收端很头疼
只需像最初那样写“3”,并在可能的情况下在接收方将其解释(转换)为 uint8_t。
我使用此代码将数据保存在 SD 卡上。它对字符很有用,但是当我想保存十六进制数字时,它的输出是不可取的。
FATFS myfatfs;
FIL myfile;
UINT my_biytes;
char my_data[1];
// or uint_8
char myfilename;
/* USER CODE BEGIN 2 */
f_mount(&myfatfs, SDPath ,1)
/* USER CODE END 2 */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
f_open (&myfile , "test2.txt" , FA_WRITE| FA_OPEN_ALWAYS );
data= 0x03;
sprintf(my_data, "%x",data);
// or sprintf(my_data, "%c",data);
f_lseek(&myfile, f_size(&myfile));
f_write(&myfile, my_data, sizeof(my_data), &my_biytes);
f_close(&myfile);
}
当我使用 %x 时,它保存了“3”,但我需要“03”。
当我使用 %c 时,它会保存“03”的 ascii 形式的“ETX”
如何在 sd 卡上的 txt 文件中正确保存十六进制数!!
当数据为 0x03 时,我希望在 my_data 中有 03;所以我应该写 %02x 然后两个数字 (03) 将进入 my_data 变量。 我应该这样定义 my_data 和 sprintf:
uint8_t my_data[2]
sprintf(my_data, "%02x",data);
首先,您写入文件的“my_data”数组长度为“1”。这意味着,你只写一个字符。 "0x03" 是 4 个字符。
其次,性格和价值观不一样。意思是,数字 3 与字符“3”不同。数字 3 是 0x03 或十六进制的 0x3(或者只是十六进制的 3,只要你知道它是十六进制的)或二进制的 0b00000011。所以当你将 0x03 写入文件时,你会得到 0x03 表示的 ascii 字符。如果接收方的某种软件可以读取该字符并将其简单地转换为 uint8_t,它将正确解释所有内容。你什么都不用做,完全没有问题。它不是 human-readable 0x03,因为在文件中 0x03 被视为和显示为一个字符,但接收程序很容易将其识别为整数。 0x03 值在那里,这只是一个解释问题。将该 char 视为 uint,您将获得您的价值。
或者,如果您真的想将整个字符串“0x03”写入文件(除非有充分的理由专门使用这种格式,否则在接收端投射传入数据几乎是一种处理能力的浪费更容易),你将不得不手动 assemble 这个字符串(字符数组)。您必须将数字 3 转换为字符“3”,手动将“0x0”附加到“3”,然后编写一个包含 4 个字符的数组。并且接收者仍然会将它视为字符的 arrach,您必须将其转换为十六进制数。发射端很头疼,接收端很头疼
只需像最初那样写“3”,并在可能的情况下在接收方将其解释(转换)为 uint8_t。