OpenEdv-开源电子网

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

printf中文乱码

[复制链接]

19

主题

171

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
494
金钱
494
注册时间
2018-9-3
在线时间
50 小时
发表于 2018-9-4 09:17:19 | 显示全部楼层 |阅读模式
用printf函数中文出现乱码
[mw_shl_code=c,true]#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);   
                                                                               
               
                }
               
       
}
[/mw_shl_code]

$~V)(V}AF8B442BA9FB{VIW.png
8NPR%M)JR()OH{F81Y7~]7A.png
K}]CPW~T_{1DKX1LJEMQUT2.png
NRO2$G(M2PM]`}R1IHUWS~J.png
U2CL7U}HIRV5[XW3M_NCO5J.png
ZJ1DW@DGXE~XSBT52]J5NGU.png
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

19

主题

171

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
494
金钱
494
注册时间
2018-9-3
在线时间
50 小时
 楼主| 发表于 2018-9-4 17:12:27 | 显示全部楼层
咸鱼打架 发表于 2018-9-4 15:54
可能楼主的问题不是波特率的问题,但波特率不一致确实会乱码

是编码的问题,应该在用printf之前就把汉字编码成ASCII格式的,应该就好了,可是我不会把汉字变成ASCII格式,所以就报错了
回复 支持 1 反对 0

使用道具 举报

19

主题

171

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
494
金钱
494
注册时间
2018-9-3
在线时间
50 小时
 楼主| 发表于 2018-9-4 10:59:57 | 显示全部楼层
彼岸星光依旧在 发表于 2018-9-4 09:56
最后那张图的界面你试一下把encoding换成简体中文c/c++files里面tab size换成4行不行

没用,还是一样的效果
回复 支持 1 反对 0

使用道具 举报

2

主题

10

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2018-8-31
在线时间
4 小时
发表于 2018-9-4 09:56:41 来自手机 | 显示全部楼层
最后那张图的界面你试一下把encoding换成简体中文c/c++files里面tab size换成4行不行
回复 支持 反对

使用道具 举报

3

主题

312

帖子

0

精华

高级会员

Rank: 4

积分
907
金钱
907
注册时间
2011-10-19
在线时间
196 小时
发表于 2018-9-4 10:04:39 | 显示全部楼层
要保证串口助手的发送区和接收区及C文件的编码同为UTF-8
回复 支持 反对

使用道具 举报

70

主题

6763

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13129
金钱
13129
注册时间
2012-11-26
在线时间
3814 小时
发表于 2018-9-4 10:31:44 | 显示全部楼层
你先找个通用的串口助手,确保你助手是好的再说吧
学无止境
回复 支持 反对

使用道具 举报

19

主题

171

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
494
金钱
494
注册时间
2018-9-3
在线时间
50 小时
 楼主| 发表于 2018-9-4 10:50:02 | 显示全部楼层
jermy_z 发表于 2018-9-4 10:31
你先找个通用的串口助手,确保你助手是好的再说吧

原子的串口助手
回复 支持 反对

使用道具 举报

19

主题

171

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
494
金钱
494
注册时间
2018-9-3
在线时间
50 小时
 楼主| 发表于 2018-9-4 10:50:24 | 显示全部楼层
ufbycd 发表于 2018-9-4 10:04
要保证串口助手的发送区和接收区及C文件的编码同为UTF-8

谁家串口助手是utf8啊
回复 支持 反对

使用道具 举报

4

主题

380

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3088
金钱
3088
注册时间
2015-10-17
在线时间
320 小时
发表于 2018-9-4 10:59:20 | 显示全部楼层
中文要串口工具支持啊,中文的编码好像是16位,一个汉字两个字节。c#做个winform将串口接收到的数据转换为中文还是很容易的。
回复 支持 反对

使用道具 举报

19

主题

171

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
494
金钱
494
注册时间
2018-9-3
在线时间
50 小时
 楼主| 发表于 2018-9-4 11:03:19 | 显示全部楼层
hgr211 发表于 2018-9-4 10:59
中文要串口工具支持啊,中文的编码好像是16位,一个汉字两个字节。c#做个winform将串口接收到的数据转换为 ...

哎,你说了半天,也没用啊
回复 支持 反对

使用道具 举报

70

主题

6763

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13129
金钱
13129
注册时间
2012-11-26
在线时间
3814 小时
发表于 2018-9-4 11:12:27 | 显示全部楼层

你图上的不是原子的吧,原子的最新版目前还没放出来
学无止境
回复 支持 反对

使用道具 举报

4

主题

380

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3088
金钱
3088
注册时间
2015-10-17
在线时间
320 小时
发表于 2018-9-4 11:18:09 | 显示全部楼层
感觉你发送的时候就应该自己转成unicode编码,4eca  5929这是正确的编码,看你printf直接发的也不对,你不能指望printf是万能的。你可以自己重写串口发送程序,单个字转成2个字节发送,来调试。
回复 支持 反对

使用道具 举报

0

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
163
金钱
163
注册时间
2015-7-24
在线时间
21 小时
发表于 2018-9-4 11:23:14 | 显示全部楼层
搞个丁丁串口助手看看,如果还乱码那就是代码问题了
回复 支持 反对

使用道具 举报

3

主题

312

帖子

0

精华

高级会员

Rank: 4

积分
907
金钱
907
注册时间
2011-10-19
在线时间
196 小时
发表于 2018-9-4 11:37:33 | 显示全部楼层
本帖最后由 ufbycd 于 2018-9-4 11:41 编辑
凌凌漆 发表于 2018-9-4 10:50
谁家串口助手是utf8啊

PuTTY  这种串口工具主要是用来登陆Linux终端的,所以其编码可设置,其实其默认就是UTF-8。(Linux平台默认编码是UTF-8)
回复 支持 反对

使用道具 举报

19

主题

171

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
494
金钱
494
注册时间
2018-9-3
在线时间
50 小时
 楼主| 发表于 2018-9-4 12:21:44 | 显示全部楼层
jermy_z 发表于 2018-9-4 11:12
你图上的不是原子的吧,原子的最新版目前还没放出来

我用原子的测了没用,上图那个也支持中文,也不行
回复 支持 反对

使用道具 举报

19

主题

171

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
494
金钱
494
注册时间
2018-9-3
在线时间
50 小时
 楼主| 发表于 2018-9-4 12:24:43 | 显示全部楼层
ufbycd 发表于 2018-9-4 11:37
PuTTY  这种串口工具主要是用来登陆Linux终端的,所以其编码可设置,其实其默认就是UTF-8。(Linux平台默 ...

我的系统是Windows 的 现在就是想知道,单片机发过来的汉字 怎么才是让普通的串口助手 使用
回复 支持 反对

使用道具 举报

19

主题

171

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
494
金钱
494
注册时间
2018-9-3
在线时间
50 小时
 楼主| 发表于 2018-9-4 12:25:46 | 显示全部楼层
xiaomodao 发表于 2018-9-4 11:23
搞个丁丁串口助手看看,如果还乱码那就是代码问题了

用丁丁串口助手了,代码问题你确定吗
回复 支持 反对

使用道具 举报

3

主题

312

帖子

0

精华

高级会员

Rank: 4

积分
907
金钱
907
注册时间
2011-10-19
在线时间
196 小时
发表于 2018-9-4 13:36:52 | 显示全部楼层
凌凌漆 发表于 2018-9-4 12:24
我的系统是Windows 的 现在就是想知道,单片机发过来的汉字 怎么才是让普通的串口助手 使用

什么叫普通助手,Windows也可以用PuTTY!感觉你在浪费的我时间呢!
回复 支持 反对

使用道具 举报

19

主题

171

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
494
金钱
494
注册时间
2018-9-3
在线时间
50 小时
 楼主| 发表于 2018-9-4 14:13:17 | 显示全部楼层
ufbycd 发表于 2018-9-4 13:36
什么叫普通助手,Windows也可以用PuTTY!感觉你在浪费的我时间呢!

不好意思啊,我初学着,听不懂
回复 支持 反对

使用道具 举报

5

主题

35

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
221
金钱
221
注册时间
2018-7-31
在线时间
34 小时
发表于 2018-9-4 14:55:06 | 显示全部楼层
波特率不一致会出现乱码
回复 支持 反对

使用道具 举报

19

主题

171

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
494
金钱
494
注册时间
2018-9-3
在线时间
50 小时
 楼主| 发表于 2018-9-4 15:08:43 | 显示全部楼层
咸鱼打架 发表于 2018-9-4 14:55
波特率不一致会出现乱码

不懂,请别瞎说
回复 支持 反对

使用道具 举报

5

主题

35

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
221
金钱
221
注册时间
2018-7-31
在线时间
34 小时
发表于 2018-9-4 15:51:29 | 显示全部楼层

那你来看看这是不是乱码
微信截图_20180904155009.png
回复 支持 反对

使用道具 举报

5

主题

35

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
221
金钱
221
注册时间
2018-7-31
在线时间
34 小时
发表于 2018-9-4 15:54:13 | 显示全部楼层

可能楼主的问题不是波特率的问题,但波特率不一致确实会乱码
回复 支持 反对

使用道具 举报

19

主题

171

帖子

0

精华

中级会员

Rank: 3Rank: 3

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

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

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

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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