Передача / печать параметров в Arduino - PullRequest
0 голосов
/ 11 июля 2020

Есть функция 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 и внес несколько небольших изменений. Весь исходный код обновлен вверху.

1 Ответ

1 голос
/ 11 июля 2020

TagID - это символ, а ваша функция возвращает символ. Символ - это однобайтовая переменная. Он будет содержать не более одного символа. Тогда вас не должно удивлять, что вы печатаете только один символ. Вы не предоставили достаточно кода, чтобы действительно понять, что вам нужно. Но это объясняет, почему вы печатаете только один символ. Переменная char может содержать один символ, а не всю строку.

Я думаю, вы хотели получить char *, указатель на массив символов. Но у вас тоже будут проблемы с этим, потому что z4 является локальным массивом и выходит за рамки прежде, чем вы получите возможность его использовать.

...