【发布时间】:2019-08-23 12:37:59
【问题描述】:
我正在为 PIC 18F45K42 编写代码以从 HCSD 卡中读取 .wav 文件。我正在使用 MPLAB X IDE v5.20 和 XC v2.05。我正在使用 FATF 库从卡上读取数据。
我可以从卡上读取数据并获得良好的结果,直到合并代表 .wav 文件大小的 4 个字节。
#define BYTE_TO_BINARY_PATTERN "%c%c%c%c%c%c%c%c"
#define BYTE_TO_BINARY(byte) \
(byte & 0x80 ? '1' : '0'), \
(byte & 0x40 ? '1' : '0'), \
(byte & 0x20 ? '1' : '0'), \
(byte & 0x10 ? '1' : '0'), \
(byte & 0x08 ? '1' : '0'), \
(byte & 0x04 ? '1' : '0'), \
(byte & 0x02 ? '1' : '0'), \
(byte & 0x01 ? '1' : '0')
UINT actualLength;
UINT br;
char contents[44]; // Buffer
uint32_t file_size;
char result;
printf("Checking media\n\r");
if( SD_SPI_IsMediaPresent() == false)
{
printf("No media\n\r");
return;
}
if (f_mount(&drive,"0:",1) == FR_OK)
{
if (f_open(&file, "P.WAV", FA_READ) == FR_OK){
result = f_read(&file, contents, 44, &br);
if ( result == FR_OK){
printf("%c%c%c%c", contents[0],contents[1],contents[2],contents[3]);
printf("\n\r");
printf("contents 4-7: %u %u %u %u", contents[4],contents[5],contents[6],contents[7]);
printf("\n\r");
printf(""BYTE_TO_BINARY_PATTERN, BYTE_TO_BINARY(contents[7]));
printf(""BYTE_TO_BINARY_PATTERN, BYTE_TO_BINARY(contents[6]));
printf(""BYTE_TO_BINARY_PATTERN, BYTE_TO_BINARY(contents[5]));
printf(""BYTE_TO_BINARY_PATTERN, BYTE_TO_BINARY(contents[4]));
file_size = (contents[7] << 24) | (contents[6] << 16) | (contents[5] << 8) | contents[4];
int kb = file_size/1024;
printf("\n\r");
printf("Size: %u kB: %u", file_size, kb);
printf("\n\r");
// . . . OMITTED . . .
我正在打印二进制文件以确保从卡上写入的数据是正确的。我得到的输出是
Checking media
RIFF
contents 4-7: 4 122 18 0
00000000000100100111101000000100
Size: 31254 kB: 0
该二进制文件为我提供了文件大小的正确数字 1210884,因此我尝试通过组合字节获得的大小是错误的。我认为这是因为我收到以下编译器警告:
main.c:108:42: warning: shift count >= width of type [-Wshift-count-overflow]
file_size = (contents[7] << 24) | (contents[6] << 16) | (contents[5] << 8) | contents[4];
^ ~~
main.c:108:64: warning: shift count >= width of type [-Wshift-count-overflow]
file_size = (contents[7] << 24) | (contents[6] << 16) | (contents[5] << 8) | contents[4];
我已经搜索了这些警告并尝试了一些推荐的修复方法,但到目前为止我还没有找到任何适用于这种情况的方法。我赶紧补充说我的 C 知识是有限的,而且我不能 100% 确定那个位移表达式在做什么。我天真的理解是contents[7] 的最右边位应该移动到 32 位整数的第 24 位,contents[6] 最右边的位到第 16 位等等。不知何故,可能是由于某种数据类型问题,这不会发生适当地。但我当然不知道,我不确定 Microchip XC 编译器有什么限制。
没有建议我最终在 C 中学习一门好课程,有人可以建议出了什么问题以及如何通过正确组装 4 个文件大小字节来获得正确的值。
非常感谢您的关注。
【问题讨论】:
-
伦丁,没错。纯粹的黑客行为。我并不是要发布包含
(unit32_t)s 的代码,我只是在编辑帖子以删除它们,然后有几个非常快速的响应。 -
嗯,这似乎是错误,所以...?
-
这样做 'file_size = ((unint32_t) contents[7]
标签: c embedded wav microchip pic18