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