首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BGLIB SiliconLabs代码错误?

BGLIB SiliconLabs代码错误?
EN

Stack Overflow用户
提问于 2018-01-15 09:01:14
回答 1查看 124关注 0票数 0

我正在使用SiliconLabs的BGLIB静态库通过SerialPort与BLED112进行复合。为了使用这个库,有必要定义两个函数:一个用于发送,另一个用于SerialPort的接收字节。从串行接收到的所有数据可分为两部分:标题和数据。

按照“温度计-演示”的"main.c“代码,从串行接收数据的函数,首先接收所有的头和数据。当接收到标头和数据时,代码按照以下代码解析标头并初始化一个*msg变量:

代码语言:javascript
复制
unsigned char data[256];
struct ble_header hdr;
int r;

r = uart_rx(sizeof(hdr), (unsigned char *)&hdr, UART_TIMEOUT);
.
.
.
if (hdr.lolen) {
    r = uart_rx(hdr.lolen, data, UART_TIMEOUT);
.
.
.

}

const struct ble_msg *msg = ble_get_msg_hdr(hdr);

*msg变量是一个ble_msg结构指针,这个结构是这样定义的:

代码语言:javascript
复制
struct ble_msg
{
    struct ble_header    hdr;
    uint32               params;
    ble_cmd_handler       handler;
};

handler是在初始化*msg时初始化的函数指针。解析头后,代码调用此函数指针:

用于初始化此函数指针的函数是从库中空定义的,如果要使用其中的一个函数,就必须删除它并重写它。

在“温度计-演示”示例中,使用void ble_evt_gap_scan_response(const struct ble_msg_gap_scan_response_evt_t *msg)函数接收所有可见光设备,ble_msg_gap_scan_response_evt_t是这样定义的:

代码语言:javascript
复制
PACKSTRUCT(struct ble_msg_gap_scan_response_evt_t
{
    int8    rssi;
    uint8   packet_type;
    bd_addr sender;
    uint8   address_type;
    uint8   bond;
    uint8array  data;
});

uint8array的定义如下:

代码语言:javascript
复制
typedef struct
{
    uint8 len;
    uint8 *data;
}uint8array;

这里有一个问题:当执行msg->handler(data)代码并调用ble_evt_gap_scan_response函数时,在数据缓冲区和ble_msg_gap_scan_response_evt_t结构之间执行一个强制转换,uint8 *data (在uint8array结构中)的内容由从SerialPort接收的数据初始化,than将指向一个不正确的RAM位置。

我认为其意图是提供一种直接访问数据的方式,但对我来说并不是正确的方法。这是我的错误评价还是一个错误的错误?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-18 08:42:58

我已经联系了SiliconLabs支持部门,原来的库是正确的,而且我似乎有一个错误的库版本。

就像SiliconLabs支持建议我(就像在这个链接中解释得很好:http://www.drdobbs.com/questions-answers-creating-variable-siz/184403480)一样,有3种可能的声明:

1°申报:

代码语言:javascript
复制
typedef struct
{
    uint8 len;
    uint8 data[0];
}uint8array;

我可以通过以下方式获取数据:

代码语言:javascript
复制
msg->data->data[0]
msg->data->data[1]
msg->data->data[2]
...
msg->data->data[n]

在这种情况下,编译器会警告缓冲区索引超过限制。

2°申报:

代码语言:javascript
复制
typedef struct
{
    uint8 len;
    uint8 data[1000];
}uint8array;

在这种情况下,可以以与前一种相同的方式访问数据,但是已经分配了超过必要的空间(在嵌入式环境中,有时这是重要的优化,因为资源是有限的),或者像以前一样,您可能会超过缓冲区限制。

3°申报:

代码语言:javascript
复制
typedef struct
{
    uint8 len;
    uint8 data[];
}uint8array;

此声明的名称是灵活数组成员 (member),并在C99标准中引入。在这种情况下,可以像前面那样访问数据,但是编译器可以警告这不是一个标准声明。此声明与SiliconLabs为库所采用的声明相同。

在我的例子中,我使用的是VisualStudio,我采用了第三种解决方案,但编译器返回警告C4200 (非标准声明)。我尝试了第一种解决方案,编译器没有返回我没有警告,但对我来说,代码的清晰度是缺失的,可能是一个问题,对未来的使用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48259706

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档