Есть функция RFID, которая возвращает параметр * z4, который нужно поместить в TagID. Когда я печатаю TagID из l oop (), печатается «1» вместо «1B31687DBC7FF».
Как я могу получить все значение? Я хотел бы напечатать полную строку '1B31687DBC7FF' на последовательный порт.
#include "Arduino.h"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
int inWord = 0;
int outWord[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
int index = 0;
unsigned char Data2Calc[]= { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
unsigned short CRC2Calc = 0;
unsigned char Bytes2Calc = 9;
char z5 []= { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
const char* TagID;
void setup()
{
pinMode(13, OUTPUT);
lcd.begin(16,2);
lcd.backlight();
lcd.setCursor(0,0);
lcd.print("RFID Reader");
lcd.setCursor(0,1);
lcd.print("Skanuj TAG");
Serial.begin(9600);
Serial1.begin(9600);
lcd.setCursor(0,0);
}
void loop()
{
if (Serial1.available())
{
TagID = RFID();
}
else
{
if (index==11)
{
index=0;
Serial.print(TagID);
Serial.println("");
lcd.setCursor(0,0);
lcd.print("ID:");
lcd.print(TagID);
}
}
}
const char * RFID()
{
char z1 []= { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
char z2 []= { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
char z3 []= { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
unsigned short crc2[] = { 0 };
inWord = Serial1.read();
index++;
if (index == 1)
{
if (inWord == 1)
{
outWord[index] = inWord;
}
else
{
index=index-1;
}
}
else if (index > 1)
{
if (index == 11)
{
outWord[index] = inWord;
for (int i = 1; i <12; i++)
{
Data2Calc[i-1] = outWord[i];
}
CRC16(Data2Calc, &CRC2Calc, Bytes2Calc);
itoa(outWord[10],z1,16);
itoa(outWord[11],z2,16);
strcat(z1, z2);
*crc2 = CRC2Calc;
sprintf(z2, "%x", *crc2); //
if (strcmp(z1,z2) == 0)
{
char z4 []= { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
for (int i=1;i<10;i++)
{
itoa(outWord[i],z3,16);
if (strlen(z3)<2) strcat(z4, "0");
strcat(z4, z3);
//Serial.print(z4);
//Serial.println("");
}
//Serial.print("z4=");
//Serial.print(z4);
//Serial.println("");
strncpy(z5, z4, 18);
}
}
else
{
outWord[index] = inWord;
}
}
return z5;
}
void CRC16(unsigned char * Data, unsigned short * CRC, unsigned char Bytes)
{
int i, byte;
unsigned short C;
*CRC = 0;
for (byte = 1; byte <= Bytes; byte++, Data++)
{
C = ((*CRC >> 8) ^ *Data) << 8;
for (i = 0; i < 8; i++)
{
if (C & 0x8000)
C = (C << 1) ^ 0x1021;
else
C = C << 1;
}
*CRC = C ^ (*CRC << 8);
}
}
Полный вывод функций прилагается ниже:
Currently there are no serial ports registered - please use the + button to add a port to the monitor.
Connect to serial port COM4 at 9600
TagID: 1
ОБНОВЛЕНИЕ 1 Я приложил полный код выше. Извините ... это длинновато.
ОБНОВЛЕНИЕ 2 ОК. У меня получилось, что это немного работает, но не совсем так, как ожидалось. Я напечатал значение, как и ожидалось, но только в первый раз, когда я вызываю функцию. Если я вызываю функцию несколько раз, я получаю мусор, добавленный к напечатанному значению, как показано ниже:
Currently there are no serial ports registered - please use the + button to add a port to the monitor.
Connect to serial port COM4 at 9600
TagID: 1b31596d9cff
TagID: 1b31596d9cff1b31596d9cff
TagID: 1b31596d9cff1Řc–
ś˙cŘ1b31596d9cff
TagID: 1b31596d9cff1Řc–
ś˙cŘ1b311031596d9cff
TagID: 1b31596d9cff1Řc–
ś˙cŘ1b311031596d9cff
Есть идеи, в чем может быть проблема? Я обновил последний полный исходный код вверху сообщения. Спасибо.
ОБНОВЛЕНИЕ 3 Хорошо, наконец-то все заработало. Я изменил объявление с 'char z1 [] = ...' на 'const char z1 [] = ...' Я не уверен, что оно написано в достойном стиле ... но оно работает :) Прилагаю рабочий исходный код вверху страницы.
UPDATE 4 Нет, после нескольких тестов я должен признать, что решение из UPDATE 3 НЕ работает. На самом деле, он читает правильно, но только в первый раз ... затем программа вылетает и ... она снова считывает RFID в первый раз ... так что похоже, что он читает нормально, но это не так.
Последовательный вывод для 5 показаний выглядит следующим образом:
Currently there are no serial ports registered - please use the + button to add a port to the monitor.
Connect to serial port COM4 at 9600
1b31596d9cff
1b31596d9cff1b31596d9cff
1b31596d9cff1Řc–
ś˙cŘ1b31596d9cff
1b31596d9cff1Řc– ś˙cŘ1b311031596d9cff
1b31596d9cff1Řc– ś˙cŘ1b311031596d9cff
Есть подсказки, что не так с кодом?
ОБНОВЛЕНИЕ 5 ОК. Наконец-то он заработал ... по крайней мере, из того, что я вижу. Я изменил размер таблиц, переработал способ отображения HEX и внес несколько небольших изменений. Весь исходный код обновлен вверху.