在Arduino中传递/打印参数

在Arduino中传递/打印参数,arduino,Arduino,有一个函数RFID返回*z4参数,该参数应放入TagID中。 当我从loop()打印TagID时,将打印“1”而不是“1B31687DBC7FF” 我怎样才能得到全部价值?我想将完整字符串“1B31687DBC7FF”打印到串行端口 #include "Arduino.h" #include <Wire.h> #include <LiquidCrystal_I2C.h> #include <stdio.h> #include <std

有一个函数RFID返回*z4参数,该参数应放入TagID中。 当我从loop()打印TagID时,将打印“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);
    }
}

更新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[]=…” 我不确定它写得是否得体。。。但它是有效的:)我将有效的源代码附加在页面顶部


更新4 不,经过几次测试后,我不得不承认更新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 好啊最后我让它工作了。。。至少在我看来是这样。 我改变了表格的大小,修改了十六进制的显示方式,并做了一些小改动。
整个源代码在顶部更新。

TagID是一个char,函数返回一个char。char是一个单字节变量。它最多只能容纳一个字符。这样,您只打印一个字符就不会感到惊讶了。您没有提供足够的代码来真正了解您真正想要的是什么。但这也解释了为什么你只能打印一个字符。char变量可以包含一个字符,而不是整个字符串


我想你想得到一个char*,一个指向char数组的指针。但这也会给您带来麻烦,因为z4是一个本地阵列,在您有机会使用它之前就超出了范围。

谢谢您的帮助。好啊我已经用完整的代码更新了帖子。您能帮我重做一下吗,这样TagID就可以打印整个值“1B31687DBC7FF”,而不是一个字符“1”?谢谢
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