【已解决】【tuyaos】uf_db方式存储数据失败

Wi-Fi 设备、Wi-Fi 低功耗设备、Wi-Fi BLE 双模设备、Ethernet设备、Ethernet+Wi-Fi设备等
wxq1123
Posts: 108
Location: 深圳市水世界有限公司

1)开发包全称:tuyaos-iot_3.8.1_bk7231n_wifi-ble-com_1.2.8.tar.gz
2)为了上电尽快读取掉电保存采取了通过事件触发启动程序如图。
测试发现写进去的数据读出来永远多一位,并且数据空白不知道是怎么回事。(example例程里面写读 五个字节的可以)

微信截图_20240115144616.jpg
Attachments
微信截图_20240115144753.jpg
Last edited by wxq1123 on 2024年 Jan 16日 11:11, edited 1 time in total.
yangjie
Posts: 209

Re: 【求助】【tuyaos】uf_db方式存储数据失败

wxq1123 2024年 Jan 15日 14:55

1)开发包全称:tuyaos-iot_3.8.1_bk7231n_wifi-ble-com_1.2.8.tar.gz
2)为了上电尽快读取掉电保存采取了通过事件触发启动程序如图。
测试发现写进去的数据读出来永远多一位,并且数据空白不知道是怎么回事。(example例程里面写读 五个字节的可以)微信截图_20240115144616.jpg

请参考 example_os_uf_file 示例试试。uf_db_user_param_write 写入的数据,当写入 0 时认为数据写入结束

wxq1123
Posts: 108
Location: 深圳市水世界有限公司

Re: 【求助】【tuyaos】uf_db方式存储数据失败

yangjie 2024年 Jan 15日 15:03
wxq1123 2024年 Jan 15日 14:55

1)开发包全称:tuyaos-iot_3.8.1_bk7231n_wifi-ble-com_1.2.8.tar.gz
2)为了上电尽快读取掉电保存采取了通过事件触发启动程序如图。
测试发现写进去的数据读出来永远多一位,并且数据空白不知道是怎么回事。(example例程里面写读 五个字节的可以)微信截图_20240115144616.jpg

请参考 example_os_uf_file 示例试试。uf_db_user_param_write 写入的数据,当写入 0 时认为数据写入结束

最后一个字节是“0”和“'\0'”都不行啊

yangjie
Posts: 209

Re: 【求助】【tuyaos】uf_db方式存储数据失败

wxq1123 2024年 Jan 15日 15:35
yangjie 2024年 Jan 15日 15:03
wxq1123 2024年 Jan 15日 14:55

1)开发包全称:tuyaos-iot_3.8.1_bk7231n_wifi-ble-com_1.2.8.tar.gz
2)为了上电尽快读取掉电保存采取了通过事件触发启动程序如图。
测试发现写进去的数据读出来永远多一位,并且数据空白不知道是怎么回事。(example例程里面写读 五个字节的可以)微信截图_20240115144616.jpg

请参考 example_os_uf_file 示例试试。uf_db_user_param_write 写入的数据,当写入 0 时认为数据写入结束

最后一个字节是“0”和“'\0'”都不行啊

uf_db_user_param_write 只能写入可见字符。example_os_uf_file 示例可以二进制内容写入的

这个帖子也是关于 uf 示例的,你可以参考下:
viewtopic.php?t=2689

wxq1123
Posts: 108
Location: 深圳市水世界有限公司

Re: 【求助】【tuyaos】uf_db方式存储数据失败

yangjie 2024年 Jan 15日 15:38
wxq1123 2024年 Jan 15日 15:35
yangjie 2024年 Jan 15日 15:03

请参考 example_os_uf_file 示例试试。uf_db_user_param_write 写入的数据,当写入 0 时认为数据写入结束

最后一个字节是“0”和“'\0'”都不行啊

uf_db_user_param_write 只能写入可见字符。example_os_uf_file 示例可以二进制内容写入的

这个帖子也是关于 uf 示例的,你可以参考下:
viewtopic.php?t=2689

不太明白,我没有需要操作的txt文件呀。我就想搞个便捷的掉电保存而已

yangjie
Posts: 209

Re: 【求助】【tuyaos】uf_db方式存储数据失败

uf_file:支持文本文件和二进制文件。也是掉电不丢失的。
uf_file: 是通过文件来保存数据的,你可以先创建一个文件,文件名就相当于 key-value 中的 key ,是可以随便定义的。value 就是相当于文件内的内容,可以用来存放你的上下电次数的。

wxq1123
Posts: 108
Location: 深圳市水世界有限公司

Re: 【求助】【tuyaos】uf_db方式存储数据失败

yangjie 2024年 Jan 15日 16:01

uf_file:支持文本文件和二进制文件。也是掉电不丢失的。
uf_file: 是通过文件来保存数据的,你可以先创建一个文件,文件名就相当于 key-value 中的 key ,是可以随便定义的。value 就是相当于文件内的内容,可以用来存放你的上下电次数的。

有没有直接保存16进制数据的方法?uf原来得把数据转成字符串才能保存,遇到16进制的0直接当结束符给处理掉了

yangjie
Posts: 209

Re: 【求助】【tuyaos】uf_db方式存储数据失败

wxq1123 2024年 Jan 15日 17:17
yangjie 2024年 Jan 15日 16:01

uf_file:支持文本文件和二进制文件。也是掉电不丢失的。
uf_file: 是通过文件来保存数据的,你可以先创建一个文件,文件名就相当于 key-value 中的 key ,是可以随便定义的。value 就是相当于文件内的内容,可以用来存放你的上下电次数的。

有没有直接保存16进制数据的方法?uf原来得把数据转成字符串才能保存,遇到16进制的0直接当结束符给处理掉了

你看下这个内容:https://www.cnblogs.com/kangjianwei101/p/5220021.html覆盖二进制写用 wb+,追加二进制写用 ab+ (tuyaos 文件系统不支持 "wb+", "ab+" 模式,仅支持 "r","r+","a","a+","w","w+" 几种模式)

示例代码:

Code: Select all

***********************************************************
***********************function define**********************
***********************************************************/
/**
* @brief base db task
*
* @param[in] param:Task parameters
* @return none
*/
VOID example_uf_file(INT_T argc, CHAR_T *argv[])
{
    OPERATE_RET op_ret = OPRT_OK;
    UCHAR_T * fd = NULL;
    UCHAR_T write_buff[5] = {0x00, 0x01, 0x02, 0x03, 0x04};
    UCHAR_T *read_buff = NULL;
    INT_T write_num = 0;
    INT_T read_num = 0;
    BOOL_T temp = TRUE;

    TAL_PR_NOTICE("------ uf file example start ------");

    /*open file, read and write mode*/
    fd = ufopen("test.txt", "w+"); // 覆盖写,追加写用 "ab+"
    if(NULL == fd) {
        TAL_PR_ERR("file open fail");
    } else {
        TAL_PR_DEBUG("fd : %d", *fd);
    }

    /*change offset*/
    ufseek(fd, 0, UF_SEEK_END);
    /*write*/
    write_num += ufwrite(fd, write_buff, 5);
    TAL_PR_DEBUG("write number : %d", write_num);

    /*check if the current offset reach the end of the file*/
    temp = ufeof(fd);
    if(temp) {
        TAL_PR_DEBUG("offset is at the end");
    } else {
        TAL_PR_DEBUG("offset is not at the end");
    }

    /*change offset*/
    ufseek(fd, 0, UF_SEEK_SET);

    /*get current offset of the unique file*/
    op_ret = uftell(fd);
    TAL_PR_DEBUG("current offset : %d", op_ret);

    /*get the size of the unique file*/
    op_ret = ufgetsize("test.txt");
    TAL_PR_DEBUG("file size: %d", op_ret);
    if (op_ret > 0) {
    	write_num = op_ret;
    }

    /*read*/
    read_buff = (UCHAR_T *)tal_malloc(sizeof(CHAR_T)*write_num + 1);	
    if(NULL == read_buff) {
        TAL_PR_ERR("read buff malloc fail!");
    }
    read_num = ufread(fd, read_buff, write_num);
    for (int i =0; i<read_num; i++) {
    	TAL_PR_DEBUG("read_buff[%d} : %x", i, read_buff[i]);
    }

    /*close*/
    op_ret = ufclose(fd);
    if(OPRT_OK != op_ret) {
        TAL_PR_ERR("err<%d>, close fail!", op_ret);
    }

    tal_free(read_buff);

    return;
}

Last edited by yangjie on 2024年 Jan 16日 10:29, edited 1 time in total.
wxq1123
Posts: 108
Location: 深圳市水世界有限公司

Re: 【求助】【tuyaos】uf_db方式存储数据失败

yangjie 2024年 Jan 15日 17:33
wxq1123 2024年 Jan 15日 17:17
yangjie 2024年 Jan 15日 16:01

uf_file:支持文本文件和二进制文件。也是掉电不丢失的。
uf_file: 是通过文件来保存数据的,你可以先创建一个文件,文件名就相当于 key-value 中的 key ,是可以随便定义的。value 就是相当于文件内的内容,可以用来存放你的上下电次数的。

有没有直接保存16进制数据的方法?uf原来得把数据转成字符串才能保存,遇到16进制的0直接当结束符给处理掉了

你看下这个内容:https://www.cnblogs.com/kangjianwei101/p/5220021.html,覆盖二进制写用 wb+,追加二进制写用 ab+

示例代码:

Code: Select all

***********************************************************
***********************function define**********************
***********************************************************/
/**
* @brief base db task
*
* @param[in] param:Task parameters
* @return none
*/
VOID example_uf_file(INT_T argc, CHAR_T *argv[])
{
    OPERATE_RET op_ret = OPRT_OK;
    UCHAR_T * fd = NULL;
    UCHAR_T write_buff[5] = {0x00, 0x01, 0x02, 0x03, 0x04};
    UCHAR_T *read_buff = NULL;
    INT_T write_num = 0;
    INT_T read_num = 0;
    BOOL_T temp = TRUE;

    TAL_PR_NOTICE("------ uf file example start ------");

    /*open file, read and write mode*/
    fd = ufopen("test.txt", "wb+"); // 覆盖写,追加写用 "ab+"
    if(NULL == fd) {
        TAL_PR_ERR("file open fail");
    } else {
        TAL_PR_DEBUG("fd : %d", *fd);
    }

    /*change offset*/
    ufseek(fd, 0, UF_SEEK_END);
    /*write*/
    write_num += ufwrite(fd, write_buff, 5);
    TAL_PR_DEBUG("write number : %d", write_num);

    /*check if the current offset reach the end of the file*/
    temp = ufeof(fd);
    if(temp) {
        TAL_PR_DEBUG("offset is at the end");
    } else {
        TAL_PR_DEBUG("offset is not at the end");
    }

    /*change offset*/
    ufseek(fd, 0, UF_SEEK_SET);

    /*get current offset of the unique file*/
    op_ret = uftell(fd);
    TAL_PR_DEBUG("current offset : %d", op_ret);

    /*get the size of the unique file*/
    op_ret = ufgetsize("test.txt");
    TAL_PR_DEBUG("file size: %d", op_ret);
    if (op_ret > 0) {
    	write_num = op_ret;
    }

    /*read*/
    read_buff = (UCHAR_T *)tal_malloc(sizeof(CHAR_T)*write_num + 1);	
    if(NULL == read_buff) {
        TAL_PR_ERR("read buff malloc fail!");
    }
    read_num = ufread(fd, read_buff, write_num);
    for (int i =0; i<read_num; i++) {
    	TAL_PR_DEBUG("read_buff[%d} : %x", i, read_buff[i]);
    }

    /*close*/
    op_ret = ufclose(fd);
    if(OPRT_OK != op_ret) {
        TAL_PR_ERR("err<%d>, close fail!", op_ret);
    }

    tal_free(read_buff);

    return;
}

wb+ ab+ 模式打开均失败。

微信截图_20240116094635.jpg
yingtao_33
Posts: 245

Re: 【求助】【tuyaos】uf_db方式存储数据失败

wxq1123 2024年 Jan 15日 17:17
yangjie 2024年 Jan 15日 16:01

uf_file:支持文本文件和二进制文件。也是掉电不丢失的。
uf_file: 是通过文件来保存数据的,你可以先创建一个文件,文件名就相当于 key-value 中的 key ,是可以随便定义的。value 就是相当于文件内的内容,可以用来存放你的上下电次数的。

有没有直接保存16进制数据的方法?uf原来得把数据转成字符串才能保存,遇到16进制的0直接当结束符给处理掉了

uf 不需要将hex转成字符串,你直接当hex存就可以了

Post Reply