星闪 SLE 串口测试
SLE 简介
星闪 ( SparkLink ) 低功耗接入威廉希尔官方网站
(Sparklink Low Energy, SLE)是一种特殊的工作模式和配置,用于满足特定场景的极低功耗需求。
SLE 模式旨在将功耗降至极低,以延长电池供电设备的使用寿命。该模式通过减少设备的活动时间和降低数据传输频率来实现最低功耗。
应用场景包括但不限于**
1.可穿戴设备: 需要长时间运行的设备,如智能手表、健康监测设备等。
2.物联网传感器: 低频率数据传输的设备,如环境监测传感器、远程监控设备等。
**3.智慧城市: 需要长期运行但无需频繁数据更新的城市基础设施设备,如智能路灯、垃圾箱监控等。
串口传输
准备两块支持 SLE 的开发板,这里使用两块 BearPi-Pico H3863 开发板,测试过程需要将其中一块开发板作为 Server 服务端,另外一块开发板作为 Client 客户端,并进行配对操作
如上图所示,A 开发板通过串口接收数据,然后通过 SLE 传输给 B 开发板,B 开发板通过串口将接收到的数据打印出来;
同样,B开发板通过串口接收数据,然后通过SLE传输给 A 开发板,A 开发板通过串口将接收到的数据打印出来。
服务端配置
**关键工程文件位于 **application
- samples
- products
- sle_uart
- sle_uart.c
核心代码
static void ssaps_server_write_request_cbk(uint8_t server_id, uint16_t conn_id, ssaps_req_write_cb_t *write_cb_para,
errcode_t status)
{
osal_printk("%s ssaps write request callback cbk server_id:%x, conn_id:%x, handle:%x, status:%x\\r\\n",
SLE_UART_SERVER_LOG, server_id, conn_id, write_cb_para->handle, status);
if ((write_cb_para->length > 0) && write_cb_para->value) {
osal_printk("\\n sle uart recived data : %s\\r\\n", write_cb_para->value);
uapi_uart_write(CONFIG_SLE_UART_BUS, (uint8_t *)write_cb_para->value, write_cb_para->length, 0);
}
}
static void sle_uart_server_read_int_handler(const void *buffer, uint16_t length, bool error)
{
unused(error);
if (sle_uart_client_is_connected()) {
sle_uart_server_send_report_by_handle(buffer, length);
} else {
osal_printk("%s sle client is not connected! \\r\\n", SLE_UART_SERVER_LOG);
}
}
static void *sle_uart_server_task(const char *arg)
{
unused(arg);
uint8_t rx_buf[SLE_UART_SERVER_MSG_QUEUE_MAX_SIZE] = {0};
uint32_t rx_length = SLE_UART_SERVER_MSG_QUEUE_MAX_SIZE;
uint8_t sle_connect_state[] = "sle_dis_connect";
sle_uart_server_create_msgqueue();
sle_uart_server_register_msg(sle_uart_server_write_msgqueue);
sle_uart_server_init(ssaps_server_read_request_cbk, ssaps_server_write_request_cbk);
uart_init_pin();
uart_init_config();
uapi_uart_unregister_rx_callback(CONFIG_SLE_UART_BUS);
errcode_t ret = uapi_uart_register_rx_callback(CONFIG_SLE_UART_BUS,
UART_RX_CONDITION_FULL_OR_IDLE,
1, sle_uart_server_read_int_handler);
if (ret != ERRCODE_SUCC) {
osal_printk("%s Register uart callback fail.[%x]\\r\\n", SLE_UART_SERVER_LOG, ret);
return NULL;
}
while (1) {
sle_uart_server_rx_buf_init(rx_buf, &rx_length);
sle_uart_server_receive_msgqueue(rx_buf, &rx_length);
if (strncmp((const char *)rx_buf, (const char *)sle_connect_state, sizeof(sle_connect_state)) == 0) {
ret = sle_start_announce(SLE_ADV_HANDLE_DEFAULT);
if (ret != ERRCODE_SLE_SUCCESS) {
osal_printk("%s sle_connect_state_changed_cbk,sle_start_announce fail :%02x\\r\\n",
SLE_UART_SERVER_LOG, ret);
}
}
osal_msleep(SLE_UART_TASK_DURATION_MS);
}
sle_uart_server_delete_msgqueue();
return NULL;
}
重编译
工程后 程序加载
至开发板并重置 RST
开发板即可。
客户端配置
**关键工程文件也位于 **application
- samples
- products
- sle_uart
- sle_uart.c
核心代码
void sle_uart_notification_cb(uint8_t client_id, uint16_t conn_id, ssapc_handle_value_t *data,
errcode_t status)
{
unused(client_id);
unused(conn_id);
unused(status);
osal_printk("\\n sle uart recived data : %s\\r\\n", data->data);
uapi_uart_write(CONFIG_SLE_UART_BUS, (uint8_t *)(data->data), data->data_len, 0);
}
void sle_uart_indication_cb(uint8_t client_id, uint16_t conn_id, ssapc_handle_value_t *data,
errcode_t status)
{
unused(client_id);
unused(conn_id);
unused(status);
osal_printk("\\n sle uart recived data : %s\\r\\n", data->data);
uapi_uart_write(CONFIG_SLE_UART_BUS, (uint8_t *)(data->data), data->data_len, 0);
}
static void sle_uart_client_read_int_handler(const void *buffer, uint16_t length, bool error)
{
unused(error);
ssapc_write_param_t *sle_uart_send_param = get_g_sle_uart_send_param();
uint16_t g_sle_uart_conn_id = get_g_sle_uart_conn_id();
sle_uart_send_param->data_len = length;
sle_uart_send_param->data = (uint8_t *)buffer;
ssapc_write_req(0, g_sle_uart_conn_id, sle_uart_send_param);
}
static void *sle_uart_client_task(const char *arg)
{
unused(arg);
uart_init_pin();
uart_init_config();
uapi_uart_unregister_rx_callback(CONFIG_SLE_UART_BUS);
errcode_t ret = uapi_uart_register_rx_callback(CONFIG_SLE_UART_BUS,
UART_RX_CONDITION_FULL_OR_IDLE,
1, sle_uart_client_read_int_handler);
sle_uart_client_init(sle_uart_notification_cb, sle_uart_indication_cb);
if (ret != ERRCODE_SUCC) {
osal_printk("Register uart callback fail.");
return NULL;
}
return NULL;
}
重编译
工程后 程序加载
至开发板并重置 RST
开发板即可。
串口通信测试
程序加载后复位,同时连接两块开发板至电脑USB口,在设备管理器中定位两个端口号,如下图所示
打开两个串口通信工具,端口分别对应两个开发板,Open Port 后分别向对方发送字符,实现二者之间的信息传输,如下图所示