当前位置:   article > 正文

已解决1:STM32+SYN6288语音模块中文播报汉字乱码;2:警告: passing ‘char [5O]’to parame ter of type ‘uos o’(aka ‘unsigned

已解决1:STM32+SYN6288语音模块中文播报汉字乱码;2:警告: passing ‘char [5O]’to parame ter of type ‘uos o’(aka ‘unsigned

目录

遇到的问题1:使用STM32+SYN6288语音模块时,可以正常进行英文和数字的播报,但改为中文进行播报时,播报的是乱码汉字。

遇到的问题2:出现警告warning: passing 'char [5O]’to parame ter of type 'uos o’(aka 'unsigned char * ) converts between pointers to integer types with different sign

修改处源码


两个问题亲测无误,完美解决。

源码来自:绿深旗舰店SYN6288语音合成模块STM32F405RGT6测试程序

所用模块:绿深SYN6288语音合成模块

遇到的问题1:使用STM32+SYN6288语音模块时,可以正常进行英文和数字的播报,但改为中文进行播报时,播报的是乱码汉字。

解决方案:

1.首先点击设置,在Editor-Encoding处选择为GB3312中文编码

 2.找到工程文件中的main.c文件夹

右键点击编辑,进入记事本下

 点击文件--另存为

 选择编码为ANSI

 重新运行,完美解决问题,进行中文语音播报。

遇到的问题2:出现警告warning: passing 'char [5O]’to parame ter of type 'uos o’(aka 'unsigned char * ) converts between pointers to integer types with different sign

出现的警告处如下图所示

 分析原因:

找到函数SYN_FrameInfo定义处,可以看到源码写的入口函数是uint8_t *HZdata或者u8 *HZdata

这个警告是由于尝试将一个类型为 char 的数组传递给一个类型为 uint8_t * 的参数而引起的。

在C/C++中,字符数组(char 数组)的元素类型是 signed char,而 uint8_t 则是无符号整数类型。因此,将 char 数组传递给 uint8_t * 参数时,会发生指针类型不匹配的警告。

解决方案:

 修改为:

SYN_FrameInfo(0,(uint8_t *)"[v1][m0][t0]阿齐大帅哥");

 将数组重新强制类型转换为uint8_t *

可以看到警告消失,完美解决问题。

修改处源码

源码来自:绿深旗舰店SYN6288语音合成模块STM32F405RGT6测试程序

所用模块:绿深SYN6288语音合成模块

main.c

  1. #include "stm32f4xx.h" // Device header
  2. #include <stdint.h>
  3. #include "Delay.h"
  4. #include "LED.h"
  5. #include "sys.h"
  6. #include "syn6288.h"
  7. #include "usart.h"
  8. /**************syn6288芯片设置命令*********************/
  9. u8 SYN_StopCom[] = {0xFD, 0X00, 0X02, 0X02, 0XFD}; //停止合成
  10. u8 SYN_SuspendCom[] = {0XFD, 0X00, 0X02, 0X03, 0XFC}; //暂停合成
  11. u8 SYN_RecoverCom[] = {0XFD, 0X00, 0X02, 0X04, 0XFB}; //恢复合成
  12. u8 SYN_ChackCom[] = {0XFD, 0X00, 0X02, 0X21, 0XDE}; //状态查询
  13. u8 SYN_PowerDownCom[] = {0XFD, 0X00, 0X02, 0X88, 0X77}; //进入POWER DOWN 状态命令
  14. int main(void)
  15. {
  16. //syn6288
  17. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
  18. delay_init(168); //初始化延时函数
  19. uart_init(9600); //初始化串口波特率为115200
  20. while(1)
  21. {
  22. //syn6288
  23. //选择背景音乐2。(0:无背景音乐 1-15:背景音乐可选)
  24. //m[0~16]:0背景音乐为静音,16背景音乐音量最大
  25. //v[0~16]:0朗读音量为静音,16朗读音量最大
  26. //t[0~5]:0朗读语速最慢,5朗读语速最快
  27. //其他不常用功能请参考数据手册
  28. SYN_FrameInfo(0,(uint8_t *)"[v1][m0][t0]阿齐大帅哥");
  29. Delay_ms(1500);
  30. Delay_ms(1500);
  31. Delay_ms(1500);
  32. Delay_ms(1500);
  33. //暂停合成,此时没有用到,用于展示函数用法
  34. //YS_SYN_Set(SYN_SuspendCom);
  35. }
  36. }

1. 包括必要的头文件,如“stm32f4xx.h”,“stdint.h”,和自定义头延迟,LED控制,系统配置,SYN6288芯片,和USART通信。

2. 定义了几个用于控制SYN6288芯片的命令数组。这些命令包括停止合成、暂停合成、恢复合成、检查状态和将芯片置于电源关闭模式。

3. 初始化系统中断优先级分组,设置延迟、UART通信和SYN6288芯片。

4. 进入一个while循环,它向SYN6288芯片发送一个语音合成命令,说出短语“阿齐大帅哥”。然后它延迟了4次1.5秒(1500毫秒)。

syn6288.c

  1. #include "syn6288.h"
  2. #include "usart.h"
  3. #include "string.h"
  4. #include "Delay.h"
  5. //Music:选择背景音乐。0:无背景音乐,1~15:选择背景音乐
  6. void SYN_FrameInfo(uint8_t Music, uint8_t *HZdata)
  7. {
  8. /****************需要发送的文本**********************************/
  9. unsigned char Frame_Info[50];
  10. unsigned char HZ_Length;
  11. unsigned char ecc = 0; //定义校验字节
  12. unsigned int i = 0;
  13. HZ_Length = strlen((char*)HZdata); //需要发送文本的长度
  14. /*****************帧固定配置信息**************************************/
  15. Frame_Info[0] = 0xFD ; //构造帧头FD
  16. Frame_Info[1] = 0x00 ; //构造数据区长度的高字节
  17. Frame_Info[2] = HZ_Length + 3; //构造数据区长度的低字节
  18. Frame_Info[3] = 0x01 ; //构造命令字:合成播放命令
  19. Frame_Info[4] = 0x01 | Music << 4 ; //构造命令参数:背景音乐设定
  20. /*******************校验码计算***************************************/
  21. for(i = 0; i < 5; i++) //依次发送构造好的5个帧头字节
  22. {
  23. ecc = ecc ^ (Frame_Info[i]); //对发送的字节进行异或校验
  24. }
  25. for(i = 0; i < HZ_Length; i++) //依次发送待合成的文本数据
  26. {
  27. ecc = ecc ^ (HZdata[i]); //对发送的字节进行异或校验
  28. }
  29. /*******************发送帧信息***************************************/
  30. memcpy(&Frame_Info[5], HZdata, HZ_Length);
  31. Frame_Info[5 + HZ_Length] = ecc;
  32. USART1_SendString(Frame_Info, 5 + HZ_Length + 1);
  33. }
  34. /***********************************************************
  35. * 名 称: YS_SYN_Set(u8 *Info_data)
  36. * 功 能: 主函数 程序入口
  37. * 入口参数: *Info_data:固定的配置信息变量
  38. * 出口参数:
  39. * 说 明:本函数用于配置,停止合成、暂停合成等设置 ,默认波特率9600bps。
  40. * 调用方法:通过调用已经定义的相关数组进行配置。
  41. **********************************************************/
  42. void YS_SYN_Set(uint8_t *Info_data)
  43. {
  44. u8 Com_Len;
  45. Com_Len = strlen((char*)Info_data);
  46. USART1_SendString(Info_data, Com_Len);
  47. }

1. **SYN_FrameInfo**:该函数构造一个要发送到SYN6288芯片的数据帧。它需要两个参数:选择的背景音乐(' music ')和要合成的文本数据(' HZdata ')。它通过设置各种字节来构建帧,包括帧头、数据长度、命令、命令参数,并计算校验和。最后通过USART通信将构造好的帧发送出去。

2. **YS_SYN_Set**:该函数是一个更通用的函数,用于向SYN6288芯片发送配置命令。它接受一个指向包含配置信息的字节数组(`Info_data`)的指针。它计算命令的长度并通过USART发送。

这两个函数都依赖于`USART .h`中的`USART1_SendString`函数来通过USART通信发送数据。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/307674
推荐阅读
相关标签
  

闽ICP备14008679号