OpenEdv-开源电子网

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

keil mdk 5.24 用printf输出中文乱码

[复制链接]

19

主题

171

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
494
金钱
494
注册时间
2018-9-3
在线时间
50 小时
发表于 2018-9-3 15:31:03 | 显示全部楼层 |阅读模式
1金钱
用printf输出中文后显示的是乱码,经过试验得知,比如直接输入今天 用printf输出,然后用串口调试助手查看数据,得到的数据为乱码,查看乱码的根源也就是发过来的16进制数据,得知数据为3位一个汉字,ASCII的编码格式是两位16进制表示一个汉字,由此得知发过来的数据为utf8的格式,在串口调试助手得到的数据转换的过程中发生了错误,怎么才能直接发过去的数据是ASCII的格式呢?

NRO2$G(M2PM]`}R1IHUWS~J.png
U2CL7U}HIRV5[XW3M_NCO5J.png
ZJ1DW@DGXE~XSBT52]J5NGU.png
$~V)(V}AF8B442BA9FB{VIW.png
8NPR%M)JR()OH{F81Y7~]7A.png

最佳答案

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

设置好KEIL编码方式,然后新建个.c文件,把原来的里面的内容复制进来。 或者用ultraedit 把文件编码格式改为ANSI/ASCII,文件格式不能是UTF-8。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

19

主题

171

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
494
金钱
494
注册时间
2018-9-3
在线时间
50 小时
 楼主| 发表于 2018-9-3 15:31:04 | 显示全部楼层
设置好KEIL编码方式,然后新建个.c文件,把原来的里面的内容复制进来。
或者用ultraedit 把文件编码格式改为ANSI/ASCII,文件格式不能是UTF-8。
回复

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
发表于 2018-9-3 16:09:56 | 显示全部楼层
帮顶

回复

使用道具 举报

19

主题

171

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
494
金钱
494
注册时间
2018-9-3
在线时间
50 小时
 楼主| 发表于 2018-9-3 16:14:41 | 显示全部楼层
_sys_exit(int x) 添加引用后main.c(23): error:  #260-D: explicit type is missing ("int" assumed)报错怎么办
回复

使用道具 举报

19

主题

171

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
494
金钱
494
注册时间
2018-9-3
在线时间
50 小时
 楼主| 发表于 2018-9-3 16:15:23 | 显示全部楼层
_sys_exit(int x) 添加引用后main.c(23): error:  #260-D: explicit type is missing ("int" assumed)报错怎么办
回复

使用道具 举报

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
发表于 2018-9-3 17:13:40 | 显示全部楼层
凌凌漆 发表于 2018-9-3 16:15
_sys_exit(int x) 添加引用后main.c(23): error:  #260-D: explicit type is missing ("int" assumed)报错 ...

函数前添加void
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-9-4 01:56:26 | 显示全部楼层
试试用我们的例程,另外用我们的串口调试助手
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

19

主题

171

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
494
金钱
494
注册时间
2018-9-3
在线时间
50 小时
 楼主| 发表于 2018-9-4 09:02:34 | 显示全部楼层
正点原子 发表于 2018-9-4 01:56
试试用我们的例程,另外用我们的串口调试助手

用你们的例程没有问题,但是有的地方字也会出现乱码的现象,而且你们的例程如果合并到一个main里就会出现编码错误
回复

使用道具 举报

19

主题

171

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
494
金钱
494
注册时间
2018-9-3
在线时间
50 小时
 楼主| 发表于 2018-9-4 09:02:55 | 显示全部楼层

加了是不会报错 了,可是处理起来还是有问题
回复

使用道具 举报

19

主题

171

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
494
金钱
494
注册时间
2018-9-3
在线时间
50 小时
 楼主| 发表于 2018-9-4 09:05:54 | 显示全部楼层
正点原子 发表于 2018-9-4 01:56
试试用我们的例程,另外用我们的串口调试助手

#include "stm32f10x.h"
#include "stdio.h"
#include "delay.h"
#include "sys.h"




//加入以下代码,支持printf函数,而不需要选择use MicroLIB          
#if 1
#pragma import(__use_no_semihosting)            
//标准库需要的支持函数                 
struct __FILE
{
        int handle;

};

FILE __stdout;      
//定义_sys_exit()以避免使用半主机模式   
void _sys_exit(int x)
{
        x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{      
        while((USART2->SR&0X40)==0);//循环发送,直到发送完毕   
    USART2->DR = (u8) ch;      
        return ch;
}
#endif



//int fputc(int ch, FILE *f)
//{

//       
//        USART_SendData(USART2,ch);
//        while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET)
//        {
//               
//        }
//       
//  return ch;
//}


void My_USART2_Init(void)
{

       
        GPIO_InitTypeDef GPIO_InitStrue;
        USART_InitTypeDef USART_InitStrue;
        NVIC_InitTypeDef NVIC_InitStrue;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
       
        GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;
        GPIO_InitStrue.GPIO_Pin=GPIO_Pin_2;
        GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;
  GPIO_Init(GPIOA,&GPIO_InitStrue);
       
        GPIO_InitStrue.GPIO_Mode=GPIO_Mode_IN_FLOATING;
        GPIO_InitStrue.GPIO_Pin=GPIO_Pin_3;
        GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;
  GPIO_Init(GPIOA,&GPIO_InitStrue);
       
       
        USART_InitStrue.USART_BaudRate=9600;
        USART_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
        USART_InitStrue.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;
        USART_InitStrue.USART_Parity=USART_Parity_No;
        USART_InitStrue.USART_StopBits=USART_StopBits_1;
        USART_InitStrue.USART_WordLength=USART_WordLength_8b;
       
        USART_Init(USART2,&USART_InitStrue);
        USART_Cmd(USART2,ENABLE);
        USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);
       
       
        NVIC_InitStrue.NVIC_IRQChannel=USART2_IRQn;
        NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE;
        NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=1;
        NVIC_InitStrue.NVIC_IRQChannelSubPriority=1;
        NVIC_Init(&NVIC_InitStrue);
       
       
}

void USART2_IRQHandler(void)
{
        u8 Res;
         if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
                {
                Res =USART_ReceiveData(USART2);       
//                        Res++;
                USART_SendData(USART2, Res);
                       
     }
}
  
int main(void)
{

         
                        delay_init();                               
                        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
                        My_USART2_Init();
       
   
       
              while(1)
              {
                                                               
                                                printf("今天");
                                               
                                                        delay_ms(10);   
                                                                               
               
                }
               
       
}
  这个是你们的例程的程序,显示就会报错
回复

使用道具 举报

29

主题

338

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1181
金钱
1181
注册时间
2018-4-13
在线时间
170 小时
发表于 2018-9-4 10:10:47 | 显示全部楼层
可能是用的串口助手本身支持的中文编码就非utf-8。我们使用的xcom就是这样的。
如果串口助手没有编码设置功能就只能按支持的编码发送,所以还是把程序文件先转换为支持的编码才可以。
比如转换为GB18030编码。
回复

使用道具 举报

19

主题

171

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
494
金钱
494
注册时间
2018-9-3
在线时间
50 小时
 楼主| 发表于 2018-9-4 11:02:18 | 显示全部楼层
xiatianyun 发表于 2018-9-4 10:10
可能是用的串口助手本身支持的中文编码就非utf-8。我们使用的xcom就是这样的。
如果串口助手没有编码设置 ...

很奇怪的一点是,原子的例程就可以发送中文,而且不会有乱码,自己写的就不行
回复

使用道具 举报

29

主题

338

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1181
金钱
1181
注册时间
2018-4-13
在线时间
170 小时
发表于 2018-9-4 18:50:23 | 显示全部楼层
凌凌漆 发表于 2018-9-4 11:02
很奇怪的一点是,原子的例程就可以发送中文,而且不会有乱码,自己写的就不行

你用记事本打开文件看看是什么编码就可以看出来了。
回复

使用道具 举报

19

主题

171

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
494
金钱
494
注册时间
2018-9-3
在线时间
50 小时
 楼主| 发表于 2018-9-5 08:27:13 | 显示全部楼层
xiatianyun 发表于 2018-9-4 18:50
你用记事本打开文件看看是什么编码就可以看出来了。

记事本怎么看啊?
回复

使用道具 举报

19

主题

171

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
494
金钱
494
注册时间
2018-9-3
在线时间
50 小时
 楼主| 发表于 2018-9-5 09:24:54 | 显示全部楼层
还是不懂啊,到底咋办啊
回复

使用道具 举报

4

主题

380

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3088
金钱
3088
注册时间
2015-10-17
在线时间
320 小时
发表于 2018-9-5 09:35:48 | 显示全部楼层
keil支持中文吗?printf支持中文吗?串口工具支持中文吗?
个人认为将汉字转成编码,发送端发送编码值,接收端对应的编码显示就ok了。
我自己就这么干的
回复

使用道具 举报

19

主题

171

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
494
金钱
494
注册时间
2018-9-3
在线时间
50 小时
 楼主| 发表于 2018-9-5 09:37:07 | 显示全部楼层
hgr211 发表于 2018-9-5 09:35
keil支持中文吗?printf支持中文吗?串口工具支持中文吗?
个人认为将汉字转成编码,发送端发送编码值,接 ...

不会转换啊,汉字怎么变啊
回复

使用道具 举报

4

主题

380

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3088
金钱
3088
注册时间
2015-10-17
在线时间
320 小时
发表于 2018-9-5 10:34:36 | 显示全部楼层
百度......,相信我,靠自己是唯一的出路。
回复

使用道具 举报

19

主题

171

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
494
金钱
494
注册时间
2018-9-3
在线时间
50 小时
 楼主| 发表于 2018-9-5 10:36:30 | 显示全部楼层
hgr211 发表于 2018-9-5 10:34
百度......,相信我,靠自己是唯一的出路。

谢谢你浪费时间恢复我啊
回复

使用道具 举报

9

主题

165

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
251
金钱
251
注册时间
2018-4-6
在线时间
31 小时
发表于 2018-9-5 11:40:59 | 显示全部楼层
hgr211 发表于 2018-9-5 10:34
百度......,相信我,靠自己是唯一的出路。

厉害了
回复

使用道具 举报

29

主题

338

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1181
金钱
1181
注册时间
2018-4-13
在线时间
170 小时
发表于 2018-9-5 13:07:51 | 显示全部楼层
对,先百度了解下文字编码是怎么回事。
回复

使用道具 举报

19

主题

171

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
494
金钱
494
注册时间
2018-9-3
在线时间
50 小时
 楼主| 发表于 2018-9-5 17:19:31 | 显示全部楼层
设置好KEIL编码方式,然后新建个.c文件,把原来的里面的内容复制进来。
或者用ultraedit 把文件编码格式改为ANSI/ASCII,文件格式不能是UTF-8。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-19 10:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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