我正在使用SiliconLabs的BGLIB静态库通过SerialPort与BLED112进行复合。为了使用这个库,有必要定义两个函数:一个用于发送,另一个用于SerialPort的接收字节。从串行接收到的所有数据可分为两部分:标题和数据。
按照“温度计-演示”的"main.c“代码,从串行接收数据的函数,首先接收所有的头和数据。当接收到标头和数据时,代码按照以下代码解析标头并初始化一个*msg变量:
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结构指针,这个结构是这样定义的:
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是这样定义的:
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的定义如下:
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位置。
我认为其意图是提供一种直接访问数据的方式,但对我来说并不是正确的方法。这是我的错误评价还是一个错误的错误?
发布于 2018-01-18 08:42:58
我已经联系了SiliconLabs支持部门,原来的库是正确的,而且我似乎有一个错误的库版本。
就像SiliconLabs支持建议我(就像在这个链接中解释得很好:http://www.drdobbs.com/questions-answers-creating-variable-siz/184403480)一样,有3种可能的声明:
1°申报:
typedef struct
{
uint8 len;
uint8 data[0];
}uint8array;我可以通过以下方式获取数据:
msg->data->data[0]
msg->data->data[1]
msg->data->data[2]
...
msg->data->data[n]在这种情况下,编译器会警告缓冲区索引超过限制。
2°申报:
typedef struct
{
uint8 len;
uint8 data[1000];
}uint8array;在这种情况下,可以以与前一种相同的方式访问数据,但是已经分配了超过必要的空间(在嵌入式环境中,有时这是重要的优化,因为资源是有限的),或者像以前一样,您可能会超过缓冲区限制。
3°申报:
typedef struct
{
uint8 len;
uint8 data[];
}uint8array;此声明的名称是灵活数组成员 (member),并在C99标准中引入。在这种情况下,可以像前面那样访问数据,但是编译器可以警告这不是一个标准声明。此声明与SiliconLabs为库所采用的声明相同。
在我的例子中,我使用的是VisualStudio,我采用了第三种解决方案,但编译器返回警告C4200 (非标准声明)。我尝试了第一种解决方案,编译器没有返回我没有警告,但对我来说,代码的清晰度是缺失的,可能是一个问题,对未来的使用。
https://stackoverflow.com/questions/48259706
复制相似问题