找回密码
 立即注册
查看: 520|回复: 10

如何让printf支持输出00

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2024-11-08 15:11:01
已绑定手机

1

主题

3

回帖

13

积分

新手上路

积分
13
发表于 2024-11-8 15:05:39 | 显示全部楼层 |阅读模式
本帖最后由 qinbin 于 2024-11-8 15:09 编辑

在使用stc8h8k的串口驱动串口屏幕的时候,又想用printf(因为方便),但是输出不了00


                           /*帧头*/ /*总长*/  /*地址*/   /*内容*/
char tmp11[]={0x5A,0xA5,0x05,0x82,0x01,0x01,0x10,0x00};
char tmp12[]={0x5A,0xA5,0x05,0x82,0x01,0x02,0x10,0x01};
char tmp13[]={0x5A,0xA5,0x05,0x82,0x01,0x03,0x10,0x02};


第一个变量地址是1001,发的1000,应该是4096的,串口发送到0终止了,是程序的事情,第二个变量1002,发送的是1001,应该是4097,为什么没有正常显示,第三个变量地址1003,发送的是1002,应该是4098,正常显示

输出.png
串口屏幕上的显示.jpg
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:123
  • 最近打卡:2025-04-19 16:12:35
已绑定手机

60

主题

777

回帖

4001

积分

论坛元老

自定义头衔

积分
4001
发表于 2024-11-8 15:09:04 | 显示全部楼层
没明白你遇到了什么问题。你的屏幕上有9个数字,和你说的3个数字没什么联系,能更详细说说吗

另外,串口屏的协议文档呢
联系我请点击左下角的【回复】按钮,否则我收不到消息提
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2024-11-08 15:11:01
已绑定手机

1

主题

3

回帖

13

积分

新手上路

积分
13
发表于 2024-11-8 15:13:58 | 显示全部楼层
char tmp13[]={0x5A,0xA5,0x05,0x82,0x01,0x03,0x10,0x02};
printf(tmp13);
通过串口发送到串口屏上,串口屏再103的控件上显示1002也就是现在显示的4098
问题是tmp11发送不过去,通过监控串口上的数据发现发送0x5A,0xA5,0x05,0x82,0x01,0x01,0x10后断了

点评

使用printf适合ascii码的字符类型数据,想要发送hex数据,建议还是自己写一个函数进行指定长度的发送。因为printf在没有遇到0x00的时候不会停止,万一后边的内存空间中不是0x00。会造成显示错乱。  详情 回复 发表于 2024-11-8 17:54
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:424
  • 最近打卡:2025-05-03 00:02:01
已绑定手机

19

主题

3191

回帖

4876

积分

论坛元老

积分
4876
发表于 2024-11-8 15:46:14 | 显示全部楼层
0x00这个好像真的输出不了
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2024-11-08 15:11:01
已绑定手机

1

主题

3

回帖

13

积分

新手上路

积分
13
发表于 2024-11-8 15:47:24 | 显示全部楼层
S2BUF=0x00;可以输出,就是这样以来,printf带来的方便就没了
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:425
  • 最近打卡:2025-05-03 00:09:43
已绑定手机

77

主题

4850

回帖

8388

积分

超级版主

DebugLab

积分
8388
发表于 2024-11-8 16:07:43 | 显示全部楼层
任何对字符串的处理遇数值0都会退出,但可以printf字符0(数值0x30)
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-04-30 08:43:23

33

主题

2351

回帖

4860

积分

论坛元老

积分
4860
发表于 2024-11-8 16:07:45 | 显示全部楼层
是不想用for循环发送么?
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:460
  • 最近打卡:2025-05-03 07:38:35
已绑定手机
已实名认证

110

主题

2224

回帖

5470

积分

版主

积分
5470
发表于 2024-11-8 17:54:34 | 显示全部楼层
qin*** 发表于 2024-11-8 15:13
char tmp13[]={0x5A,0xA5,0x05,0x82,0x01,0x03,0x10,0x02};
printf(tmp13);
通过串口发送到串口屏上,串口 ...

使用printf适合ascii码的字符类型数据,想要发送hex数据,建议还是自己写一个函数进行指定长度的发送。因为printf在没有遇到0x00的时候不会停止,万一后边的内存空间中不是0x00。会造成显示错乱。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:123
  • 最近打卡:2025-04-19 16:12:35
已绑定手机

60

主题

777

回帖

4001

积分

论坛元老

自定义头衔

积分
4001
发表于 2024-11-8 19:01:23 | 显示全部楼层
哈哈哈,看了大佬们的讨论,终于知道楼主遇到了什么问题

楼主定义了char[]数组,然后尝试用printf将其发出去。

发现遇到\0的地方,printf就自己停了。
这是一件很自然的事情。

因为printf是用来发字符串的。至于楼主提到的

S2BUF=0x00;可以输出,就是这样一来,printf带来的方便就没了


它带来了什么方便呢?
或许楼主有些误区。
printf并非设计用来输出二进制数据,它是用来输出供人类阅读的文本
联系我请点击左下角的【回复】按钮,否则我收不到消息提
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:123
  • 最近打卡:2025-04-19 16:12:35
已绑定手机

60

主题

777

回帖

4001

积分

论坛元老

自定义头衔

积分
4001
发表于 2024-11-8 19:12:43 | 显示全部楼层
正确的(但不够优雅,因为是阻塞式的)做法如下:
  1. void SendArray(const char* ptr,uint8_t size)
  2. {
  3.    while(size--)
  4.    {
  5.       SBUF=*ptr++; //送一个新数据
  6.       while(!TI);//等待串口发送完成标志位
  7.       TI=0;//清除串口发送完成标志位
  8.    }
  9. }
复制代码
联系我请点击左下角的【回复】按钮,否则我收不到消息提
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-3 08:17 , Processed in 0.131897 second(s), 116 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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