打印
[STM32F4]

stm32f407的串口中断收发数据的问题

[复制链接]
9487|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
penghuiyanbiyun|  楼主 | 2014-11-26 16:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我目前想实现的功能是:1、利用串口接收中断不断从串口接收数据,2、再在主函数中对接收的数据进行处理:每满8个字节且数据有效时,判断每八个字节的第二个字节,当第二个字节为01时代表这八个字节为起始命令,从这八个字节后开始保存接下来的有效数据,3、当第二个字节为02时代表这八个字节为结束命令,则结束此段数据的接收,将已经接收的数据保存下来,重新接收数据,4、将起始命令和结束命令中间的这些命令(一个命令8个字节)通过串口中断发送出去。现在遇到的问题是,利用串口助手向下位机发送一次数据后,只返回了一些乱码,然后再发送数据时,就没有反应了。现在想解决的问题是串口中断里的操作,大家帮忙看看有什么问题没 。急!!
void USART1_IRQHandler(void)
{

   if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
           {
             USART_ClearITPendingBit(USART1,USART_IT_RXNE);
         *RXDPointer=USART_ReceiveData(USART1);
                  RXDPointer++;
                  if(DataSend!=0)
                    {
                       USART_ITConfig(USART1,USART_IT_RXNE,DISABLE);
                           USART_ITConfig(USART1,USART_IT_TXE,ENABLE);
                    }
            }
  
        if(DataSend!=0)
           {
             DataSend--;
                 USART_SendData(USART1,*TXDPointer++);
                 while(USART_GetITStatus(USART1,USART_IT_TXE)==RESET);
           }
           else
           {
                   TXDPointer=SendBuffer;
                USART_ITConfig(USART1,USART_IT_TXE,DISABLE);
                USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
           }         
}
沙发
penghuiyanbiyun|  楼主 | 2014-11-26 17:07 | 只看该作者

这个中断函数有错吗?这里的发送会影响到接收数据吗?

本帖最后由 penghuiyanbiyun 于 2014-11-26 17:23 编辑

是我说得不清楚吗,为什么没有高手指点一下。。。。我现在想从最简单的功能开始实现,即把接收到的数据在中断中立即发送出去,主函数里只处理接收到的数据,然后通过不同的功能码进行点灯操作。现在是只要在中断里加发送就没法实现点灯,不加的话一切正常,可以正常的接收数据。这是接收中断,应该不需要使能发送中断吧?
void USART1_IRQHandler(void)
{

   if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
           {
             USART_ClearITPendingBit(USART1,USART_IT_RXNE);
         *RXDPointer=USART_ReceiveData(USART1);
                 USART_SendData(USART1,*RXDPointer);
                 while(USART_GetITStatus(USART1,USART_IT_TXE)==RESET);
             RXDPointer++;
                                   
            }
                     
}  

使用特权

评论回复
板凳
lyd0429| | 2014-11-26 19:01 | 只看该作者
别在中断里发,中断就用来接收数据,你在中断里while等待有可能接收数据丢了

使用特权

评论回复
地板
mmuuss586| | 2014-11-26 21:14 | 只看该作者
那你把发送数据也放在主程序里处理看看;

你上面的程序逻辑上没什么问题;

使用特权

评论回复
5
小浣熊| | 2014-11-26 23:23 | 只看该作者
个人感觉问题在中断那里!!

使用特权

评论回复
6
penghuiyanbiyun|  楼主 | 2014-11-27 08:52 | 只看该作者
lyd0429 发表于 2014-11-26 19:01
别在中断里发,中断就用来接收数据,你在中断里while等待有可能接收数据丢了 ...

2楼的那个中断函数没错的。只是一时大意写错了,把while(USART_GetITStatus(USART1,USART_IT_TXE)==RESET);
改为while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
就好了。可以将收到的数据都发出去,接收的数据也可以正常处理。现在主要是一楼的那个中断实现不了

使用特权

评论回复
7
lyd0429| | 2014-11-27 09:16 | 只看该作者
调试一下看看吧,中断里Datasend不为0,你把接收中断给关了吧

使用特权

评论回复
8
penghuiyanbiyun|  楼主 | 2014-11-27 14:44 | 只看该作者
lyd0429 发表于 2014-11-27 09:16
调试一下看看吧,中断里Datasend不为0,你把接收中断给关了吧

接收中断是在DataSend不为0的时候关掉的,试过多次还是没成功。

使用特权

评论回复
9
penghuiyanbiyun|  楼主 | 2014-11-27 14:50 | 只看该作者
mmuuss586 发表于 2014-11-26 21:14
那你把发送数据也放在主程序里处理看看;

你上面的程序逻辑上没什么问题; ...

恩,我现在是直接把发送放在主函数里,挺成功的。可是现在又有一个问题,是关于memcpy函数的,
我只需要每次将接收到的数组的四个字节的数据传到目的数组,可是当我利用memcpy(WRCommPointer,ReceiveBuffer+2,4);

实际上每次只复制了一个字节过去,只有利用memcpy(WRCommPointer,ReceiveBuffer+2,16);
才能将四个字节全部复制过去,可是除了有效的这四个字节外,后面的12个字节全为0,不知道这是为什么,是不是跟什么内存地址有关?我这里ReceiveBuffer数组和*WRCommPointer都是unsigned int型。

使用特权

评论回复
10
lyd0429| | 2014-11-27 15:11 | 只看该作者
unsigned int 是4字节的,memcpy是按字节拷贝的

使用特权

评论回复
11
penghuiyanbiyun|  楼主 | 2014-11-28 17:18 | 只看该作者
lyd0429 发表于 2014-11-27 15:11
unsigned int 是4字节的,memcpy是按字节拷贝的

恩,这个我知道。我不明白的是 我只需要取四个字节的有效数据(比如说是01 02 03 04),是不是每个字节都占了四个字节的存储空间,所以才需要取16次?可是取了16次应该01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00,那为什么取出来的数是01 02 03 04 00 00 00 00 00 00 00 00 00 00 00 00??希望有理解的人指点!

使用特权

评论回复
12
penghuiyanbiyun|  楼主 | 2014-12-4 10:12 | 只看该作者
楼上这个问题有人明白吗??请指点一下好么、。

使用特权

评论回复
13
hqtdzgs| | 2014-12-4 13:03 | 只看该作者
我们用的STM32F207,发上来的数据都是“00 00 。。。。”请高手帮忙

使用特权

评论回复
14
penghuiyanbiyun|  楼主 | 2014-12-4 14:17 | 只看该作者
hqtdzgs 发表于 2014-12-4 13:03
我们用的STM32F207,发上来的数据都是“00 00 。。。。”请高手帮忙

没弄过207 ,不过你具体情况是什么?说来大家可以一起看看

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

110

帖子

1

粉丝