我正在尝试使用12位分辨率的ADC录制音频,获取采样缓冲区并通过CAN FD将其发送到另一个设备,该设备对该音频进行采样并创建.wav
并播放。问题是,我看到麦克风的数据通过CAN FD发送到其他设备,但我无法正确地将这些数据转换为CCD_ 2文件,也无法通过麦克风听到我说的话。我只听到哔哔声。
我正在每4条CAN FD消息创建一个新的.wav
,以便进行某种实时通信并减少延迟,但我认为这是不可能的,或者如果我认为正确的话。
在这个线程中,我接收CAN FD发送的消息,并将其连接到缓冲区中,以便将其引入.wav
文件中。我尝试过更大的缓冲,但这不会改变结果。我如何才能从CAN FD中获取数据并听到它?
澄清:我知道使用CAN FD传输音频不是正确的方式,但这是一个主项目。
struct canfd_frame frame;
CAN_MSG msg;
int trama_can[72];
int nbytes;
while (status_libreria == 0)
;
unsigned char buffer[256];
// FILE * fPtr;
int i=0,x=0;
//fPtr = fopen("Test.txt", "w");
while (1) {
do {
nbytes = read(s, &frame, sizeof(struct canfd_frame));
} while (nbytes == 0);
msg.id.ext = frame.can_id;
msg.dlc = frame.len;
if (msg.dlc > 8)
msg.dlc = 8; //Protecci�n hasta adaptar AC3LIB a CANFD
Numas_memcpy(&(msg.data.bdata), &(frame.data), msg.dlc);
can_frame_2_ac3lib(&msg, BUS_VERTICAL);
for(x=0;x<64;x++) buffer[i*64+x] = frame.data[x];
printf("%d rn",frame.data[x]);
printf("i:%d rn",i);
// Copiar datos a fichero.wav y reproducirlo simultaneamente
if (i == 3) {
printf("Datos INrn");
write_wav("prueba.wav",256 , (short int *)buffer, 16000);
//fwrite(buffer,1,sizeof(buffer),fPtr);
//fclose(fPtr);
system("aplay prueba.wav -f cd");
i = 0;
system("rm prueba.wav");
}
i++;
}
正在记录的音频文件的32个第一字节
如图所示,数据正在被记录。此外,这个数据与ADC中的数据相同,但当我播放它时,我只听到噪音。
首先简化问题。确保您可以先以低速率将已知数据从一端传输到另一端。我相信下面的建议听起来太琐碎了。但是,在你完全有信心理解这一切之前,我预测你会有很多挣扎。
缓慢-每秒一帧,甚至更慢。
- 学会将一个0x55字节从一端发送到另一端,并在接收器处进行验证
- 学会在一帧中发送几个0x55并进行验证
- 学习发送0x12345678-验证它在另一端的字节顺序是否正确
- 学会发送计数器。检查接收器,确保没有丢失任何数据
现在再做一遍,但速度要快10倍。
继续,直到您可以以音频所需速率的10倍发送计数器,而不会丢弃任何帧,持续几分钟,然后持续几个小时。
给系统的其他部分施加压力,以确保它在压力下仍然工作。
只有现在,你才能开始学习发送音频。
相信我,你会学到很多的!