OpenEdv-开源电子网

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

关于sscanf,有时转换是对,有时候就是错。

[复制链接]

19

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2014-8-20
在线时间
0 小时
发表于 2014-12-17 14:59:30 | 显示全部楼层 |阅读模式
5金钱
[mw_shl_code=c,true]void DATE_AREA(void) {[/mw_shl_code] [mw_shl_code=c,true]    char char date_gps[4];[/mw_shl_code] [mw_shl_code=c,true]    int i; char lin[3]; //临时用来装字符的数组 for(i=0;i<3;i++) { lin[0]=date[i*2]; lin[1]=date[i*2+1]; lin[2]='\0'; sscanf(lin,"%X",&date_gps); } [/mw_shl_code]
上面是一个转换函数,我接收到的是日期的字符141217,然后转换成16进制ASCII;但是有个问题,这个scanff转换函数在其他地方工作都正常,就在这个地方的时候,有时候对的,有时候是错误的。就是转换的日期的第一个date_gps[0],这个数据经常是没有的,就直接是00,只有第二个和第三数据,但是有的时候就是对的。
查了好几天,都没找到原因。。其他地方用scanff都是好的。数据都是没问题。
原子哥,这种原因一般都是什么情况?

最佳答案

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

回复【6楼】正点原子: --------------------------------- 变0x00问题已经解决,是前一个数组太小,末尾加0,直接把这个数组首个数给冲了。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

19

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2014-8-20
在线时间
0 小时
 楼主| 发表于 2014-12-17 14:59:31 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
变0x00问题已经解决,是前一个数组太小,末尾加0,直接把这个数组首个数给冲了。
回复

使用道具 举报

19

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2014-8-20
在线时间
0 小时
 楼主| 发表于 2014-12-17 15:19:15 | 显示全部楼层
date[8]里面的内容为:0x31 0x37 0x31 0x32 0x31 0x34
date_gps[4]里面的内容:0x00 0x12 0x14 0x00
按理说转换后应该是:0x17 0x12 0x14 0x00 才对的啊。。。出现这样的结果,是什么原因,并且还不是每次都错,有时候就对了。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-12-17 22:54:26 | 显示全部楼层
帮顶,这函数没用过,呵呵。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

19

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2014-8-20
在线时间
0 小时
 楼主| 发表于 2014-12-18 11:02:25 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------我基本找到原因了,是接收函数的问题,我在外面看数据是对的,但是到处理数据的函数里面,就发现数据是错误的了。
回复

使用道具 举报

19

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2014-8-20
在线时间
0 小时
 楼主| 发表于 2014-12-18 11:05:27 | 显示全部楼层
回复【4楼】fly0000:
---------------------------------
原子哥,请教你一个问题,我给串口发送数据,我通过DEBUG调试,我看到内存里面的数据,跟我发的一样,并且我设置的标志,我在内存里面算出来也是一样的,但是为什么if这个判断语句不执行呢?
如果说我把那个判断条件设置简单的话,就会执行,如果比较长的话貌似就不行了。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-12-18 23:19:35 | 显示全部楼层
回复【5楼】fly0000:
---------------------------------
哪个if啊
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

19

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2014-8-20
在线时间
0 小时
 楼主| 发表于 2014-12-19 10:14:21 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
串口接收判断语句。

if(USART_GetITStatus(UART4,USART_IT_RXNE)!=RESET)
{
USART_ClearITPendingBit(UART4,USART_IT_RXNE);
USART_SendData(UART5,USART_ReceiveData(UART4));
Data_Buffer[Uart_Rx]=USART_ReceiveData(UART4);
Uart_Rx++;
if(Uart_Rx==2000)
    Uart_Rx=0;


 }        
  if((Data_Buffer[Uart_Rx-14]==0x35)&&(Data_Buffer[Uart_Rx-13]==0x33)&&(Data_Buffer[Uart_Rx-12]==0x30)&&(Data_Buffer[Uart_Rx-11]==0x30)&&(Data_Buffer[Uart_Rx-10]==0x35)&&(Data_Buffer[Uart_Rx-9]==0x41)&&(Data_Buffer[Uart_Rx-8]==0x30)&&(Data_Buffer[Uart_Rx-7]==0x30)&&(Data_Buffer[Uart_Rx-6]==0x34)&&(Data_Buffer[Uart_Rx-5]==0x33)&&(Data_Buffer[Uart_Rx-4]==0x30)&&(Data_Buffer[Uart_Rx-3]==0x30)&&(Data_Buffer[Uart_Rx-2]==0x35)&&(Data_Buffer[Uart_Rx-1]==0x33))
{
 Uart_Tx=Uart_Rx-1;

 }

  if((Data_Buffer[Uart_Tx-13]==0x35)&&(Data_Buffer[Uart_Tx-12]==0x33)&&(Data_Buffer[Uart_Tx-11]==0x30)&&(Data_Buffer[Uart_Tx-10]==0x30)&&(Data_Buffer[Uart_Tx-9]==0x35)&&(Data_Buffer[Uart_Tx-8]==0x41)&&(Data_Buffer[Uart_Tx-7]==0x30)&&(Data_Buffer[Uart_Tx-6]==0x30)&&(Data_Buffer[Uart_Tx-5]==0x34)&&(Data_Buffer[Uart_Tx-4]==0x33)&&(Data_Buffer[Uart_Tx-3]==0x30)&&(Data_Buffer[Uart_Tx-2]==0x30)&&(Data_Buffer[Uart_Tx-1]==0x35)&&(Data_Buffer[Uart_Tx]==0x33)&&(Data_Buffer[Uart_Rx-2]==0x0D)&&(Data_Buffer[Uart_Rx-1]==0x0A))   //这两个中间的就是字符串
  {

     Uart_Len=Uart_Rx-1-Uart_Tx-2;
TelFlag=1;       
  }

上面这个是不论什么时候,跟我预想的一模一样,下面这个,只有短了,才会执行,长了,就不执行了。。。


 if((Data_Buffer[Uart_Rx-14]==0x35)&&(Data_Buffer[Uart_Rx-13]==0x33)&&(Data_Buffer[Uart_Rx-12]==0x30)&&(Data_Buffer[Uart_Rx-11]==0x30)&&(Data_Buffer[Uart_Rx-10]==0x35)&&(Data_Buffer[Uart_Rx-9]==0x39)&&(Data_Buffer[Uart_Rx-8]==0x30)&&(Data_Buffer[Uart_Rx-7]==0x30)&&(Data_Buffer[Uart_Rx-6]==0x35)&&(Data_Buffer[Uart_Rx-5]==0x38)&&(Data_Buffer[Uart_Rx-4]==0x30)&&(Data_Buffer[Uart_Rx-3]==0x30)&&(Data_Buffer[Uart_Rx-2]==0x34)&&(Data_Buffer[Uart_Rx-1]==0x38))
{
 Uart_Tx=Uart_Rx-1;
 }
  if(/*(Data_Buffer[Uart_Tx]==0x35)&&(Data_Buffer[Uart_Tx+1]==0x33)&&(Data_Buffer[Uart_Tx+2]==0x30)&&(Data_Buffer[Uart_Tx+3]==0x30)&&(Data_Buffer[Uart_Tx+4]==0x35)&&(Data_Buffer[Uart_Tx+5]==0x39)&&(Data_Buffer[Uart_Tx+6]==0x30)&&(Data_Buffer[Uart_Tx+7]==0x30)&&(Data_Buffer[Uart_Tx+8]==0x35)&&(Data_Buffer[Uart_Tx+9]==0x38)&&(Data_Buffer[Uart_Tx+10]==0x30)&&(Data_Buffer[Uart_Tx2+11]==0x30)&&*/(Data_Buffer[Uart_Tx-1]==0x34)&&(Data_Buffer[Uart_Tx]==0x38)&&(Data_Buffer[Uart_Rx-2]==0x0D)&&(Data_Buffer[Uart_Rx-1]==0x0A))   //这两个中间的就是字符串
  {
     Uart_Len=Uart_Rx-2-Uart_Tx-1;
CPFlag=1;      
  }
回复

使用道具 举报

19

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2014-8-20
在线时间
0 小时
 楼主| 发表于 2014-12-19 10:15:39 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
还有一个奇怪的问题,一个数组,在没有进入处理该数组的函数前,数据是对的,进入处理函数以后,数组第一个数据就变成0x00了。
回复

使用道具 举报

19

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2014-8-20
在线时间
0 小时
 楼主| 发表于 2014-12-19 10:16:39 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
并且还不一定每次都会变成0x00,有时候就会是对的
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-27 17:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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