Необходимо прочитать значение элементов массива из одной функции внутри другой функции, используя указатель - PullRequest
0 голосов
/ 27 марта 2019

Я разрабатываю код, в котором мне нужно прочитать значение из одной функции («Read ()») в другую функцию («сравнить»), используя указатель. Необходим доступ к значениям «буфера», присутствующим в функции «Read ()». Я пробовал подход ниже, я новичок в реализации указателей, поэтому не могу много попробовать. В «буфере» будет 9 элементов, которые я скопировал в «adata» в функции «Read ()», эти данные должны быть в функции «сравнения». Ниже приведен фрагмент кода:

    int16_t *Read (uint8_t *buffer, const uint16_t length)
    {
      static uint32_t totalBytes = 0;
      static uint32_t respNo = 0;
      int i;

      GPIO_ClearValue(PMAP_GPIO_PORT_DIR_RS485, PMAP_GPIO_PIN_DIR_RS485);             

      UartRxFlush(UARW_UART_INDEX_RS485); //this function needs to be executed after the GPIO_ClearValue in order to remove the "zero" value from the buffer
      respNo++;

      int counter = 0; // counts n. valid bytes put in slave response buffer[]
      do 
      {
        OSTimeDly(2);

        int8_t newBytesRcv = UartReceive(UARW_UART_INDEX_RS485,
                                         (uint8_t*)&(buffer[counter]), length-counter);
        totalBytes += newBytesRcv;
        counter = totalBytes;
      }
      while (counter < length);

      totalBytes = 0;
      printf("\n");
      printf("Byte received........");
      int16_t adata[9] = {0x09,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30};  

      for (i=0; i<9;i++)
      {
       printf("%d  ",buffer[i]);
       adata[i] = buffer[i];
      } 
       printf("\n");

    }

    int16_t Compare(uint8_t * message, uint16_t len)
    {
      rs485_message_t rs485Msg;
      int StP15Vmsg[9] = {0x09,0x31,0x33,0x30,0x30,0x30,0x30,0x30,0x34};    
      int adata[9] = {0x09,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30};  
      uint8_t buffer[9];
      const uint8_t length;
      for (int j=0; j<=9; j++)
      {
       adata[j] = *Read(buffer, j);
      }
if(compareArray(FWmsg,arduinodata,7)==0)
  {  

   char res;  
   uint8_t add, fwcommand, fwaction;
   uint16_t fwvalue;
   rs485_message_t rs485Msg; 
   proto485ComposeMsg(&rs485Msg, &add, &fwcommand, &fwaction, &fwvalue);
   res = GetABFWversion(&add, &fwcommand, &fwaction, &fwvalue); 
  }
     }

Пожалуйста, руководство ....

Спасибо

1 Ответ

0 голосов
/ 27 марта 2019

Примечание: это не stricto sensu «ответ», а список замечаний


О Чтение

подпись

int16_t *Read (uint8_t *buffer, const uint16_t length)

но функция никогда не возвращает значение, возможно, вы хотите вернуть количество прочитанных байтов, в этом случае

int16_t Read (uint8_t *buffer, const uint16_t length)

Статическая переменная respNo только увеличивается и никогда не используется, эти две строки могут быть удалены:

static uint32_t respNo = 0;
respNo++;

ТамНет никакой причины иметь totalBytes статическим, потому что вы устанавливаете его значение равным 0, прежде чем печатать буфер, поэтому нет исторического перехода от вызова к следующему.Это должно быть local .

counter бесполезно, поскольку оно всегда имеет значение totalBytes


UartReceive всегда успешно и никогда не возвращает значение, указывающее на ошибку?

  • , если да, оно бесполезно Read возвращает значение, потому что оно всегда будет length
  • если нет, вы должны принять во внимание ошибку и, вероятно, Read должны вернуть totalBytes значение количества прочитанных байтов

В

 printf("\n");
 printf("Byte received........");
 int16_t adata[9] = {0x09,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30}; 

 for (i=0; i<9;i++)
 {
  printf("%d  ",buffer[i]);
  adata[i] = buffer[i];
 } 
  printf("\n");
  • Вы делаете цикл от 1 до 9, а не от 0 до 8, так что вы по крайней мере выходите из adata и выне печатайте значение первого байта в буфере
  • , вы только устанавливаете adata и никогда не используете его, его можно удалить.
  • формат должен быть % u , а не % d

Возможно, цикл должен быть от 0 до totalBytes - 1, чтобы быть совместимым с кодом выше:

 printf("\nByte received : ");

 for (i=0; i<totalBytes;i++)
 {
  printf("%u ",buffer[i]);
 } 
 putchar('\n');

О Сравнить

В

 rs485_message_t rs485Msg;
 int StP15Vmsg[9] = {0x09,0x31,0x33,0x30,0x30,0x30,0x30,0x30,0x34};    
 int adata[9] = {0x09,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30};  
 uint8_t buffer[9];
 const uint8_t length;
 for (int j=0; j<=9; j++)
 {
  adata[j] = *Read(buffer, j);
 }

rs485Msg и StP15Vmsg бесполезны, удалите их

Я не понимаю, почему вы вызываете Read несколько раз в цикле с длиной, увеличенной на каждуювремя, поэтому вы будете перезаписывать несколько раз в буфер .Я тоже не понимаю, пока вы сохраняете возвращаемое значение Чтение (которые возвращают значение в настоящее время)

Возможно, вы хотите именно это:

uint8_t buffer[9];
uint8_t length = Read(buffer, 9);

In

if(compareArray(FWmsg,arduinodata,7)==0)
 {     
  char res;  
  uint8_t add, fwcommand, fwaction;
  uint16_t fwvalue;
  rs485_message_t rs485Msg; 
  proto485ComposeMsg(&rs485Msg, &add, &fwcommand, &fwaction, &fwvalue);
  res = GetABFWversion(&add, &fwcommand, &fwaction, &fwvalue); 
 }

У меня нет связи с кодом выше, а res установлено, но никогда не используется


Сравнить никогда не делает сравнения, почему оно называется Сравнить ?Он никогда не возвращает значение, какое значение он должен возвращать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...