OpenEdv-开源电子网

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

CubeMX的串口问题,严重影响体感

[复制链接]

52

主题

247

帖子

0

精华

高级会员

Rank: 4

积分
997
金钱
997
注册时间
2017-8-19
在线时间
160 小时
发表于 2021-9-2 22:57:53 | 显示全部楼层 |阅读模式
1金钱
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
这个函数一直发送不了中文,不知道什么原因,中文就乱码,有大佬教教我吗

最佳答案

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

结论 : HAL 库 并没有任何问题 ,问题出在 编译器 不支持汉字 。 你写 unsigned char temp[] = "你 啊啊\r\n"; 其实 赋值 给 temp[] 就已经不对了 ,所以后面 输出也不对。。 俺 已经验证 英文 就可以 正确 —— uint8_t tx_L_Test[] = {"L_"}; // 正确 。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

85

主题

562

帖子

0

精华

高级会员

Rank: 4

积分
810
金钱
810
注册时间
2014-9-30
在线时间
138 小时
发表于 2021-9-2 22:57:54 | 显示全部楼层
本帖最后由 caosix 于 2021-9-8 17:32 编辑

  结论 : HAL 库 并没有任何问题 ,问题出在 编译器 不支持汉字 。
你写 unsigned char temp[] = "你 啊啊\r\n";
其实 赋值 给 temp[] 就已经不对了 ,所以后面 输出也不对。。
已经验证 英文 就可以 正确 ——

  uint8_t tx_L_Test[] = {"L_"};  // 正确 。
回复

使用道具 举报

3

主题

312

帖子

0

精华

高级会员

Rank: 4

积分
907
金钱
907
注册时间
2011-10-19
在线时间
196 小时
发表于 2021-9-3 10:20:06 | 显示全部楼层
中文乱码通常是编码问题。
C源码的编码要跟接收后显示的编码一致。如果两边都是Windos可以选GBK编码,如果要跨平台即开发平台跟接收显示的平台不一样就选UTF-8.
不过建议不跨平台也选UTF-8
回复

使用道具 举报

3

主题

808

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3886
金钱
3886
注册时间
2017-3-7
在线时间
1694 小时
发表于 2021-9-3 10:22:01 | 显示全部楼层
看看发出的数据是不是对的
回复

使用道具 举报

70

主题

6761

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13114
金钱
13114
注册时间
2012-11-26
在线时间
3812 小时
发表于 2021-9-3 11:04:44 | 显示全部楼层
是你自己编码问题吧   跟cubemx也没关系  
回复

使用道具 举报

3

主题

117

帖子

0

精华

高级会员

Rank: 4

积分
559
金钱
559
注册时间
2018-10-3
在线时间
107 小时
发表于 2021-9-3 11:23:28 | 显示全部楼层
可以试试用printf打印中文

添加这个函数即可
int fputc(int ch,FILE *f)
{
    HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,0xffff);
    return ch;
}
回复

使用道具 举报

52

主题

247

帖子

0

精华

高级会员

Rank: 4

积分
997
金钱
997
注册时间
2017-8-19
在线时间
160 小时
 楼主| 发表于 2021-9-3 23:14:47 | 显示全部楼层
ufbycd 发表于 2021-9-3 10:20
中文乱码通常是编码问题。
C源码的编码要跟接收后显示的编码一致。如果两边都是Windos可以选GBK编码,如果 ...

串口发送数据会与编码有关吗
回复

使用道具 举报

52

主题

247

帖子

0

精华

高级会员

Rank: 4

积分
997
金钱
997
注册时间
2017-8-19
在线时间
160 小时
 楼主| 发表于 2021-9-3 23:16:38 | 显示全部楼层
a5820736 发表于 2021-9-3 10:22
看看发出的数据是不是对的

数据不是对得,我发送一个字符:你  就正常,但是多一个中文就不行而且不是每次尝试单个中文都行
回复

使用道具 举报

52

主题

247

帖子

0

精华

高级会员

Rank: 4

积分
997
金钱
997
注册时间
2017-8-19
在线时间
160 小时
 楼主| 发表于 2021-9-3 23:17:29 | 显示全部楼层
jermy_z 发表于 2021-9-3 11:04
是你自己编码问题吧   跟cubemx也没关系

我换了编码也不行,百度找了很久也没找到答案,大家都是直接重定向printf或者中断了,没有看到直接试用这个函数发中文
回复

使用道具 举报

52

主题

247

帖子

0

精华

高级会员

Rank: 4

积分
997
金钱
997
注册时间
2017-8-19
在线时间
160 小时
 楼主| 发表于 2021-9-3 23:17:52 | 显示全部楼层
wklhwkl 发表于 2021-9-3 11:23
可以试试用printf打印中文

添加这个函数即可

我就是究竟为什么本身发不了中文。
回复

使用道具 举报

3

主题

312

帖子

0

精华

高级会员

Rank: 4

积分
907
金钱
907
注册时间
2011-10-19
在线时间
196 小时
发表于 2021-9-5 14:39:33 | 显示全部楼层
本帖最后由 ufbycd 于 2021-9-5 14:42 编辑
bbq 发表于 2021-9-3 23:16
数据不是对得,我发送一个字符:你  就正常,但是多一个中文就不行而且不是每次尝试单个中文都行

提问要细心,把你实际的代码帖出来,往往就是错在你认为正确的地方。
你应该对中文编码的原理没明白,多查下相关资料。
另外,你要确认你的接收端用的是什么编码,再使源码与其一致。
串口调试一般不发中文,是因为电脑上很多工具对于编码比较随意或者不关心,而源码编辑器也是如此,而且不同平台下的流行的编码也不同(主要是Windows喜欢用GBK跟Linux及MAC的UTF-8不同),所以两者的编码很难保证一致,从而极其容易出现乱码。用英文就不会有这个烦恼。
提醒一下,字符串“你好”的字符串长度并不是2
回复

使用道具 举报

56

主题

343

帖子

0

精华

高级会员

Rank: 4

积分
977
金钱
977
注册时间
2016-3-8
在线时间
267 小时
发表于 2021-9-6 09:07:55 | 显示全部楼层
先16进制接收看数据对不对。比如发个"你好吗",然后看下16进制是不是接收到了正确的字节码。
回复

使用道具 举报

52

主题

247

帖子

0

精华

高级会员

Rank: 4

积分
997
金钱
997
注册时间
2017-8-19
在线时间
160 小时
 楼主| 发表于 2021-9-6 21:33:51 | 显示全部楼层
ufbycd 发表于 2021-9-5 14:39
提问要细心,把你实际的代码帖出来,往往就是错在你认为正确的地方。
你应该对中文编码的原理没明白,多 ...

int main(void)
{
  /* USER CODE BEGIN 1 */
        unsigned char temp[] = "你 啊啊\r\n";
  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
                HAL_UART_Transmit(&huart1,temp,sizeof(temp),50);
                HAL_Delay(100);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

我粘贴了主要的
回复

使用道具 举报

52

主题

247

帖子

0

精华

高级会员

Rank: 4

积分
997
金钱
997
注册时间
2017-8-19
在线时间
160 小时
 楼主| 发表于 2021-9-6 21:34:30 | 显示全部楼层
ufbycd 发表于 2021-9-5 14:39
提问要细心,把你实际的代码帖出来,往往就是错在你认为正确的地方。
你应该对中文编码的原理没明白,多 ...

就是原子的串口软件,我改过keil的格式,utf-8哥和gbk都试过了,也不行
回复

使用道具 举报

85

主题

562

帖子

0

精华

高级会员

Rank: 4

积分
810
金钱
810
注册时间
2014-9-30
在线时间
138 小时
发表于 2021-9-8 16:59:07 | 显示全部楼层
bbq 发表于 2021-9-6 21:34
就是原子的串口软件,我改过keil的格式,utf-8哥和gbk都试过了,也不行

用 逻辑分析仪 ,直接看看 你的串口 发送 中文的时候 ,


究竟——是不是 把 最高那个 bit  给 屏蔽掉了 ,不就清楚了。


6611.png
回复

使用道具 举报

85

主题

562

帖子

0

精华

高级会员

Rank: 4

积分
810
金钱
810
注册时间
2014-9-30
在线时间
138 小时
发表于 2021-9-8 17:13:16 | 显示全部楼层
本帖最后由 caosix 于 2021-9-8 17:16 编辑
bbq 发表于 2021-9-6 21:33
int main(void)
{
  /* USER CODE BEGIN 1 */
   uint8_t tx_L_Test[] = {0xCE,0xC4};    //字符 “汉”  不要用 char
程序 也是 HAL 库 的, 与你的 程序 一样的 哟 。。。
    HAL_UART_Transmit(&huart1,tx_Data_N,2,10);  // 发序号   46
    HAL_UART_Transmit(&huart1,tx_L_Test,2,10);  // 汉字 2 个字节


6622.png
回复

使用道具 举报

85

主题

562

帖子

0

精华

高级会员

Rank: 4

积分
810
金钱
810
注册时间
2014-9-30
在线时间
138 小时
发表于 2021-9-8 17:25:36 | 显示全部楼层
本帖最后由 caosix 于 2021-9-8 18:41 编辑
bbq 发表于 2021-9-3 23:17
我就是究竟为什么本身发不了中文。

汉字数据 赋值的时候 , 要看 你的  编译器 是否支持 。
我的 IAR 7.62  想 偷懒 它就 输出 BA  BA 而不是 “文”

6633.png

我操——汉——BA BA 我的 IAR7.62 支持这种写法。
回复

使用道具 举报

52

主题

247

帖子

0

精华

高级会员

Rank: 4

积分
997
金钱
997
注册时间
2017-8-19
在线时间
160 小时
 楼主| 发表于 2021-9-8 22:36:44 | 显示全部楼层
caosix 发表于 2021-9-8 17:28
结论 : HAL 库 并没有任何问题 ,问题出在 编译器 不支持汉字 。
你写 unsigned char temp[] = "你  ...

首先感谢大佬,但是我真的对这个无语了,靠,折腾好几天。现在又发现这样是可以的,不知道为什么。。
HAL_UART_Transmit(&huart1,(uint8_t *)"你好\r\n",sizeof("你好\r\n"),500);
我这样子搞居然可以,跟我之前那种写法究竟在什么地方有什么不一样啊啊啊
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-5 09:45

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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