OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5129|回复: 9

连续的GBK内码怎么取出相应字节转换成汉字

[复制链接]

1

主题

4

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2019-4-11
在线时间
8 小时
发表于 2019-4-11 22:54:27 | 显示全部楼层 |阅读模式
1金钱
我在做通过蓝牙与手机APP的通信,在蓝牙的例程中,USART3_RX_BUF接收到的是一连串的GBK内码,如0xcf0xe30xbd0xb6....,请问该如何取出相应字节,在LCD上显示出来汉字呢

最佳答案

查看完整内容[请看2#楼]

谢谢原子哥,已经解决了,用sscanf这个函数 sscanf("0xcf","%i",&MY_Buffer[0]); sscanf("0xe3","%i",&MY_Buffer[1]); Show_Str(30,280,200,16,MY_Buffer,16,0);
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2019-4-11
在线时间
8 小时
 楼主| 发表于 2019-4-11 22:54:28 | 显示全部楼层
正点原子 发表于 2019-4-17 02:06
你直接看buf里面的内容。

谢谢原子哥,已经解决了,用sscanf这个函数
sscanf("0xcf","%i",&MY_Buffer[0]);
        sscanf("0xe3","%i",&MY_Buffer[1]);

        Show_Str(30,280,200,16,MY_Buffer,16,0);
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2019-4-13 02:24:35 | 显示全部楼层
自己写个简单的提取代码,实现即可。但是建议你先搞懂我们的汉字显示实验。
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2019-4-11
在线时间
8 小时
 楼主| 发表于 2019-4-14 21:09:48 | 显示全部楼层
正点原子 发表于 2019-4-13 02:24
自己写个简单的提取代码,实现即可。但是建议你先搞懂我们的汉字显示实验。

原子哥,这个汉字的显示我基本搞懂了,
                my_hz[0]=0xcf;
                my_hz[1]=0xe3;
                my_hz[2]=0xbd;
                my_hz[3]=0xb6;
                my_hz[4]=0x00;
                my_hz[5]=0x00;
                Show_Str(30,110,200,16,my_hz,16,0);
像这样就能显示了,但我的C基础有点差,从网上查了很久还是不会提取。该怎么从USART3_RX_BUF的数组里依次提取出四个字符,然后拼成这种GBK内码字符串呢。原子哥,您能给我一个思路吗
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2019-4-15 01:51:23 | 显示全部楼层
爝火 发表于 2019-4-14 21:09
原子哥,这个汉字的显示我基本搞懂了,
                my_hz[0]=0xcf;
                my_hz[1]=0xe3;

如果USART3_RX_BUF接收到的全部是GBK码,则直接传送给Sshow_str函数,即可正常显示
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2019-4-11
在线时间
8 小时
 楼主| 发表于 2019-4-16 09:54:35 | 显示全部楼层
本帖最后由 爝火 于 2019-4-16 11:50 编辑
正点原子 发表于 2019-4-15 01:51
如果USART3_RX_BUF接收到的全部是GBK码,则直接传送给Sshow_str函数,即可正常显示

抱歉原子哥,我之前的描述有误,蓝牙传过来的是ASCII字符串
APP那边输入“香蕉”二字,蓝牙串口这边收到“0xcf0xe30xbd0xb6”的字符串

就比如u8 TXBuffer[16]="0xcf0xe30xbd0xb6";
调用   Show_Str(30,280,200,16,TXBuffer,16,0);
就只能显示0xcf0xe30xbd0xb6
但如果u8 TXBuffer[4]={0xcf,0xe3,0xbd,0xb6};
就可以显示汉字

怎么把字符串“0xcf”变成16进制的数0xcf呢


回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2019-4-17 02:06:34 | 显示全部楼层
爝火 发表于 2019-4-16 09:54
抱歉原子哥,我之前的描述有误,蓝牙传过来的是ASCII字符串
APP那边输入“香蕉”二字,蓝牙串口这边收到 ...

你直接看buf里面的内容。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2019-4-18
在线时间
0 小时
发表于 2019-4-18 20:37:33 | 显示全部楼层
学到了
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2019-7-30
在线时间
11 小时
发表于 2019-10-6 10:56:43 | 显示全部楼层
你写的蓝牙接收app发来数据的代码可不可以给我看一下下?
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2019-7-30
在线时间
11 小时
发表于 2019-10-6 11:00:58 | 显示全部楼层
本帖最后由 xiyan2015 于 2019-10-6 11:02 编辑
正点原子 发表于 2019-4-13 02:24
自己写个简单的提取代码,实现即可。但是建议你先搞懂我们的汉字显示实验。

原子哥,我这个代码接收蓝牙串口发来的汉字用lcd显示之后是乱码(数字和字母可以显示),我看了好久都没有头绪,可以帮帮我吗?
else if(key==KEY1_PRES)      //切换模块主从设置
          {
      key=HC05_Get_Role();                   //返回值:0,从机;1,主机;0XFF,获取失败.
   if(key!=0XFF)
             {
    key=!key;       //状态取反   
    if(key==0)HC05_Set_Cmd("AT+ROLE=0");
    else HC05_Set_Cmd("AT+ROLE=1");
    HC05_Role_Show();
    HC05_Set_Cmd("AT+RESET"); //复位ATK-HC05模块
    delay_ms(200);
    }
        }
    else if(key==KEY0_PRES)
    {
   sendmask=!sendmask;    //发送/停止发送   
   if(sendmask==0)LCD_Fill(30+40,170,240,160+16,WHITE);//清除显示
    }else delay_ms(10);
         
   if(sendmask)     //定时发送
   {
    sprintf((char*)sendbuf," %d s\r\n",time);
         LCD_ShowString(30+40,170,200,16,16,sendbuf); //显示发送数据
    u3_printf(" %d\r\n",time);  //发送到蓝牙模块
//   u3_printf((char*)sendbuf);
   }
   HC05_Sta_Show();     
   t=0;
   LED0=!LED0;      
     
  if(USART3_RX_STA & 0X8000)   //接收到一次数据了
  {
   LCD_Fill(30,210,240,320,WHITE); //清除显示
    reclen=USART3_RX_STA & 0X7FFF; //得到数据长度
     USART3_RX_BUF[reclen]=0;   //加入结束符
   if(reclen==9||reclen==8)   //控制DS1检测
   {
    if(strcmp((const char*)USART3_RX_BUF,"+LED1 ON")==0)LED1=0; //打开LED1
    if(strcmp((const char*)USART3_RX_BUF,"+LED1 OFF")==0)LED1=1;//关闭LED1
   }
//   LCD_ShowString(30,210,209,119,16,USART3_RX_BUF);//显示接收到的数据
   Show_Str(30,210,200,16,USART3_RX_BUF,16,0);
    USART3_RX_STA=0;  
  }            


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 15:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表