为什么使用USART接收的数据都是同一个

2019-07-20 17:02发布

USART2接收的数据 USART2接收的数据 代码 代码
如上图所示,USART2接收的数据,全部代码如下:
/****************************************Copyright (c)****************************************************
**                                      
**                           
**
**--------------File Info---------------------------------------------------------------------------------
** File name:               uctsk_Blink.c
** Descriptions:            The uctsk_Blink application function
**
**--------------------------------------------------------------------------------------------------------
** Created by:              AVRman
** Created date:            2016-2-6
** Version:                 v1.0
** Descriptions:            The original version
**
**--------------------------------------------------------------------------------------------------------
** Modified by:            
** Modified date:           
** Version:                 
** Descriptions:            
**
*********************************************************************************************************/

/* Includes ------------------------------------------------------------------*/
#include <includes.h>            
#include "ip.h"
#include "lwip/api.h"
#include "lwip/tcpip.h"
#include "lwip/memp.h"
#include "lwip/stats.h"
#include "netif/loopif.h"
#include "search.h"
#include "sockets.h"
#include "lwIP.h"
#include "netif.h"

/* Private variables ---------------------------------------------------------*/
static  OS_STK         App_TaskExhaustkStk[APP_TASK_EXHAUST_STK_SIZE];
static  OS_STK         App_TaskLWIPReceiveStk[APP_TASK_LWIPRECEIVE_STK_SIZE];
static void USART_START(INT32U baud_rate);
static void USART_SendStr(int *pucStr,int ulNum);//·¢&#203;í&#214;&#184;á&#238;oˉêy
static void USART_ReceiveStr(int *recv,int len);
static void USART_RecvData();
static void USART2_IRQHandler2() ;
static void GPIO_Configuration(void);
static void GPIO_LedOn(void);
static void GPIO_LedOn3(void);
static void NVIC_Configure(void);

/* Private function prototypes -----------------------------------------------*/
static void   uctsk_ExhaustAna         ();
static void   uctsk_LWIPReceive      (void);

int socket;
int Uart2_Rx;
int Uart2_Tx;
int Uart2_Len;
int Uart2_Sta=0;
int Uart2_Buffer[140];//êy&#190;Y3¤&#182;è
int Uart2_Buffer1[140];
int Status;//×′ì&#172;
int Res;
int TOPLC[10];

//static void usartReceive(int*Uart2_Rx,int Uart2_Len);


void  App_ExhaustAnaTaskCreate (void)
{
   CPU_INT08U  os_err;

        os_err = os_err; /* prevent warning... */

        os_err = OSTaskCreate((void (*)(void *)) uctsk_ExhaustAna,                               
                          (void          * ) 0,                                                       
                          (OS_STK        * )&App_TaskExhaustkStk[APP_TASK_LWIPRECEIVE_STK_SIZE - 1],               
                          (INT8U           ) APP_TASK_EXHAUST_PRIO  );                                                       

        #if OS_TASK_NAME_EN > 0
            OSTaskNameSet(APP_TASK_EXHAUST_PRIO, " Task Exhaust Analyze", &os_err);
        #endif

}





void  App_LWIPReceiveTaskCreate (void)
{
   CPU_INT08U  os_err;

        os_err = os_err; /* prevent warning... */

        os_err = OSTaskCreate((void (*)(void *)) uctsk_LWIPReceive,                               
                          (void          * ) 0,                                                       
                          (OS_STK        * )&App_TaskLWIPReceiveStk[APP_TASK_EXHAUST_STK_SIZE - 1],               
                          (INT8U           ) APP_TASK_LWIPRECEIVE_PRIO  );                                                       

        #if OS_TASK_NAME_EN > 0
            OSTaskNameSet(APP_TASK_LWIPRECEIVE_PRIO, " Task LWIPReceive ", &os_err);
        #endif

}


static void   uctsk_LWIPReceive      (void)
{
       

        int err;
//   int newsocetTemp;
   struct ip_addr ipaddr;
   char recvbuff[100];
   u32_t len;
   struct sockaddr_in sin;
   struct sockaddr_in adressClient;
   struct sockaddr    sockaddr_name;
   uint8_t dataH=0,dataL=0;
   uint16_t        enginespeed=0,pedal=0;
   uint16_t count=0;

   Ethernet_Initialize();

   Init_lwIP();

   lwip_socket_init();
  // SpeedTansducer_Init();


   IP4_ADDR(&ipaddr, 192, 168, 0, 1 );
   socket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
   sin.sin_len = sizeof(sin);
   sin.sin_family = AF_INET;
   sin.sin_port = htons(2600);
   sin.sin_addr.s_addr = ipaddr.addr;
   sockaddr_name=  *((const struct sockaddr*)&sin);
//  bind(socket,(const struct sockaddr*)&sin,sizeof( struct sockaddr));

   len=sizeof(struct sockaddr);
  // listen(socket,5);
   err=connect(socket,(const struct sockaddr*)&sin,sizeof( struct sockaddr));

  // if(USART_GetITStatus(USART2,USART_IT_RXNE)!=RESET)
       



}






static void uctsk_ExhaustAna ()
{
       

        int increase=0;
        int  receive[120];
       
        int measure[6]={0xAA,0x03,0x43,0x16,0x01,0xA3};
        int stop[6]={0xAA,0x03,0x43,0x16,0x00,0xA4};
        int check[7]={0xAA, 0x04 ,0x43 ,0x11, 0xFF, 0x01 ,0xA8};
        USART_START(9600);
        USART_SendStr(measure,6);
         USART_ITConfig(USART2, USART_IT_TXE, DISABLE);
         //USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
       

       
        OSTimeDlyHMSM(0, 0, 3, 0);       
       
                        while(1)
                        {               
                                USART_SendStr(check,7);
                                OSTimeDlyHMSM(0, 0,5, 0);       
             USART_ITConfig(USART2, USART_IT_TXE, DISABLE);
             //USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
                               
                                USART2_IRQHandler2();       
                                OSTimeDlyHMSM(0, 0,1, 0);

                        }



  }         
         

/*·¢&#203;í&#214;&#184;á&#238;*/
static void USART_SendStr(int *pucStr,int ulNum)       //·¢&#203;íò&#187;′&#174;&#214;&#184;á&#238;
{
        int i;
       
        for(i=0;i<ulNum;i++)
                {
                        //while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET);
                        while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET);
                        USART_SendData(USART2,*pucStr++);       
                  
     OSTimeDlyHMSM(0, 0,0, 10);

                                          
                }
}



/*USART&#197;&#228;&#214;&#195;&#199;é&#191;&#246;*/
static void USART_START(INT32U baud_rate)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;

  /*RCC  Configuration*/
  RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO ,ENABLE);

  RCC_APB1PeriphClockCmd( RCC_APB1Periph_USART2 ,ENABLE);

         /*GPIO Configuration*/
  GPIO_PinRemapConfig(GPIO_Remap_USART2,ENABLE);

  /*
  *  USART2_TX -> PD5 , USART2_RX -> PD6
  */                               
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;                
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOD, &GPIO_InitStructure);


  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;                
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOD, &GPIO_InitStructure);
       
         /*NVIC Configuration*/
        NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;        
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);   

  /*USART Configuration*/
  USART_InitStructure.USART_BaudRate = baud_rate;
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
  USART_InitStructure.USART_Parity = USART_Parity_No;
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

  USART_Init(USART2, &USART_InitStructure);
  USART_ClearFlag(USART2,USART_FLAG_TC);
  USART_Cmd(USART2, ENABLE);

}

static void GPIO_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

  RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOD , ENABLE);                                                  
/**
*  LED1 -> PD2 , LED2 -> PD3 , LED3 -> PD4 , LED4 -> PD7
*/                                         
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOD, &GPIO_InitStructure);
}



/************************************************************************/
/******************************&#214;D&#182;&#207;&#189;óê&#213;êy&#190;Y*************************/



void USART2_IRQHandler2(void)          
{

        if(USART_GetFlagStatus(USART2,USART_IT_RXNE)==SET) //&#189;óê&#213;&#214;D&#182;&#207;óDD§
        {           
                  USART_ClearITPendingBit(USART2,USART_IT_RXNE);//&#199;&#229;3y&#214;D&#182;&#207;±ê&#214;&#190;
           for(Uart2_Rx=0;Uart2_Rx<140;Uart2_Rx++)
                 {       
                        Uart2_Buffer[Uart2_Rx] = USART_ReceiveData(USART2);//·μ&#187;&#216;USART2&#189;óê&#213;μ&#196;×&#238;&#189;üêy&#190;Y
                         USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
                         //Uart2_Rx = (Uart2_Rx + 1) % 140;
                 }
        }
       
       
}






/*********************************************************************************************************
      END FILE
*********************************************************************************************************/


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
正点原子
1楼-- · 2019-07-20 20:03
你的串口中断接收函数:
[mw_shl_code=cpp,true] for(Uart2_Rx=0;Uart2_Rx<140;Uart2_Rx++)
                 {        
                        Uart2_Buffer[Uart2_Rx] = USART_ReceiveData(USART2);//·μ&#187;&#216;USART2&#189;óê&#213;μ&#196;×&#238;&#189;üêy&#190;Y
                         USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
                         //Uart2_Rx = (Uart2_Rx + 1) % 140;
                 }[/mw_shl_code]

这是个大bug啊。。。在for循环里面接收!!错误的!!在中断里面,进入一次,只接收1个数据。你要接收N个数据,就得进入N次,不要用for!!
正点原子
2楼-- · 2019-07-20 20:10
得看你的发送数据是什么样的 了
天涯下的彩虹
3楼-- · 2019-07-21 00:22
 精彩回答 2  元偷偷看……
天涯下的彩虹
4楼-- · 2019-07-21 04:14
天涯下的彩虹 发表于 2017-2-7 08:34
发送的是一串命令,然后返回的是一串数据

没有加关闭
(1)AA 01 06 F9 AA 04 43 16 01 16 8C AA 04 43 16 01 16 8C AA 04 43 16 01 16 8C AA 04 43 16 01 16 8C AA 01 06 F9
AA 1A 43 11 FF 01 DF 00 00 00 00 00 00 00 00 00 2F 08 00 00 00 00 00 00 C9 00 00 00 B3
AA 1A 43 11 FF 01 DF 00 00 00 00 00 00 00 00 00 2F 08 00 00 00 00 00 00 C9 00 00 00 B3
AA 1A 43 11 FF 01 DF 00 00 00 00 00 00 00 00 00 2F 08 00 00 00 00 00 00 C9 00 00 00 B3
AA 1A 43 11 FF 01 DF 00 00 00 00 00 00 00 00 00 2F 08 00 00 00 00 00 00 C9 00 00 00 B3

加关闭

(2)AA 01 06 F9 AA 04 43 16 01 16 8C AA 04 43 16 01 16 8C AA 04 43 16 01 16 8C AA 04 43 16 01 16 8C AA 01 15 EA AA 01 06 F9
AA 1A 43 11 FF 01 DF 00 00 00 00 00 00 00 00 00 2F 08 00 00 00 00 00 00 C9 00 00 00 B3
AA 1A 43 11 FF 01 DF 00 00 00 00 00 00 00 00 00 2F 08 00 00 00 00 00 00 C9 00 00 00 B3
AA 1A 43 11 FF 01 DF 00 00 00 00 00 00 00 00 00 2F 08 00 00 00 00 00 00 C9 00 00 00 B3
AA 1A 43 11 FF 01 DF 00 00 00 00 00 00 00 00 00 2F 08 00 00 00 00 00 00 C9 00 00 00 B3

第三次测试数据
(3)AA 01 06 F9 AA 04 43 16 01 16 8C AA 04 43 16 01 16 8C AA 04 43 16 01 16 8C AA 04 43 16 01 16 8C AA 01 06 F9
AA 1A 43 11 FF 01 DF 00 00 00 00 00 00 00 00 00 1F 08 00 00 00 00 00 00 C9 00 00 00 C3
AA 1A 43 11 FF 01 DF 00 00 00 00 00 00 00 00 00 1F 08 00 00 00 00 00 00 C9 00 00 00 C3
AA 1A 43 11 FF 01 DF 00 00 00 00 00 00 00 00 00 1F 08 00 00 00 00 00 00 C9 00 00 00 C3
AA 1A 43 11 FF 01 DF 00 00 00 00 00 00 00 00 00 1F 08 00 00 00 00 00 00 C9 00 00 00 C3

第四次测试数据

(4)AA 01 06 F9 AA 04 43 16 01 16 8C AA 04 43 16 01 16 8C AA 04 43 16 01 16 8C AA 04 43 16 01 16 8C AA 01 06 F9
AA 1A 43 11 FF 01 DF 00 00 00 00 00 00 00 00 00 06 08 00 00 00 00 00 00 C9 00 00 00 DC
AA 1A 43 11 FF 01 DF 00 00 00 00 00 00 00 00 00 06 08 00 00 00 00 00 00 C9 00 00 00 DC
AA 1A 43 11 FF 01 DF 00 00 00 00 00 00 00 00 00 06 08 00 00 00 00 00 00 C9 00 00 00 DC
AA 1A 43 11 FF 01 DF 00 00 00 00 00 00 00 00 00 06 08 00 00 00 00 00 00 C9 00 00 00 DC


以上是我应该接受到的数据,这是在串口调试下做的,但是在程序中用USART2只能接收到一个数据AA
xuyaqi
5楼-- · 2019-07-21 05:22
天涯下的彩虹 发表于 2017-2-7 08:36
没有加关闭
(1)AA 01 06 F9 AA 04 43 16 01 16 8C AA 04 43 16 01 16 8C AA 04 43 16 01 16 8C AA 04 43 ...

你的串口接收函数要在例程的基础上加以改造,要能接收数组。
天涯下的彩虹
6楼-- · 2019-07-21 07:19
 精彩回答 2  元偷偷看……

一周热门 更多>