当前位置: 首页 > 工具软件 > libnfc > 使用案例 >

windows识别android串口,windows平台修改libnfc 1.7.0使其支持pn532_uart串口

阎嘉荣
2023-12-01

前几天写了一篇文章,详述了libnfc

1.7.0在windows下的编译过程,打开了对acr122u模块、pn53x_usb模块、pn532_uart模块等的支持,今天试了一下,发现在win下libnfc默认好像只扫描使用acr122_pcsc

driver和pn53x_usb driver的模块,而我连接了pn532_uart模块之后提示没有找到NFC设备。

Debug模式编译运行nfc-list.exe输出如下:

unknown

libnfc.general log_level is set

to 3

debug libnfc.general allow_autoscan

is set to true

debug libnfc.general allow_intrusive_scan

is set to false

debug libnfc.general 0

device(s) defined by user

nfc-list.exe uses libnfc 1.7.0

debug libnfc.general 0

device(s) found using acr122_pcsc driver

debug libnfc.general 0

device(s) found using pn53x_usb driver

No NFC device found.

于是,我开始查找支持pn532_uart的方法,通过查看源码发现libnfc使用两种方式获取nfc设备:

1.自动扫描 autoscan

2.用户自定义设备 user_defined_device

libnfc支持读取libnfc.conf配置文件的方式加载用户定义的设备。

最开始,我尝试了在cmake生成的config.h里增加#define CONFFILES,重新编译的时候报错:

undefined reference to '_imp__regcomp'

这是由于conf.c里面调用了regcomp等函数,这些函数属于regex正则解析库,但是我使用的MinGW64里面没有这个库。

于是我复制了早期的MinGW的libregex库以及头文件,编译能通过,但是运行nfc-list.exe运行到读取配置文件时就出错退出了,估计还是正则库有问题。

libregex使用不了也没关系,其实可以修改conf.c去掉正则解析的过程,直接将参数赋值给nfc_context。

主要需要修改config.h和conf.c两个文件。

在config.h里增加 #define CONFFILES修改conf.c如下:

#include "conf.h"

#ifdef

HAVE_CONFIG_H

# include "config.h"

#endif //

HAVE_CONFIG_H

#ifdef CONFFILES

#include

#include

#include

#include

#include

#include

#include

#include

"nfc-internal.h"

#include "log.h"

#define LOG_CATEGORY

"libnfc.config"

#define

LOG_GROUP NFC_LOG_GROUP_CONFIG

#ifndef

LIBNFC_SYSCONFDIR

// If this define does not

already exists, we build it using SYSCONFDIR

#ifndef

SYSCONFDIR

#error "SYSCONFDIR is not

defined but required."

#endif //

SYSCONFDIR

#define

LIBNFC_SYSCONFDIR SYSCONFDIR"/nfc"

#endif //

LIBNFC_SYSCONFDIR

//#define

LIBNFC_CONFFILE LIBNFC_SYSCONFDIR"/libnfc.conf"

//#define

LIBNFC_DEVICECONFDIR LIBNFC_SYSCONFDIR"/devices.d"

#define

LIBNFC_CONFFILE "libnfc.conf"

#define

LIBNFC_DEVICECONFDIR "devices.d"

static bool

conf_parse_file(const char

*filename, void (*conf_keyvalue)(void *data), void *data)

{

printf("Try to Conf Key Value

by chenxupro\n");

conf_keyvalue(data);

return true;

}

static void

conf_keyvalue_context(void

*data)

{

nfc_context *context =

(nfc_context *)data;

//if (strcmp(key,

"allow_autoscan") == 0) {

string_as_boolean("true",

&(context->allow_autoscan));

//} else if (strcmp(key,

"allow_intrusive_scan") == 0) {

string_as_boolean("false",

&(context->allow_intrusive_scan));

//} else if (strcmp(key,

"log_level") == 0) {

context->log_level = atoi("2");

//} else if (strcmp(key,

"device.name") == 0) {

if ((context->user_defined_device_count == 0)

||

strcmp(context->user_defined_devices[context->user_defined_device_count

- 1].name, "") != 0) {

if

(context->user_defined_device_count >=

MAX_USER_DEFINED_DEVICES) {

log_put(LOG_GROUP,

LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "%s", "Configuration exceeded

maximum user-defined devices.");

return;

}

context->user_defined_device_count++;

}

strcpy(context->user_defined_devices[context->user_defined_device_count

- 1].name, "chenxupro PN532");

//} else if (strcmp(key,

"device.connstring") == 0) {

if ((context->user_defined_device_count == 0)

||

strcmp(context->user_defined_devices[context->user_defined_device_count

- 1].connstring, "") != 0) {

if

(context->user_defined_device_count >=

MAX_USER_DEFINED_DEVICES) {

log_put(LOG_GROUP,

LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "%s", "Configuration exceeded

maximum user-defined devices.");

return;

}

context->user_defined_device_count++;

}

strcpy(context->user_defined_devices[context->user_defined_device_count

- 1].connstring, "pn532_uart:COM9:115200");

}

void conf_load(nfc_context

*context)

{

conf_parse_file(LIBNFC_CONFFILE,

conf_keyvalue_context, context);

}

#endif // CONFFILES

复制代码

[size=14.399999618530273px]重新编译,运行结果如下:

unknown libnfc.general log_level

is set to 2

debug libnfc.general allow_autoscan

is set to true

debug libnfc.general allow_intrusive_scan

is set to false

debug libnfc.general 1

device(s) defined by user

debug libnfc.general #0 name: "chenxupro PN532", connstring:

"pn532_uart:COM9:115200"

debug libnfc.general 0

device(s) found using acr122_pcsc driver

debug libnfc.general 0

device(s) found using pn53x_usb driver

debug libnfc.driver.pn532_uart Attempt to

open: COM9 at 115200 bauds.

Try to Conf Key Value by chenxupro

nfc-list.exe uses libnfc 1.7.0

NFC device: pn532_uart:COM9 opened

1 ISO14443A passive target(s) found:

ISO/IEC 14443A (106 kbps) target:

ATQA (SENS_RES):

00 04 UID (NFCID1):

7d 88 c9 1d SAK (SEL_RES):

08

 类似资料: