qinbin 发表于 2024-11-8 15:05:39

如何让printf支持输出00

本帖最后由 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,正常显示

VCC 发表于 2024-11-8 15:09:04

没明白你遇到了什么问题。你的屏幕上有9个数字,和你说的3个数字没什么联系,能更详细说说吗

另外,串口屏的协议文档呢

qinbin 发表于 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后断了

soma 发表于 2024-11-8 15:46:14

0x00这个好像真的输出不了

qinbin 发表于 2024-11-8 15:47:24

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

DebugLab 发表于 2024-11-8 16:07:43

任何对字符串的处理遇数值0都会退出,但可以printf字符0(数值0x30)

_奶咖君_ 发表于 2024-11-8 16:07:45

是不想用for循环发送么?

王昱顺 发表于 2024-11-8 17:54:34

qinbin 发表于 2024-11-8 15:13
char tmp13[]={0x5A,0xA5,0x05,0x82,0x01,0x03,0x10,0x02};
printf(tmp13);
通过串口发送到串口屏上,串口 ...

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

VCC 发表于 2024-11-8 19:01:23

哈哈哈,看了大佬们的讨论,终于知道楼主遇到了什么问题

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

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

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

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

它带来了什么方便呢?
或许楼主有些误区。
printf并非设计用来输出二进制数据,它是用来输出供人类阅读的文本

VCC 发表于 2024-11-8 19:12:43

正确的(但不够优雅,因为是阻塞式的)做法如下:

void SendArray(const char* ptr,uint8_t size)
{
   while(size--)
   {
      SBUF=*ptr++; //送一个新数据
      while(!TI);//等待串口发送完成标志位
      TI=0;//清除串口发送完成标志位
   }
}

页: [1] 2
查看完整版本: 如何让printf支持输出00