以头发多少判功力 2020-06-24 10:31 采纳率: 0%
浏览 199
已采纳

C语言:通过串口(TX,RX)发送歌曲名给MCU,歌曲名格式是utf8,中、英文如何解析,以什么格式发给MCU呢?

感谢回答!

MCU要求以下面的格式发:
比如歌曲名是CD1,那发送0x43 0x44 0x31。
那就是要以ASCII 十六进制发给MCU吧?

//底层只给了以下结构体,char *name 是歌曲名

typedef struct GetFileNameEvtTag {
  ....
    char *name; //USB 歌曲名(utf8 格式)
    int num; //曲目号
} GetFileNameEvt;

//调用

GetFileNameEvt *pe = (GetFileNameEvt *)e;
UINT16 name_len =  strlen(pe->name);
printf(" song name %s,len %d\n",pe->name,name_len); 

//U盘里面的歌曲名是“CD1.mp3”,这里打印pe->name 也是"CD1.mp3",说明这样调用是对的。

把歌曲名改为CD1我.mp3,打印pe->name出来是"CD1鎴mp3",有中文时打印出来就不正确。

问题:

1.歌曲名有中、英文,怎么打印才能正常?

2.歌曲名有中、英文,怎么以ASCII 十六进制发给MCU?或者以怎么格式发给MCU(MCU收到后又怎么解析)。

  • 写回答

2条回答 默认 最新

  • 人在旅途QvQ 2020-06-24 12:04
    关注

    一. 首先你的歌曲名是从哪获取的,如果是从MP3 Tag中读取的,应该会读取到编码。GB18030,UTF8?等等
    二. CD1.mp3是正常的,然后“CD1我.mp3”就异常了。可能是你输出语句不支持uft编码,或者你的串口工具不支持,可以使用“teraterm-4.97.exe”工具试试。
    三. 建议将“CD1我.mp3”使用%x方式输出,看看,反推一下。

    问题一:请参考上述2。
    问题二:如果有中文,就不可能使用ascii,毕竟ascii只有256个,不包括中文。
    想要发送中文给MCU,就要约定中文编码,比如uft8,或者gb2312。

    CD1我.mp3 的 uft8编码 43.44.31.E6.88.91.2E.6D.70.33

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    typedef struct GetFileNameEvtTag {
        char *name; //USB 歌曲名(utf8 格式)
        int num; //曲目号
    } GetFileNameEvt;
    
    char *DeleteUTF8(const char *name)
    {
        char   *tempName = NULL;
        unsigned int    Trgloop = 0;
    
        if(NULL != name)
        {
            tempName = (char *)malloc(strlen(name));
    
            printf(" DeleteUTF8 name [%s] len [%d] \n",name,strlen(name));
    
            if(NULL != tempName)
            {
                while((*name) != 0x00)
                {
                    if(((*name) < 128) && ((*name) > 0))
                    {
                        printf(" %x \n",(*name));
                        memcpy(tempName+Trgloop,name,0x01);
                        Trgloop++;
                    }
                    name++;
                }
    
                memset(tempName+Trgloop,0x00,0x01);
            }
        }
    
        return tempName;
    }
    
    int main (void)
    {
        char *TrgName = NULL;
    
        //test code start
        GetFileNameEvt pe;
        char testname[50] = "cd你ccc我.mp3";
    
        pe.name = (char *)malloc(50);
        memset(pe.name,0x00,50);
        memcpy(pe.name,testname,strlen(testname));
        //test code end 
    
        TrgName = DeleteUTF8(pe.name);
        char name_len = (char)strlen(TrgName);
        printf(" song name [%s] len [%d] \n",TrgName,name_len); 
    
        return 0;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 解决一个加好友限制问题 或者有好的方案
  • ¥15 关于#java#的问题,请各位专家解答!
  • ¥15 急matlab编程仿真二阶震荡系统
  • ¥20 TEC-9的数据通路实验
  • ¥15 ue5 .3之前好好的现在只要是激活关卡就会崩溃
  • ¥50 MATLAB实现圆柱体容器内球形颗粒堆积
  • ¥15 python如何将动态的多个子列表,拼接后进行集合的交集
  • ¥20 vitis-ai量化基于pytorch框架下的yolov5模型
  • ¥15 如何实现H5在QQ平台上的二次分享卡片效果?
  • ¥30 求解达问题(有红包)