langbaiyue 发表于 2015-6-1 16:16:45

请教sprintf和串口发送的问题

       
test 为unsigned char 型变量

        sprintf(Send_Sbuf,"%02d",test);
                       
        Send_String(Send_Sbuf) ;


Send_String函数

void Send_String(unsigned char *dat )
{
        while(*dat)         
        {
                   Send_Serial(*dat);      
                dat++;               
        }
       
}

现象: 不论test 值为几,串口发送的值都是test*256+14的数值,比如test = 1 ,则串口发送270,请教为什么?程序有什么问题?

wicy001 发表于 2015-6-1 16:49:57

本帖最后由 wicy001 于 2015-6-1 16:53 编辑

你认为test = 1 时,应该发送什么?

----
补充编辑:我理解错了,是不正常啊。

wicy001 发表于 2015-6-1 17:00:58

先调试下 sprintf(Send_Sbuf,"%02d",test);send_Sbuf 存的什么,基本就判断出来是什么问题了

目测是 send_Sbuf 在其他函数里,被动了。

steaven2000 发表于 2015-6-1 17:18:34

把程序这样改一下试试?

sprintf(Send_Sbuf,"%02d",(unsigned int)test);

langbaiyue 发表于 2015-6-2 08:18:52

wicy001 发表于 2015-6-1 17:00
先调试下 sprintf(Send_Sbuf,"%02d",test);send_Sbuf 存的什么,基本就判断出来是什么问题了

目测是 sen ...

Send_Sbuf 是在子函数单独定义的,目前是双串口发送,一个送TFT,一个送上位机,两个串口现象一样

langbaiyue 发表于 2015-6-2 08:21:43

steaven2000 发表于 2015-6-1 17:18
把程序这样改一下试试?

sprintf(Send_Sbuf,"%02d",(unsigned int)test);

昨天晚上在家我把test定义成unsigned int 就行了, 和您这方法产生了同样的效果,请教原因?

steaven2000 发表于 2015-6-2 08:32:08

langbaiyue 发表于 2015-6-2 08:21
昨天晚上在家我把test定义成unsigned int 就行了, 和您这方法产生了同样的效果,请教原因? ...

百度 sprintf函数原型,后面的参数如果是32位的,一样会出错。以上是经验总结,原因未知。

wicy001 发表于 2015-6-2 08:33:17

明白了,
%d,取变量时,是按照int来取的, 如果给的参数是char,就会把test及后面一个字节一块取了当参数。可以推断出,test后面的一个字节内容是14(0x0E)。

langbaiyue 发表于 2015-6-2 09:30:05

多谢两位指教!

steaven2000 发表于 2015-6-2 10:44:19

wicy001 发表于 2015-6-2 08:33
明白了,
%d,取变量时,是按照int来取的, 如果给的参数是char,就会把test及后面一个字节一块取了当参数 ...

是值传递又不是地址传递,但我也没搞清原因。

wicy001 发表于 2015-6-2 10:52:23

本帖最后由 wicy001 于 2015-6-2 11:00 编辑

steaven2000 发表于 2015-6-2 10:44
是值传递又不是地址传递,但我也没搞清原因。

int sprintf( char *buffer, const char *format, [ argument] … );

argument 是可变参量,可以传递1或N个参数,也可以传递不同类型的参量。argument 相当是个字符串,传递的是地址。


//补充: argument是跟在char *format之后,作为一个整体传递过去的。
页: [1]
查看完整版本: 请教sprintf和串口发送的问题