NTAG I2C FAST_READ在特定页地址之后出错 [英] NTAG I2C FAST_READ is erring out after a particular page address
问题描述
我使用的是NTAG I2C加2000内存标记,并且能够成功执行特定页面地址范围的FAST_READ,但超出了我收到的错误范围。
iOS
起始地址0x04
和结束地址0x46
读取成功
await cmd([0x3a, 0x04, 0x46]);
While,开始地址0x04
和结束地址0x47
失败,错误为
await cmd([0x3a, 0x04, 0x47]);
错误
input bytes: 3A0C0C
input bytes: 3A0447
[CoreNFC] 00000002 816c6760 -[NFCTagReaderSession transceive:tagUpdate:error:]:771 Error Domain=NFCError Code=100 "Tag connection lost" UserInfo={NSLocalizedDescription=Tag connection lost}
Android
起始地址0x04
和结束地址0x49
读取成功
await cmd([0x3a, 0x04, 0x49]);
While,开始地址0x04
和结束地址0x4b
失败,错误为
await cmd([0x3a, 0x04, 0x4b]);
错误
D/NfcService: Transceive start
D/NfcService: Transceive End, Result: 0 mTransceiveSuccess: 1 mTransceiveFail: 0
D/NfcService: Transceive start
D/NfcService: Transceive End, Result: 2 mTransceiveSuccess: 1 mTransceiveFail: 1
D/ReactNativeNfcManager: transceive fail: android.nfc.TagLostException: Tag was lost.
I/ReactNativeJS: Error: transceive fail
提前谢谢。
推荐答案
来自标记的datasheet
备注:FAST_READ命令可以用一个命令读出一个扇区的整个内存。然而,NFC设备的接收缓冲区必须能够处理请求的数据量,因为不可能进行链接
当我在原生代码中对Android上的类似标记类型执行FAST_Read时,我会执行getMaxTransceiveLength
以找出缓冲区有多大,然后将其除以4并向下舍入,以得出FAST_Read一次可以执行的最大页数,并在必要时将其分解为多个FAST_Read。
Android一般最大传输长度为253字节或63页。
Android版的REACT-NFC-MANAGER API在其API中也有getMaxTransceiveLength
,因此您可以计算FAST_Read可以在您的硬件上执行的最大页面数。
我还没有在iOS上执行FAST_Read,但预计会有类似的限制(它确实有一个错误代码,表示收发数据包太大,但我还没有找到在发送命令之前询问它最大收发长度的方法)
虽然getMaxTransceiveLength
可能表示发送命令的大小,但由于发送和接收数据速率相同,因此应该能够在达到收发超时之前返回此字节数。
收发超时可以设置,但不能使用REACTION-NFC-MANAGER API设置
同样,在iOS中没有更改任何超时值的选项,但出现错误,指示与标记的通信已超时。
因此,您可以尝试增加Android上的超时值,而不是分解为多个FAST_Read,但计算超时时间可能会很困难,如果设置得太大,可能会产生负面影响。
对于Android,可能更容易假设最大发送大小也是可以安全接收的。对于iOS,假设从您的实验中获得最大接收大小,或者处理错误并使用退避算法重新读取。
这篇关于NTAG I2C FAST_READ在特定页地址之后出错的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!