请教:Keil uVision5 编译中文乱码 是什么原因?

2019-12-13 18:25发布

初始化时是正确的。例如:

  1. int main(void)
  2. {
  3.         USART1_Config(115200);        //打印
  4.         LCD_Config();
  5.         printf("这是中文");    //打印正确
  6.         SysTick_Init();
  7.         while(1)
  8.         {
  9.                 if(tick_10ms>9)
  10.                 {
  11.                         tick_10ms = 0;
  12.                         menu_task(&s_tMenuDemo);  //傻孩子大师的新菜单
  13.                 }
  14.                
  15.                 if(tick_100ms>99)
  16.                 {
  17.                         tick_100ms = 0;
  18.                 }
  19.         }
  20. }
复制代码

在傻孩子大师的新菜单项中打印就乱码,直接printf打印串口显示的。显示到12864屏幕上也一样,请教各位,这是什么原因?
不知道是不是打开 #pragma anon_unions                        //匿名结构体需要
还有打勾了 -C99  的编译


  1. #ifndef __BSP_MENU_H__
  2. #define __BSP_MENU_H__

  3. #pragma anon_unions                        //匿名结构体需要

  4. #include <stdio.h>  //printf( " USART1  Initialize Success! " );
  5. #include <string.h> //memset(buf,0,sizeof(buf));清零 memcpy(,,)

  6. #include "stm32f10x.h"



  7. #define this            (*ptThis)

  8. #define UBOUND(__ARR)    (sizeof(__ARR)/sizeof(__ARR[0]))

  9. #ifndef __FSM_RT_TYPE__
  10. #define __FSM_RT_TYPE__
  11. //! ame finit state machine state
  12. //! @{
  13. typedef enum {
  14.     fsm_rt_err          = -1,    //!< fsm error, error code can be get from other interface
  15.     fsm_rt_cpl          = 0,     //!< fsm complete
  16.     fsm_rt_on_going     = 1,     //!< fsm on-going
  17.     fsm_rt_wait_for_obj = 2,     //!< fsm wait for object
  18.     fsm_rt_asyn         = 3,     //!< fsm asynchronose complete, you can check it later.
  19. } fsm_rt_t;
  20. //! @}

  21. #endif

  22. /*============================ MACROS ========================================*/
  23. /*============================ MACROFIED FUNCTIONS ===========================*/

  24. #define __declare_menu_item_template(__NAME)                                    
  25.     typedef struct __##__NAME __NAME;
  26. #define declare_menu_item_template(__NAME)                                      
  27.         __declare_menu_item_template(__NAME)
  28.    
  29. #define __def_menu_item_template(__NAME)                                       
  30.     struct __##__NAME {                                                         
  31.         menu_item_t;                                                            
  32. #define def_menu_item_template(__NAME)                                          
  33.             __def_menu_item_template(__NAME)                                    

  34. #define end_def_menu_item_template(__NAME)                                      
  35.     };

  36. #define __def_menu(__NAME, __PARENT, __ENGINE, __TEMPLATE)                     
  37. extern const menu_t c_tMenu##__NAME;                                            
  38. __TEMPLATE c_tMenu##__NAME##Items[] = {
  39. #define def_menu(__NAME, __PARENT, __ENGINE)                                    
  40.             __def_menu(__NAME, (__PARENT), (__ENGINE), default_menu_item_t)
  41.             
  42. #define def_menu_ex(__NAME, __PARENT, __ENGINE, __TEMPLATE)                     
  43.             __def_menu(__NAME, (__PARENT), (__ENGINE), __TEMPLATE)

  44. #define __end_def_menu(__NAME, __PARENT, __ENGINE, __TEMPLATE)                  
  45.     };                                                                          
  46.     const menu_t c_tMenu##__NAME = {                                            
  47.         (menu_item_t *)c_tMenu##__NAME##Items,                                 
  48.         (sizeof(c_tMenu##__NAME##Items)/sizeof(__TEMPLATE)),                    
  49.         (menu_t *)(__PARENT),                                                   
  50.         (__ENGINE),                                                            
  51.     };
  52. #define end_def_menu(__NAME, __PARENT, __ENGINE)                                
  53.             __end_def_menu(__NAME, (__PARENT), (__ENGINE), default_menu_item_t)
  54. #define end_def_menu_ex(__NAME, __PARENT, __ENGINE, __TEMPLATE)                 
  55.             __end_def_menu(__NAME, (__PARENT), (__ENGINE), __TEMPLATE)
  56.             
  57. #define __extern_menu(__NAME)   extern const menu_t c_tMenu##__NAME;
  58. #define extern_menu(__NAME)     __extern_menu(__NAME)

  59. #define __menu(__NAME)          c_tMenu##__NAME
  60. #define menu(__NAME)            __menu(__NAME)            
  61.          
  62. #define __menu_item(__HANDLER, __CHILD_MENU, ...)                              
  63.     {                                                                           
  64.         (__HANDLER),                                                            
  65.         (menu_t *)(__CHILD_MENU),                                               
  66.         __VA_ARGS__,                                                            
  67.     },
  68. #define menu_item(__HANDLER, __CHILD_MENU, ...)                                 
  69.             __menu_item((__HANDLER), (__CHILD_MENU), __VA_ARGS__)

  70. /*============================ TYPES =========================================*/

  71. typedef struct __menu_item                  menu_item_t;                //菜单项
  72. typedef struct __menu                              menu_t;                                //菜单容器
  73. typedef struct __menu_engine_cb         menu_engine_cb_t;        //菜单引擎?

  74. typedef fsm_rt_t menu_item_handler_t(menu_item_t *);        //菜单项消息处理引擎
  75. typedef fsm_rt_t menu_engine_t(menu_engine_cb_t *);                //菜单容器消息处理引擎

  76. //菜单项 基类
  77. struct __menu_item {
  78.     menu_item_handler_t *fnHandle;                      //!< handler
  79.     menu_t              *ptChild;                       //!< Child Menu
  80. };

  81. //菜单容器 基类
  82. struct __menu {
  83.     menu_item_t        *ptItems;                        //!< menu item list
  84.     uint_fast8_t        chCount;                        //!< menu item count
  85.     menu_t             *ptParent;                       //!< parent menu;
  86.     menu_engine_t      *fnEngine;                       //!< engine for process current menu
  87. };

  88. //菜单引擎?
  89. struct __menu_engine_cb {
  90.     uint_fast8_t    tState;
  91.     const menu_t    *ptCurrentMenu;                //指向当前菜单容器
  92.     uint_fast8_t    chCurrentItemIndex;        //当前菜单容器中的菜单项索引号
  93. };
  94. /*============================ 以上是基类 =========================================*/

  95. /*===================== 派生类 默认菜单项 ====================================*/
  96. typedef struct __default_menu_item_t  default_menu_item_t;        //派生类 默认菜单项
  97. struct __default_menu_item_t   {

  98.     //! inherit from base class menu_item_t
  99.     menu_item_t;

  100.     //! depends on your application, you can add/remove/change following members
  101.     char                *pchTitle;                      //!< Menu Title
  102.     char                *pchDescription;                //!< Description for this menu item
  103.     char                chShortCutKey;                  //!< Shortcut Key value in current menu
  104. };

  105. /*===================== 派生类 默认菜单项初始化 ================================*/
  106. extern fsm_rt_t top_menu_engine(menu_engine_cb_t *ptThis);                //菜单容器处理函数
  107. extern fsm_rt_t top_menu_item_a_handler(menu_item_t *ptItem);        //菜单项a处理函数
  108. extern fsm_rt_t top_menu_item_b_handler(menu_item_t *ptItem);        //菜单项b处理函数
  109. extern fsm_rt_t top_menu_item_c_handler(menu_item_t *ptItem);        //菜单项c处理函数

  110. extern const menu_t c_tTopMenu;        //顶层菜单容器

  111. void Display_top_menu(menu_engine_cb_t*ptThis);

  112. /*===================== 派生类 默认菜单项初始化 ================================*/
  113. extern fsm_rt_t lv2_menu_engine(menu_engine_cb_t *ptThis);                //菜单容器处理函数
  114. extern fsm_rt_t lv2_menu_item_1_handler(menu_item_t *ptItem);        //菜单项处理函数
  115. extern fsm_rt_t lv2_menu_item_2_handler(menu_item_t *ptItem);        //菜单项处理函数
  116. extern fsm_rt_t lv2_menu_item_3_handler(menu_item_t *ptItem);        //菜单项处理函数

  117. extern const menu_t lv2_menu_A;        //菜单容器

  118. fsm_rt_t menu_task(menu_engine_cb_t *ptThis);

  119. #endif



复制代码
  1. //菜单项b处理函数
  2. fsm_rt_t top_menu_item_b_handler(menu_item_t *ptItem)
  3. {
  4.         printf("这是 B          ");  //打印乱码成【杩欐槸 B          】
  5.     return fsm_rt_cpl;
  6. }
复制代码
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
Eric2013
1楼-- · 2019-12-13 19:46
记事本打开你调用printf的源文件,另存时看你的编码属性,一般我们都是用的ANSI(本地编码,中文windows系统就是GBK),如果你UTF-8,你的串口软件要支持UTF-8,大部分串口助手仅支持GBK。

使用notepad++之类的编辑器查看也比较方便。
jssd
2楼-- · 2019-12-14 01:04
Eric2013 发表于 2019-2-23 15:40
记事本打开你调用printf的源文件,另存时看你的编码属性,一般我们都是用的ANSI(本地编码,中文windows系 ...

用notepad++将源文件转成ANSI格式,解决问题了。
多谢!

一周热门 更多>