Сравнивание 'unsigned char buffer[64]'

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем SerRay, 7 ноя 2014.

  1. SerRay

    SerRay Нерд

    Есть скетч, считывающий RFID метки :
    Код (Text):
    // link between the computer and the SoftSerial Shield
    //at 9600 bps 8-N-1
    //Computer is connected to Hardware UART
    //SoftSerial Shield is connected to the Software UART:D2&D3
    #include <SoftwareSerial.h>
    SoftwareSerial SoftSerial(2, 3);
    unsigned char buffer[64]; // buffer array for data recieve over serial port
    int count=0;    // counter for buffer array
    void setup()
    {
      SoftSerial.begin(9600);              // the SoftSerial baud rate
      Serial.begin(9600);            // the Serial port of Arduino baud rate.
    }
    void loop()
    {
      if (SoftSerial.available())              // if date is comming from softwareserial port ==> data is comming from SoftSerial shield
      {
        while(SoftSerial.available())          // reading data into char array
        {
          buffer[count++]=SoftSerial.read();    // writing data into array
          if(count == 64)break;
      }
        Serial.write(buffer,count);            // if no data transmission ends, write buffer to hardware serial port
        clearBufferArray();              // call clearBufferArray function to clear the storaged data from the array
        count = 0;                      // set counter of while loop to zero
      }
      if (Serial.available())            // if data is available on hardwareserial port ==> data is comming from PC or notebook
        SoftSerial.write(Serial.read());      // write it to the SoftSerial shield
    }
    void clearBufferArray()              // function to clear buffer array
    {
      for (int i=0; i<count;i++)
        { buffer[i]=NULL;}                  // clear all index of array with command NULL
    }
    Выдает на выходе 638746834DA3. Как сравнить эту строку с эталоном? Если совпадает, то одно условие,, если не совпадает, то другое.
     
  2. SerRay

    SerRay Нерд

    Я предположил и сделал так : в начале вписал эталонную строку:
    Код (Text):
    unsigned char buffer2[64] = {'8','7','5','8','8','6','D','F','5','8','8','6'};
    А в теле поставил условие :
    Код (Text):
    void loop()
    {
      if (SoftSerial.available())              // if date is comming from softwareserial port ==> data is comming from SoftSerial shield
      {
        while(SoftSerial.available())          // reading data into char array
        {
          buffer[count++]=SoftSerial.read();    // writing data into array
          if(count == 64) break;
          if  (buffer[count]==buffer2[count]) {Serial.print('OK');}
          else {Serial.print('WRONG');}
     
        Serial.write(buffer,count);            // if no data transmission ends, write buffer to hardware serial port
        clearBufferArray();              // call clearBufferArray function to clear the storaged data from the array
        count = 0;                      // set counter of while loop to zero
      }
      if (Serial.available())            // if data is available on hardwareserial port ==> data is comming from PC or notebook
        SoftSerial.write(Serial.read());      // write it to the SoftSerial shield
    }
    }
    В результате получил : WRONGWRONGWRONGWRONGWRONGWRONGWRONGWRONGWRONGWRONGWRONGOKOKOK

    "ОК" напечатал на месте НЕдостающийх символов в эталонной строке. Если эталонная строка выглядит :
    Код (Text):
    unsigned char buffer2[64] = {};
    то выдает : OKOKOKOKOKOKOKOKOKOKOKOKOK
     
  3. Unixon

    Unixon Оракул Модератор

    Вы же сначала count++ делаете, а потом сравнение не пойми чего. "ОК" на нулях м\б выскакивает...
     
    SerRay нравится это.
  4. SerRay

    SerRay Нерд

    Код (Text):
    void loop()
    {
      if (SoftSerial.available())              // if date is comming from softwareserial port ==> data is comming from SoftSerial shield
      {
        while(SoftSerial.available())          // reading data into char array
        {
          buffer[count++]=SoftSerial.read();    // writing data into array
    if  (buffer[count]==buffer2[count]) {Serial.print('OK');}
          else {Serial.print('WRONG');}
          if(count == 64) break;

        Serial.write(buffer,count);            // if no data transmission ends, write buffer to hardware serial port
        clearBufferArray();              // call clearBufferArray function to clear the storaged data from the array
        count = 0;                      // set counter of while loop to zero
      }
      if (Serial.available())            // if data is available on hardwareserial port ==> data is comming from PC or notebook
        SoftSerial.write(Serial.read());      // write it to the SoftSerial shield
    }
    }
    Надо так? Или еще раньше? Может нужен какой-то завершающий символ типа "\0" типа :
    Код (Text):
    unsigned char buffer2[64] = {'8','7','5','8','8','6','D','F','5','8','8','6','\0'};
     
  5. Unixon

    Unixon Оракул Модератор

    Нет. Зачем вы count++ делаете сразу после чтения из порта? У вас же сравниваются после этого еще не принятые значения! Переносите инкремент в конец цикла.
     
    SerRay нравится это.
  6. SerRay

    SerRay Нерд

    Прошу прощения, потерял скобку :
    Код (Text):
    void loop()
    {
      if (SoftSerial.available())              // if date is comming from softwareserial port ==> data is comming from SoftSerial shield
      {
        while(SoftSerial.available())          // reading data into char array
        {
          buffer[count++]=SoftSerial.read();    // writing data into array
    if  (buffer[count]==buffer2[count]) {Serial.print('OK');}
          else {Serial.print('WRONG');}
          if(count == 64) break;
    }
        Serial.write(buffer,count);            // if no data transmission ends, write buffer to hardware serial port
        clearBufferArray();              // call clearBufferArray function to clear the storaged data from the array
        count = 0;                      // set counter of while loop to zero
      }
      if (Serial.available())            // if data is available on hardwareserial port ==> data is comming from PC or notebook
        SoftSerial.write(Serial.read());      // write it to the SoftSerial shield
    }
     
    Вот так у меня написан код.
     
  7. Unixon

    Unixon Оракул Модератор

    Код (Text):

    void loop()
    {
      if (SoftSerial.available())              // if date is comming from softwareserial port ==> data is comming from SoftSerial shield
      {
        while(SoftSerial.available())          // reading data into char array
        {
          buffer[count]=SoftSerial.read();    // writing data into array
    if  (buffer[count]==buffer2[count]) {Serial.print('OK');}
          else {Serial.print('WRONG');}
          if(count == 64) break;
      count++;
    }
        Serial.write(buffer,count);            // if no data transmission ends, write buffer to hardware serial port
        clearBufferArray();              // call clearBufferArray function to clear the storaged data from the array
        count = 0;                      // set counter of while loop to zero
      }
      if (Serial.available())            // if data is available on hardwareserial port ==> data is comming from PC or notebook
        SoftSerial.write(Serial.read());      // write it to the SoftSerial shield
    }
     
     
     
    SerRay нравится это.
  8. SerRay

    SerRay Нерд

    :confused:Это все объясняет! Спасибо! Вечером протестирую.:)
     
  9. SerRay

    SerRay Нерд

    Все отлично проверяет! Выяснил что с RFID первый байт считывается входной, а последний закрывающий...в результате следует сравнивать со строкой:
    Код (Text):
    unsigned char buffer1[64] = {'1','7','1','0','0','8','6','3','B','5','5','9','9','1'};
    где первый и последний символы никогда не совпадают с прикладываемой картой...поэтому для утверждения идентичности номера достаточно зафиксировать 12 совпадений. (между эталонной строкой и считанной с устройства)
     
  10. TOP_GUN

    TOP_GUN Нуб

    Просто супер! Спасибо вам большое, думал сойду с ума с этим сканером) сам бы точно не допер до этого прикола с первым и последним байтом.