저는 두 값을 비교하고 싶습니다 z1
(CRC가의 연결된 마지막 두에서 건축 outWord[10]
과 outWord[11]
), 그리고 z2
그 또한 CRC하지만 패킷 수에 따라 계산.
z1
e568이어야 z2
하지만 두 값을 비교할 때 차이가 있습니다.
문제가 어디에 있는지 알려주시겠습니까?
#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;
void setup()
{
pinMode(13, OUTPUT);
lcd.begin(16,2);
lcd.backlight();
lcd.setCursor(0,0);
lcd.print("Test RFID");
lcd.setCursor(0,1);
lcd.print("Zeskanuj TAG");
Serial.begin(9600);
Serial1.begin(9600);
lcd.setCursor(0,0);
}
void loop()
{
if (Serial1.available())
{
RFID();
}
else
{
if (index==11)
{
index=0;
}
}
}
unsigned char RFID(void)
{
char z1 [10] = { "" };
char z2 [10] = { "" };
unsigned short crc1 [] = { 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++)
{
Serial.print(outWord[i],HEX); // --> 1B31687DBC7FFE568
Data2Calc[i-1] = outWord[i];
}
Serial.println();
CRC16(Data2Calc, &CRC2Calc, Bytes2Calc);
itoa(outWord[10],z1,16);
itoa(outWord[11],z2,16);
strcat(z1, z2);
*crc2 = CRC2Calc;
Serial.print("crc1="); //
Serial.print(z1); // --> e568
Serial.println(""); //
Serial.print("crc2="); //
sprintf(z2, "%x", *crc2); //
Serial.print(z2); // --> e568
Serial.println(""); //
Serial.print("CRC2Calc="); //
Serial.print(CRC2Calc,HEX); // --> E568
Serial.println(""); //
if (z1 == z2)
{
Serial.print("OK");
}
else
{
Serial.print("FAILED");
}
Serial.println("");
}
else
{
outWord[index] = inWord;
}
}
return *z1;
}
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
1B31687DBC7FFE568
crc1=e568
crc2=e568
CRC2Calc=E568
FAILED
에서와 같이 포인터를 비교하여 두 문자열 의 내용 을 비교할 수 없습니다 . 문자열이 두 개의 다른 메모리 위치에 있으므로 주소가 다르기 때문에 (거의) 항상 거짓입니다.char*
if (z1 == z2)
문자열이 같으면 0strcmp()
을 반환 하는 함수를 사용해야합니다 . 그래서:
if (strcmp(z1,z2) == 0)
{
Serial.print("OK");
}
else
{
Serial.print("FAILED");
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다