OpenEdv-开源电子网

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

直接打印出来是对的,存储后再打印就是错误!!

[复制链接]

19

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2014-8-20
在线时间
0 小时
发表于 2014-11-11 16:43:47 | 显示全部楼层 |阅读模式
5金钱
[mw_shl_code=c,true]if(USART_GetITStatus(UART4, USART_IT_RXNE) != RESET) { USART_ClearITPendingBit(UART4, USART_IT_RXNE); Receive[bufferRx]=USART_ReceiveData(UART4); USART_SendData(UART5,Receive[bufferRx]); //缓存COM4中断接收的数据 bufferRx++; { /************************先比对DW对应的unicode: 0043和0057结尾430057, 比对成功后,设置第一个标志位buffterTx1**************************************/ if((Receive[bufferRx-6]==0x34)&&(Receive[bufferRx-5]==0x34)&&(Receive[bufferRx-4]==0x30)&&(Receive[bufferRx-3]==0x30)&&(Receive[bufferRx-2]==0x35)&&(Receive[bufferRx-1]==0x37)) { bufferTx1=bufferRx-1; bufferTx2=bufferTx1; } /************************从标志位开始430057开始到#结束FF03中间的数据,就是我们需要提取的数据******************************************************/ if((Receive[bufferTx1]==0x37)&&(Receive[bufferRx-4]==0x46)&&(Receive[bufferRx-3]==0x46)&&(Receive[bufferRx-2]==0x30)&&(Receive[bufferRx-1]==0x33)) //这两个中间的就是字符串 { bufferLen=bufferRx-1-bufferTx1; USART_Printf(UART5,"\r\n") ; /**************************************************************************把需要的数据打印出来************************************************************************/ for(i=0;i<bufferLen;i++,bufferTx1++) USART_SendData(UART5, Receive[bufferTx1+1]); for(i=0;i<bufferLen;i++,bufferTx2++) stringstore=Receive[bufferTx2+1]; /**************************************************************************把打印过的数据保存在数组中************************************************************************/ USART_Printf(UART5,stringstore) ;[/mw_shl_code]
出现的问题是,直接打印,数据是我需要的数据,是对的。
保存在数组中以后,再打印出来,就少一段。
程序我没找出来任何问题。
循环次数i,我打印出来,也是对的,也就是说在存储的时候,也是次数循环够了,但是数组里面存储的信息,就是不对。。。。。。我把整个大的Receive[]数组里面的数据全部打印出来,数据信息也是对。。。
那问题就出在我存储数据那里了。。但是存储数据,就一行程序。。完全搞不明白了。

最佳答案

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

上面代码很多,你这是接收中断的处理么? 如果是,肯定有问题。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-11-11 16:43:48 | 显示全部楼层
上面代码很多,你这是接收中断的处理么?
如果是,肯定有问题。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

34

主题

805

帖子

4

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1865
金钱
1865
注册时间
2011-3-29
在线时间
140 小时
发表于 2014-11-11 16:43:48 | 显示全部楼层
[mw_shl_code=c,true]for(i=0;i<bufferLen;i++,bufferTx2++) stringstore=Receive[bufferTx2+1]; USART_Printf(UART5,stringstore) ; [/mw_shl_code]

USART_Pringt()函数是怎样实现的?是怎样判断输入数组结尾的?是不是要加个stringstore=0?
stringstore是全局变量还是局部变量?是不是在哪里被修改了?
业余程序玩家。
回复

使用道具 举报

19

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2014-8-20
在线时间
0 小时
 楼主| 发表于 2014-11-11 16:43:48 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
我找到问题了,4楼  ofourme说对了,是printf函数的问题,没想明白这个printf哪里有问题,我用 
 for(i=0;i<bufferLen;i++) 
    USART_SendData(UART5,stringstore); 
这样发送就对了。。是我要的结果。>
回复

使用道具 举报

19

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2014-8-20
在线时间
0 小时
 楼主| 发表于 2014-11-12 18:18:55 | 显示全部楼层
原子大神,放进主程序里面处理还是一样不行啊。。。。
我比对成功后,中断里面马上关闭接收中断,然后进入主程序去处理。
 if((Receive[bufferTx1]==0x37)&&(Receive[bufferRx-4]==0x46)&&(Receive[bufferRx-3]==0x46)&&(Receive[bufferRx-2]==0x30)&&(Receive[bufferRx-1]==0x33))   //这两个中间的就是字符串
 {
    bufferLen=bufferRx-1-bufferTx1;
    USART_ITConfig(UART4, USART_IT_RXNE, DISABLE);//失能接受中断,在接受移位 寄存器中有数据是产生
}


主程序在把刚才接收到的存储起来。。
for(i=0;i<bufferLen;i++,bufferTx1++) 
    stringstore=m35Receive[bufferTx1+1];
       USART_Printf(UART5,stringstore) ;
tx4=strlen(stringstore);
        USART_SendData(UART5,tx4); 
USART_SendData(UART5,i); 


我在中断里面求出来的bufferlen的值是0x30  也就是48,是对的。。
打印出来,就是错的。。多了4位。
然后我打印出来的tx4确是0x34,i是0x33
这个程序很简单,但是我就是找不出来问题在哪里。。>
回复

使用道具 举报

19

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2014-8-20
在线时间
0 小时
 楼主| 发表于 2014-11-12 18:20:05 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子大神,看到我上面的问题了吗?我想了好几天,都没想明白,为什么不对,另外一个人的程序和我基本一模一样,他的程序就是对的。。。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-11-12 22:53:11 | 显示全部楼层
回复【4楼】fly0000:
---------------------------------
 既然有另外一个人是好使的,何不参考下呢?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

19

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2014-8-20
在线时间
0 小时
 楼主| 发表于 2014-11-13 08:05:41 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
我看了他的,除了脚下标不一样,其他基本一模一样。我也让他帮我找问题,他也没有找到问题。他也说我的除了下标不一样,其他都一样,这就是一个接收中断判断,然后加了一个for循环赋值,然后打印。
上次我也是遇到了串口收到数据异常,但是之前几天,都是好的,我查了3天,也没找到问题,我就用他的程序继续往下做了,这次又遇到这个问题了,不能每次都回避这个问题。
回复

使用道具 举报

19

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2014-8-20
在线时间
0 小时
 楼主| 发表于 2014-11-13 08:07:45 | 显示全部楼层
回复【5楼】ofourme:
---------------------------------
是全局变量。我的都是在main函数里面放着的。  我的打印函数如下:
void USART_Printf(USART_TypeDef* USARTx,char *pch) 
{
/* 这里是判断'\0'是否到了字符串的行尾,这个字符是看不到的,字符串的结束符就是'\0'
 * 如果具体还有不懂的请看C语言,这里通过while()循环,逐个字符逐个字符的传输和显示 */
    while(*pch != '\0')  /* 我们这里用指针表示,*pch就是一个字符,pch就是该字符的地址 */
{
        USART_SendData(USARTx,*pch); /* 在这里我们将这个要显示的字符地址传输给另外一个函数 */

/* 当发送完一个字节后,检测一下“TDR(串口的数据传输寄存器)”是否为空了,因为有可能在一些
 * 其他某些模式,缓冲寄存器可能会有很多数据,需要一点时间才能清空,其实增加了这句代码之后
 * 会让我们的串口驱动更加健壮,在各种情况下都能正常稳定的工作 */
while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET); 
/* 以下是我们查看《STM32F103中文手册》获得494页24.6.1节 状态寄存器(USART_SR)章节
这里说的就是我们程序代码里的USART_FLAG_TXE这个标志位,发送完毕后,再进行标志清空,进行下一次传输
TXE:发送数据寄存器空
当TDR寄存器中的数据被硬件转移到移位寄存器的时候,该位被硬件置位。
0:数据还没有被转移到移位寄存器;
1:数据已经被转移到移位寄存器。
注意:单缓冲器传输中使用该位。*/
  USART_ClearFlag(USARTx, USART_FLAG_TXE);
        pch++;    /* 此时pch地址加1,指向下一个字符 */
    }
}


void USART_SendData(USART_TypeDef* USARTx, u16 Data)
{
  /* Check the parameters */
  assert_param(IS_USART_ALL_PERIPH(USARTx));
  assert_param(IS_USART_DATA(Data)); 
    
  /* Transmit Data */
  USARTx->DR = (Data & (u16)0x01FF);
  while (!(USARTx->SR & USART_FLAG_TXE));

}
这个函数应该没有啥问题。
回复

使用道具 举报

19

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2014-8-20
在线时间
0 小时
 楼主| 发表于 2014-11-13 08:24:19 | 显示全部楼层
回复【5楼】ofourme:
---------------------------------
以前我也这样试过,不用printf,打印出来也是错误的,那会设置的那个长度有问题,所以是错的。
我一直用printf这个函数,所以没发现什么问题,错误原因原来在printf。。。
回复

使用道具 举报

34

主题

805

帖子

4

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1865
金钱
1865
注册时间
2011-3-29
在线时间
140 小时
发表于 2014-11-13 12:06:58 | 显示全部楼层
[mw_shl_code=c,true]for(i=0;i<bufferLen;i++,bufferTx2++) stringstore=Receive[bufferTx2+1]; stringstore=0;[/mw_shl_code]

业余程序玩家。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-29 04:47

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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