中级会员
 
- 积分
- 233
- 金钱
- 233
- 注册时间
- 2021-5-7
- 在线时间
- 102 小时
|
1金钱
核心代码如下
if(err==ERR_OK) //接收到数据
{
//printf("接收到不为空的数据");
LED0 = !LED0;
OS_ENTER_CRITICAL(); //关中断
memset(udp_demo_recvbuf,0,NET_RMEMO_MAXLEN); //数据接收缓冲区清零
for(q=recvbuf->p;q!=NULL;q=q->next) //遍历完整个pbuf链表
{
//判断要拷贝到UDP_DEMO_RX_BUFSIZE中的数据是否大于UDP_DEMO_RX_BUFSIZE的剩余空间,如果大于
//的话就只拷贝UDP_DEMO_RX_BUFSIZE中剩余长度的数据,否则的话就拷贝所有的数据
if(q->len > (NET_RMEMO_MAXLEN-data_len))
memcpy(udp_demo_recvbuf+data_len,q->payload,(NET_RMEMO_MAXLEN-data_len));//拷贝数据
else
memcpy(udp_demo_recvbuf+data_len,q->payload,q->len);
data_len += q->len;
//printf("data_len = %d",data_len);
//printf("q->len = %d",q->len);
//printf("buf长度:%d",strlen(udp_demo_recvbuf));
if(data_len > NET_RMEMO_MAXLEN) break; //超出UDP接收数组,跳出
}
OS_EXIT_CRITICAL(); //开中断
data_len=0; //复制完成后data_len要清零。
do
{
VS_Send_MusicData(udp_demo_recvbuf+n);
n+=32;
}
while(n<256);
n=0;
netbuf_delete(recvbuf);
}
从网络接收音频数据再传送给VS1053,结果能播放出音乐。
问题是我用软件查看了音乐文件的16进制形式,发现有00即空字符,我想如果把空字符传给udp_demo_recvbuf的话udp_demo_recvbuf后面就不会有数据了,因为字符串总是以'\0'作为结束符,那么会造成00后面的数据会被漏掉导致数据没有正确传输。但实际情况是能正常听到音乐,这是为什么?
|
最佳答案
查看完整内容[请看2#楼]
你提醒我了,我猜到应该是利用了数组越界,00后面并没有丢数据,那个函数使用数组下标来一个个传数据,越界访问
u8 VS_Send_MusicData(u8* buf)
{
u8 n;
if(VS_DQ!=0) //送数据给VS10XX
{
VS_XDCS=0;
for(n=0;n
|