向adafruit PN532发送命令后
00 00 ff 03 fd d4 14 01 17 00
我得到答案:
00 00 C3 BF 00 C3 BF 00 00 00 C3 BF 02 C3 BE C3 95 15 16 00
而不是:
00 00 ff 00 ff 00 00 00 ff 02 fe d5 15 16 00
我使用uart通过串口“/ dev / ttyAMA0”与PN532进行通信 我有Java代码。使用pi4j从GPIO读取。 你知道为什么我会得到这种混乱的答案吗?
这是我的代码:
public class NFCapp {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
byte[] SAMConfiguration = {(byte) 0x00, (byte) 0x00, (byte) 0xff, (byte) 0x03, (byte) 0xfd, (byte) 0xd4, (byte) 0x14, (byte) 0x01, (byte) 0x17, (byte) 0x00};
byte[] wakeUP = {(byte) 0x55, (byte) 0x55, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00};
final byte[] ack = {(byte) 0x00, (byte) 0x00, (byte) 0xff, (byte) 0x00, (byte) 0xff, (byte) 0x00};
final Serial serial = SerialFactory.createInstance();
try {
serial.open("/dev/ttyAMA0", 115200);
serial.addListener(new SerialDataListener() {
@Override
public void dataReceived(SerialDataEvent event) {
String data = event.getData();
StringBuilder buffer = new StringBuilder();
byte[] array = data.getBytes();
System.out.println("Read: ");
for (int i = 0; i < array.length; i++) {
System.out.printf("%02X ", array[i]);
}
serial.write(ack);
}
});
System.out.println("Port Opened: " + serial.isOpen() + " ");
serial.write(wakeUP);
System.out.print("Write: ");
for (int i = 0; i < SAMConfiguration.length; i++) {
System.out.printf("%02X ", SAMConfiguration[i]);
}
System.out.println();
serial.write(SAMConfiguration);
for (;;) {
try {
Thread.sleep(1000);
} catch (InterruptedException ex) {
System.out.println(ex.getMessage());
}
}
} catch (Exception e) {
System.out.println(e.getMessage());
} finally {
serial.close();
}
}
答案 0 :(得分:1)
您需要字节,但是您正在读取字符串并将其转换为字节。不幸的是,在这个过程中,您的数据看起来像是UTF-8编码的。例如,0xC3BF是“\ u00FF”unicode字符的UTF-8编码。同样不幸的是,从SerialDataEvent获取数据的唯一方法是作为字符串。如何将原始字节解码为字符串取决于调用哪个字符串构造函数。看起来像UTF-16(可能是大端),所以你可以试试这个:
byte[] array = data.getBytes("UTF-16");
这很麻烦,真正的解决方法是改进Pi4J并添加一个SerialDataEvent.getBytes()方法。我希望这适合你。
答案 1 :(得分:0)
这对我有用
data.getBytes("ISO-8859-1");
(data.getBytes(“ UTF-16”)每读取一个字节返回2个字节,第二个字节为0x00)