Работая с байтовым массивом, я получаю «недопустимое преобразование из char * в байт» - PullRequest
0 голосов
/ 25 марта 2020

Голый со мной. Я не очень хорошо пишу в Arduino / C.

Я читаю и пишу в RFID-тег с помощью MFRC522.h В настоящее время я могу прочитать UID карты и выгрузить ее в "UIDChar" UID карты обычно составляет 8 символов.

UID Example:  467EE9A9

Я могу использовать функцию mfrc522.MIFARE_SetUid, чтобы записать этот UID на новую карту. Для этого я должен установить newUID на:

0x46,0x7E,0xE9,0xA9f

Я записал это в свой код. То, что я хочу сделать, это преобразовать строку UID в байтовый массив, чтобы я мог использовать ее вместо написанных вручную 0x46,0x7E, 0xE9,0xA9.

Я использую функцию преобразования для преобразования UID в этот формат. Это может быть отображено с помощью «buf».

Serial.println(buf);

Теперь моя проблема. Если я заменим

byte newUid[] = {0x46,0x7E,0xE9,0xA9f};

на

byte newUid[] = {buf};

, я получу ошибочное преобразование из 'char *' в 'byte {aka unsigned char}'

How я могу установить свой "newUid" как "buf"?

#define SS_PIN 0  //D2
#define RST_PIN 2 //D1

#include <SPI.h>
#include <MFRC522.h>


/* For RFID */
MFRC522 mfrc522(SS_PIN, RST_PIN);   // Create MFRC522 instance.
char buf[40]; // For string to byte array convertor

void convert(char *s)
{
 int i, j, k;
 buf[0] = 0x0;

 for (j = 0, i = 0, k = 0; j < strlen(s); j++)
 {

   if (i++ == 0) {
     buf[k++] = '0';
     buf[k++] = 'x';
   }

   buf[k++] = s[j];

   if (i == 2) {
     if(j != strlen(s) -1)  buf[k++] = ',';
     i = 0;
   }
 }

buf[k] = 0x0;

}

void clone() {

 /* RFID Read */
  // Look for new cards
  if ( ! mfrc522.PICC_IsNewCardPresent())
  {
    return;
  }
  // Select one of the cards
  if ( ! mfrc522.PICC_ReadCardSerial())
  {
    return;
  }
  //Show UID on serial monitor
  Serial.println();
  Serial.print(" UID tag :");

  //  Very basic UID dump
  unsigned int hex_num;
  hex_num =  mfrc522.uid.uidByte[0] << 24;
  hex_num += mfrc522.uid.uidByte[1] << 16;
  hex_num += mfrc522.uid.uidByte[2] <<  8;
  hex_num += mfrc522.uid.uidByte[3];

  // Get UID
  int  NFC_id = (int)hex_num;
  Serial.print(NFC_id, HEX);

  // Convert UID to string using an int and a base (hexadecimal)
  String stringUID =  String(NFC_id, HEX);
  char UIDChar[10];
  stringUID.toCharArray(UIDChar,10);

  delay(1000);
  Serial.println();


  // Convert to uppercase
  for (int i = 0; i < strlen(UIDChar); i++ )
  {
    if ( UIDChar[i] == NULL ) break;
    UIDChar[i] = toupper(UIDChar[i]);
  }

  //Serial.print( &UIDChar[0] );
  Serial.println();
  convert(UIDChar);
  Serial.println(buf);

   /* RFID Write */

   // Set new UID
   //  Change your UID hex string to 4 byte array

   // I get error if I use byte newUid[] = {buf};
 /*  ERROR HERE */
  byte newUid[] = {0x46,0x7E,0xE9,0xA9};
  if ( mfrc522.MIFARE_SetUid(newUid, (byte)4, true) ) {
    Serial.println( "Wrote new UID to card." );
  }

  // Halt PICC and re-select it so DumpToSerial doesn't get confused
  mfrc522.PICC_HaltA();
  if ( ! mfrc522.PICC_IsNewCardPresent() || ! mfrc522.PICC_ReadCardSerial() ) {
    return;
  }

  // Dump the new memory contents
  Serial.println( "New UID and contents:" );
  mfrc522.PICC_DumpToSerial(&(mfrc522.uid));

}

void setup() {

  Serial.begin ( 115200 );

  /* RFID */
  SPI.begin();      // Initiate  SPI bus
  mfrc522.PCD_Init();   // Initiate MFRC522

  clone();

}

void loop() {

} 

1 Ответ

0 голосов
/ 25 марта 2020

Когда вы пишете

byte newUid[] = {buf};

, вы пытаетесь инициализировать newUid одним элементом (в вашем {} есть только один элемент), и этот элемент - buf, который является char* (или char[]). Вот почему вы получаете ошибку - вы пытаетесь присвоить массив с одним char* переменной, элементы которой byte s.

Без подробного чтения вашего полного кода, я не знаю, почему вы пытаетесь выполнить это назначение, а не просто использовать массив buf как есть. Но чтобы решить проблему, вы, вероятно, просто хотите использовать

byte* newUid = buf;
...