EFR32BG22 BLE在SPP模式下无法与PC(Windows)连接.
大家好, 我正在try 在SPP模式下运行Thunderboard和PC之间的蓝牙连接.整个项目都是基于Sillicon Labs提供的示例,但是我找不到它不工作的原因.
这个项目是什么样子的
- 在板端,我正在运行一个名为bluetooth_spp_server的示例,它最初是为了在两个Thunderboard板之间通信而设计的
- 在PC端,我正在运行一个名为bluetooth_spp_with_windows的示例,它完全是为我所需要的紫色所做的.
他的行为
即使这些项目完全是为我所需要的,不知何故,我也不能让它运行.当我运行项目文件中的precompiled .exe application时,当我自己编译the source code,然后运行我的.exe应用程序时,一切都完全按照but的方式运行,PC无法连接.好吧,需要澄清的是,不知何故,我让它连接了5次,但我没有改变任何东西,从那以后就什么都不起作用了.PC看到主板,主板广告为服务器,但仍然没有发生任何事情,也没有发现任何事件.
经过一些调试后
经过几次调试,我发现董事会是广告刚刚好,我可以看到它在蓝牙设备等(我没有配对,因为这使得即使是预编译.exe应用程序的工作奇怪).然而,当涉及到连接,董事会无法找到任何事件(我不能看到它是否不同于PC端由于缺乏可见性的win api).广告基本上是董事会在初始化和广告启动后唯一要做的事情.
为了在这里至少提供一些代码,需要进行初始化和打开连接:
The sl_bt_step() function which is called from the main loop on the board side
#define SL_STATUS_OK 0
SL_WEAK bool sl_bt_can_process_event(uint32_t len) {
(void)(len);
return true;
}
void sl_bt_step(void) {
sl_bt_msg_t evt;
sl_bt_run(); // API function - can't see what's going on inside
uint32_t event_len = sl_bt_event_pending_len(); // API function - can't see what's going on inside
if( ( event_len == 0 ) || ( !sl_bt_can_process_event( event_len ) ) )
{
return; // After init I'm always ending right here.
}
sl_status_t status = sl_bt_pop_event( &evt );
if( status != SL_STATUS_OK )
{
return;
}
sl_bt_process_event( &evt );
}
void sl_bt_process_event(sl_bt_msg_t *evt) {
sl_bt_in_place_ota_dfu_on_event(evt);
sl_gatt_service_device_information_on_event(evt);
sl_bt_on_event(evt);
}
Initialization and event occured handler on the board side个
void sl_bt_on_event(sl_bt_msg_t *evt) {
uint16_t max_mtu_out;
sl_status_t sc;
switch (SL_BT_MSG_ID(evt->header)) {
/// First thing after turning on the MCU
case sl_bt_evt_system_boot_id:
app_log("SPP Role: SPP Server\r\n");
reset_variables();
sc = sl_bt_gatt_server_set_max_mtu(247, &max_mtu_out);
app_assert_status(sc);
sc = sl_bt_advertiser_create_set(&advertising_set_handle);
app_assert_status(sc);
sc = sl_bt_legacy_advertiser_generate_data(advertising_set_handle,
sl_bt_advertiser_general_discoverable);
app_assert_status(sc);
sc = sl_bt_advertiser_set_timing(
advertising_set_handle,
160, // min. adv. interval (milliseconds * 1.6)
160, // max. adv. interval (milliseconds * 1.6)
0, // adv. duration
0); // max. num. adv. events
app_assert_status(sc);
sc = sl_bt_legacy_advertiser_start(advertising_set_handle,
sl_bt_legacy_advertiser_connectable);
app_assert_status(sc);
break;
/// After an event "in the air" occure - I can't get into this since the board can't see any event
case sl_bt_evt_connection_opened_id:
conn_handle = evt->data.evt_connection_opened.connection;
app_log("Connection opened\r\n");
main_state = STATE_CONNECTED;
sl_bt_connection_set_parameters(conn_handle, 24, 40, 0, 200, 0, 0xFFFF);
break;
}
}
-
evt->header
由蓝牙外围设备设置,并且在返回迭代序列是17 14 6 7
的初始化之后,它仅返回0
.我不能调试或看到这个变量发生的任何事情,只能看到蓝牙外设设置的值.
结论
我真的不能理解的是,预编译的.exe应用程序每次都能正常工作,即使当主板与Windows配对时也是如此,这只会导致try 连接.这仍然比我编译的.exe应用程序版本的任何try 都要远(除了随机的5个).
据我所知,Win API中有两个函数是用来连接蓝牙设备的.我已经试过了它们的每一种变体,都改成了the provided code for PC side.
我已经试过Silabs论坛了,但答案没有帮助,他们还没有回复第二个论坛,所以我想我应该在其他论坛试试运气.
有人知道是什么导致了这种奇怪的行为吗?有没有可能预编译的.exe应用程序是用一些旧的库/框架编译的,现在新的库/框架不再支持它了?(预编译的版本是两年前上传到github的).
我希望有人知道发生了什么,因为经过几个小时的搜索和try ,似乎有人的帮助是我最后的机会.提前感谢您为我所做的一切努力.