硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1129|回复: 13
收起左侧

[有问必答] ad7606+sd卡数据存储

[复制链接]

1

主题

13

回帖

16

积分

新手上路

积分
16
发表于 2024-5-8 17:25:46 | 显示全部楼层 |阅读模式
我现在在做f407+ad7606的spi方式做数据采集,移植了你们代码,现在实现了数据采集部分,采样率在10k左右,需要将数据存储到sd卡里,现在我是将采集到的数据放到一个uint16_t这样一个类型的数组里,大小是4096,我用fwrite函数写入这个数组,在电脑端打开文件是乱码,请问这是怎么回事呢?



/****** 主程序通过文件系统将数据储存到sd卡 *******************/
void AD7606_ReadFifo(void)
{
        uint32_t i;
       
        if(g_tAD.FIFO1Full_flag == 1)
        {
                res = f_open(&fil, "0:/data101.txt", FA_OPEN_ALWAYS | FA_WRITE );
                if (res != FR_OK) {
                        // 文件打开失败
                printf("文件打开失败\r\n");
                }               
                f_lseek(&fil, f_size(&fil));       
                res= f_write(&fil,(char *)g_tAD.usFIFO1Buf , sizeof(g_tAD.usFIFO1Buf), &bww);

                printf("FIFO1写入%d字节\r\n",bww);
//                for(i = 0; i < CA_SIZE; i++)
//                {
//                                                int_sampleVol[i] = ((int32_t)50000)*((float)((short)g_tAD.usFIFO1Buf[i])/32768);        //单位0.1mv       
//                                        sprintf(buf,"%0.1f\r\n", (float)int_sampleVol[i]/10+15);
////                                int_sampleVol[i] = int_sampleVol[i]/10+15+'0';
//                                        res= f_write(&fil, buf, sizeof(buf), &bww);
//                                        f_lseek(&fil, f_size(&fil));       
//                                        printf("FIFO1写入%d字节\r\n",bww);
//                        if(res != FR_OK)printf("写入数据失败\r\n");
//                }
               
                f_close(&fil);
      /*************************************/           
     INTX_DISABLE();//关掉总中断
     g_tAD.FIFO1Full_flag = 0;
     INTX_ENABLE();//开启总中断
        }
        if(g_tAD.FIFO2Full_flag == 1)
        {       
                res = f_open(&fil, "0:/data101.txt", FA_OPEN_ALWAYS | FA_WRITE );
                if (res != FR_OK) {
                        // 文件打开失败
                printf("文件打开失败\r\n");
                }               
                f_lseek(&fil, f_size(&fil));
                res= f_write(&fil,(char *)g_tAD.usFIFO1Buf , sizeof(g_tAD.usFIFO2Buf), &bww);
                printf("FIFO2写入%d字节\r\n",bww);
//                for(i = 0; i < CA_SIZE; i++)
//                {
//                                                int_sampleVol[i] = ((int32_t)50000)*((float)((short)g_tAD.usFIFO2Buf[i])/32768);        //单位0.1mv       
//        //                               
////                                        int_sampleVol[i] = int_sampleVol[i]/10+15+'0';
//                                                sprintf(buf,"%0.1f\r\n", (float)int_sampleVol[i]/10+15);
//                                                res= f_write(&fil, buf, sizeof(buf), &bww);
//                                                f_lseek(&fil, f_size(&fil));       
//                                                printf("FIFO2写入%d字节\r\n",bww);
//                        if(res != FR_OK)printf("写入数据失败\r\n");
//                }
       
                f_close(&fil);
      /*************************************/                         
     INTX_DISABLE();//关掉总中断
     g_tAD.FIFO2Full_flag = 0;
     INTX_ENABLE();//开启总中断
        }
}


这是代码,g_tAD.usFIFO1Buf是uint16_t数组,大小是4096
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116225
QQ
发表于 2024-5-9 09:39:28 | 显示全部楼层
这种的话,你要以字符串的形式写入才可以在电脑端打开文件。先用sprintf转换数据,然后fwrite写入。


当前先仅测试写入200个数据,看看正常不,多余的先不写。
回复

使用道具 举报

1

主题

13

回帖

16

积分

新手上路

积分
16
 楼主| 发表于 2024-5-9 18:18:12 | 显示全部楼层
eric2013 发表于 2024-5-9 09:39
这种的话,你要以字符串的形式写入才可以在电脑端打开文件。先用sprintf转换数据,然后fwrite写入。

这是我用你们历程改的一个测试函数,用就是i从0到4093挨个*8,将得到数据存入用sprintf转了之后存入的数据是正常的,用电脑打开也能看到

static void WriteFileTest(void)
{
        FRESULT result;
        char path[64];
        uint32_t bw;
        uint32_t i,k;
        uint8_t err = 0;
//        char sd_buf[20]={'a','b','0','1','2','3','4','5','6','7','8','9','\r','\n'};
        char sd_buf[5];
       
        static uint8_t s_ucTestSn = 0;

       
        for (i = 0; i < sizeof(g_TestBuf); i++)
        {
                g_TestBuf = i*8 ;
//                printf("%d\r\n",g_TestBuf);
               
        }
          /* 挂载文件系统 */
        result = f_mount(fs[0], "0:", 0);                        /* Mount a logical drive */
        if (result != FR_OK)
        {
                printf("挂载文件系统失败 (%s)\r\n", FR_Table[result]);
        }

        /* 打开文件 */
        sprintf(path, "0:/Speed%02d.txt", s_ucTestSn++); /* 每写1次,序号递增 */       
        result = f_open(&fil, path, FA_CREATE_ALWAYS | FA_WRITE);

        /* 写一串数据 */
//        printf("开始写文件%s %dKB ...\r\n", path, TEST_FILE_LEN / 1024);
        printf("开始写文件%s %dKB ...\r\n", path, BUF_SIZE*7 / 1024);
        for (i = 0; i < /*TEST_FILE_LEN /*/ BUF_SIZE; i++)
        {
                  sprintf(sd_buf,"%4d",g_TestBuf);
                        f_write(&fil, sd_buf, 5, &bw);
                        f_write(&fil, "\r\n", 2, &bw);
        }
        printf("写入完成");

下面这个我结合了AD7606和sd卡存储,ad7606采集到数据放到g_tAD.usFIFO1Buf,g_tAD.usFIFO2Buf实现双缓冲,现在数据没有经过处理,存储的就是ad值,也没有接信号,属于浮空输入,对应的AD值在10680左右,大概存储10s,10s内的数据都是正常的,然后后面又变成空白。现在最想实现的就是,能不能把AD7606存入uint16_t g_tAD.usFIFO2Buf, g_tAD.usFIFO1Buf的数据通过f_wirte一次写入,不用这种sprintf格式化数据之后再一个个写入,现在采样率是单通道10k,按理说数据量也不大,应该0.5s内能写完


/****** 主程序通过文件系统将数据储存到sd卡 *******************/
void AD7606_ReadFifo(void)
{
        uint32_t i;
        char buf[6];
       
        if(g_tAD.FIFO1Full_flag == 1)
        {
                res = f_open(&fil, "0:/data101.txt", FA_OPEN_ALWAYS | FA_WRITE );
                if (res != FR_OK) {
                        // 文件打开失败
                printf("文件打开失败\r\n");
                }               
//                f_lseek(&fil, f_size(&fil));       
//                res= f_write(&fil,(char *)g_tAD.usFIFO1Buf , sizeof(g_tAD.usFIFO1Buf), &bww);

//                printf("FIFO1写入%d字节\r\n",bww);
                for(i = 0; i < FIFO_SIZE; i++)
                {

                                        sprintf(buf,"%6d\r\n", g_tAD.usFIFO1Buf);
                                        res= f_write(&fil, buf, 5, &bww);
                                        printf("%s\r\n",buf);
                                        res= f_write(&fil, "\r\n", 2, &bww);
                                        f_lseek(&fil, f_size(&fil));       
                                       
                        if(res != FR_OK)printf("写入数据失败\r\n");
                }
                printf("FIFO1写入完成\r\n");
               
                f_close(&fil);
      /*************************************/           
     INTX_DISABLE();//关掉总中断
     g_tAD.FIFO1Full_flag = 0;
     INTX_ENABLE();//开启总中断
        }
        if(g_tAD.FIFO2Full_flag == 1)
        {       
                res = f_open(&fil, "0:/data101.txt", FA_OPEN_ALWAYS | FA_WRITE );
                if (res != FR_OK) {
                        // 文件打开失败
                printf("文件打开失败\r\n");
                }               
                for(i = 0; i < FIFO_SIZE; i++)
                {
                                        sprintf(buf,"%6d\r\n", g_tAD.usFIFO2Buf);
                                        res= f_write(&fil, buf, 5, &bww);
                                        printf("%s\r\n",buf);
                                        res= f_write(&fil, "\r\n", 2, &bww);
                                        f_lseek(&fil, f_size(&fil));       
                                       
                        if(res != FR_OK)printf("写入数据失败\r\n");
                }printf("FIFO2写入完成\r\n");
       
                f_close(&fil);
      /*************************************/                         
     INTX_DISABLE();//关掉总中断
     g_tAD.FIFO2Full_flag = 0;
     INTX_ENABLE();//开启总中断
        }
}


回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116225
QQ
发表于 2024-5-10 09:21:01 | 显示全部楼层
无限火力 发表于 2024-5-9 18:18
这是我用你们历程改的一个测试函数,用就是i从0到4093挨个*8,将得到数据存入用sprintf转了之后存入的数 ...

一次性写入需要你开个大缓冲记录。写入原始hex值的话,电脑端不方便打开查看了,当然,数据本身是没问题的。


然后就是你这里还可以换个写入方法,上电后,fopen仅调用一次即可。全程不关闭。然后仅需要调用f_wrtie + f_sync即可,这个f_sync会同步实际保存到SD卡。
回复

使用道具 举报

1

主题

13

回帖

16

积分

新手上路

积分
16
 楼主| 发表于 2024-5-10 09:54:57 | 显示全部楼层
eric2013 发表于 2024-5-10 09:21
一次性写入需要你开个大缓冲记录。写入原始hex值的话,电脑端不方便打开查看了,当然,数据本身是没问题 ...

感谢硬汉哥的解答,大缓冲记录的话,我是开辟了uint16_t的两个数组,大小是4096,8k个字节,单通道采样,采样率在10k,应该够了。也就说我如果需要一次写入8k个字节的话,只能存入原始数据hex值吗?
如果采用f_wrtie + f_sync的话就用sprintf函数像下面这个函数一样,一个个数据写入嘛,如果用自己编写的转成字符串的函数会不会转化速度比sprintf速度快。再次感谢硬汉哥,对这方面理解还不是很清楚,麻烦您了

               for(i = 0; i < FIFO_SIZE; i++)
                {

                                        sprintf(buf,"%6d\r\n", g_tAD.usFIFO1Buf);
                                        res= f_write(&fil, buf, 5, &bww);
                                        printf("%s\r\n",buf);
                                        res= f_write(&fil, "\r\n", 2, &bww);
                                        f_lseek(&fil, f_size(&fil));      
                                       
                        if(res != FR_OK)printf("写入数据失败\r\n");
                }
                printf("FIFO1写入完成\r\n");
               
                f_close(&fil);
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116225
QQ
发表于 2024-5-11 08:04:54 | 显示全部楼层
无限火力 发表于 2024-5-10 09:54
感谢硬汉哥的解答,大缓冲记录的话,我是开辟了uint16_t的两个数组,大小是4096,8k个字节,单通道采样, ...

推荐自己写个转换函数,一次性4K全部转换成文本写入到一个临时buf里面,然后整体写入。

不推荐转换一个数值,存入一个,速度非常慢。
回复

使用道具 举报

1

主题

13

回帖

16

积分

新手上路

积分
16
 楼主| 发表于 2024-5-11 23:44:48 | 显示全部楼层
eric2013 发表于 2024-5-11 08:04
推荐自己写个转换函数,一次性4K全部转换成文本写入到一个临时buf里面,然后整体写入。

不推荐转换一 ...

十分感谢硬汉哥的回答,我按照您说的这样,开辟了char *sBuf_HexToStr1[BUF_SIZE]这样一个指针数组,按照我的理解呢就是sBuf_HexToStr1存放我转将数据转换后的字符串,然后用fwrite写入sBuf_HexToStr1,不知道这样对不对,我这样写入之后,电脑文件打开显示还是空白,也不知道咋回事,下面是我测试存储的代码,麻烦您看看有没有问题,十分感谢
//void HexToStr(char *buf[],uint16_t data[],int datasize)
//{
//        int i;
//        uint16_t volt;
//        for(i = 0;i < datasize;i++)
//        {
//                volt = data;
//                sprintf(buf,"%2f",(float)volt*5000/32768);
//        }
//}



#define TEST_FILE_LEN                        (8*1024)        /* 用于测试的文件长度 */
#define BUF_SIZE                                (1*1024)                /* 每次读写SD卡的最大数据长度 */
FRESULT res;          // FatFs[函数]
FIL fil;             // 文件对象

char  *sBuf_HexToStr1[BUF_SIZE];


static void WriteFileTest(void);

char FsReadBuf[1024];
char FsWriteBuf[1024] = {"FatFS Write Demo \r\n www.armfly.com \r\n"};
uint16_t g_TestBuf[BUF_SIZE];

void HexToStr(char *buf[],uint16_t data[],int datasize);



int main(void)
{  
       
        u32 total,free;
        static int tempLocate;
        int i;       

        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
        delay_init(168);  //初始化延时函数
        uart_init(921600);                //初始化串口波特率为115200
        LED_Init();                                        //初始化LED
        while(SD_Init())//检测不到SD卡
        {
                printf("SD Card Error!\r\n");
                delay_ms(500);                                       
                printf("Please Check! \r\n");
                delay_ms(500);
                LED0=!LED0;//DS0闪烁
        }
        exfuns_init();                                                        //为fatfs相关变量申请内存                                 
  f_mount(fs[0],"0:",1);                                         //挂载SD卡                                                                                               
        while(exf_getfree("0",&total,&free))        //得到SD卡的总容量和剩余容量
        {

                printf("SD Card Fatfs Error!\r\n");
                  
                delay_ms(200);
                LED0=!LED0;//DS0闪烁
        }                                                                                                                                                     
        printf("总容量: %d MB ,剩余容量:%d  MB\r\n",total>>10,free>>10);
       
//        bsp_InitAD7606();        /* 配置AD7606所用的GPIO */
//        AD_RANGE_5V();    //量程
//        ad7606_StartConv();                                /* 启动采样,避免第1组数据全0的问题 */
//        ad7606_StartRecord(10000);
//        printf("启动采集\r\n");// 写入文件失败
        WriteFileTest();
        while(1)
        {

        }
}
       
static const char * FR_Table[]=
{
        "FR_OK:成功",                                                             /* (0) Succeeded */
        "FR_DISK_ERR:底层硬件错误",                                         /* (1) A hard error occurred in the low level disk I/O layer */
        "FR_INT_ERR:断言失败",                                                     /* (2) Assertion failed */
        "FR_NOT_READY:物理驱动没有工作",                                     /* (3) The physical drive cannot work */
        "FR_NO_FILE:文件不存在",                                                 /* (4) Could not find the file */
        "FR_NO_PATH:路径不存在",                                                 /* (5) Could not find the path */
        "FR_INVALID_NAME:无效文件名",                                     /* (6) The path name format is invalid */
        "FR_DENIED:由于禁止访问或者目录已满访问被拒绝",         /* (7) Access denied due to prohibited access or directory full */
        "FR_EXIST:文件已经存在",                                             /* (8) Access denied due to prohibited access */
        "FR_INVALID_OBJECT:文件或者目录对象无效",                         /* (9) The file/directory object is invalid */
        "FR_WRITE_PROTECTED:物理驱动被写保护",                             /* (10) The physical drive is write protected */
        "FR_INVALID_DRIVE:逻辑驱动号无效",                                 /* (11) The logical drive number is invalid */
        "FR_NOT_ENABLED:卷中无工作区",                                         /* (12) The volume has no work area */
        "FR_NO_FILESYSTEM:没有有效的FAT卷",                             /* (13) There is no valid FAT volume */
        "FR_MKFS_ABORTED:由于参数错误f_mkfs()被终止",                 /* (14) The f_mkfs() aborted due to any parameter error */
        "FR_TIMEOUT:在规定的时间内无法获得访问卷的许可",                 /* (15) Could not get a grant to access the volume within defined period */
        "FR_LOCKED:由于文件共享策略操作被拒绝",                                 /* (16) The operation is rejected according to the file sharing policy */
        "FR_NOT_ENOUGH_CORE:无法分配长文件名工作区",                     /* (17) LFN working buffer could not be allocated */
        "FR_TOO_MANY_OPEN_FILES:当前打开的文件数大于_FS_SHARE", /* (18) Number of open files > _FS_SHARE */
        "FR_INVALID_PARAMETER:参数无效"                             /* (19) Given parameter is invalid */
};

static void WriteFileTest(void)
{
        FRESULT result;
        char path[64];
        uint32_t bw;
        uint32_t i,k;
        uint16_t volt;
        uint8_t err = 0;

        static uint8_t s_ucTestSn = 0;
//        char  *sBuf_HexToStr1[4096];
       
        for (i = 0; i < BUF_SIZE; i++)
        {
                sBuf_HexToStr1= mymalloc(SRAMIN, 20);
        }
        printf("sBuf_HexToStr1=%d字节\r\n",sizeof(sBuf_HexToStr1));
       
       
        for (i = 0; i < sizeof(g_TestBuf); i++)
        {
                g_TestBuf = i*8 ;
//                printf("%d\r\n",g_TestBuf);
        }
//        HexToStr(sBuf_HexToStr1,g_TestBuf,BUF_SIZE);
        for(i = 0;i < BUF_SIZE;i++)
        {
                volt = g_TestBuf;
                sprintf(sBuf_HexToStr1,"%0.1f",(float)volt*5000/32768);
                printf("(%s)\r\n", sBuf_HexToStr1);
        }
       
        printf("(%d)\r\n", sizeof(sBuf_HexToStr1));
          /* 挂载文件系统 */
        result = f_mount(fs[0], "0:", 0);                        /* Mount a logical drive */
        if (result != FR_OK)
        {
                printf("挂载文件系统失败 (%s)\r\n", FR_Table[result]);
        }

        /* 打开文件 */
        sprintf(path, "0:/Speed%02d.txt", s_ucTestSn++); /* 每写1次,序号递增 */       
        result = f_open(&fil, path, FA_CREATE_ALWAYS | FA_WRITE);

        /* 写一串数据 */
//        printf("开始写文件%s %dKB ...\r\n", path, TEST_FILE_LEN / 1024);
        printf("开始写文件%s %dKB ...\r\n", path, sizeof(sBuf_HexToStr1) / 1024);
//        for (i = 0; i < /*TEST_FILE_LEN /*/ BUF_SIZE; i++)
//        {
//                  sprintf(sd_buf,"%4d",g_TestBuf);
//                        f_write(&fil, sd_buf, 5, &bw);
//                        f_write(&fil, "\r\n", 2, &bw);
//        }
//        printf("写入完成");
       
        for (i = 0; i < TEST_FILE_LEN/BUF_SIZE; i++)
        {
                result = f_write(&fil, sBuf_HexToStr1, sizeof(sBuf_HexToStr1), &bw);
                printf("一次写入%d字节\r\n",bw);
                if (result == FR_OK)
                {
                        if (((i + 1) % 8) == 0)
                        {
                                printf(".");
                        }
                }
                else
                {
                        err = 1;
                        printf("%s文件写失败\r\n", path);
                        break;
                }
        }
       
        f_close(&fil);                /* 关闭文件*/

//        /* 卸载文件系统 */
        f_mount(NULL, "0:", 0);
        for (i = 0; i < BUF_SIZE; i++)
        {
                myfree(SRAMIN, sBuf_HexToStr1);
        }
//       
       
}

//void HexToStr(char *buf[],uint16_t data[],int datasize)
//{
//        int i;
//        uint16_t volt;
//        for(i = 0;i < datasize;i++)
//        {
//                volt = data;
//                sprintf(buf,"%2f",(float)volt*5000/32768);
//        }
//}
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116225
QQ
发表于 2024-5-12 08:36:38 | 显示全部楼层
无限火力 发表于 2024-5-11 23:44
十分感谢硬汉哥的回答,我按照您说的这样,开辟了char *sBuf_HexToStr1这样一个指针数组,按照我的理解呢 ...

代码有误,sBuf_HexToStr1没有递增吗

for (i = 0; i < BUF_SIZE; i++)
        {
                sBuf_HexToStr1= mymalloc(SRAMIN, 20);
        }
回复

使用道具 举报

1

主题

13

回帖

16

积分

新手上路

积分
16
 楼主| 发表于 2024-5-12 14:56:05 | 显示全部楼层
本帖最后由 无限火力 于 2024-5-12 17:38 编辑
eric2013 发表于 2024-5-12 08:36
代码有误,sBuf_HexToStr1没有递增吗

for (i = 0; i < BUF_SIZE; i++)

        for (i = 0; i < BUF_SIZE; i++)
        {
                sBuf_HexToStr1= mymalloc(SRAMIN, 20);
        }
是这样的,也是递增的
回复

使用道具 举报

1

主题

13

回帖

16

积分

新手上路

积分
16
 楼主| 发表于 2024-5-13 01:14:23 | 显示全部楼层
eric2013 发表于 2024-5-12 08:36
代码有误,sBuf_HexToStr1没有递增吗

for (i = 0; i < BUF_SIZE; i++)

是递增的,但是不知道为啥,到论坛上之后就没了,我char* str[4096],就是每个str都分配了20个字节的内存,我  然后将每一个用sprintf转化后的数据存储到sBuf_HexToStr1中,然后我在用result = f_write(&fil, sBuf_HexToStr1, sizeof(sBuf_HexToStr1), &bw);写入,写进去也是一些乱码,实在有点手足无措了,能不能麻烦硬汉哥,抽空试试我这个方案看看是否可行,要不要放弃
for(i = 0;i < BUF_SIZE;i++)
        {
                volt = g_TestBuf;
                sprintf(sBuf_HexToStr1,"%0.1f",(float)volt*5000/32768);
                printf("(%s)\r\n", sBuf_HexToStr1);
        }
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116225
QQ
发表于 2024-5-13 09:12:25 | 显示全部楼层
无限火力 发表于 2024-5-13 01:14
是递增的,但是不知道为啥,到论坛上之后就没了,我char* str[4096],就是每个str都分配了20个字节的内存 ...

别的问题看出来了
回复

使用道具 举报

1

主题

13

回帖

16

积分

新手上路

积分
16
 楼主| 发表于 2024-5-13 22:24:41 | 显示全部楼层
eric2013 发表于 2024-5-13 09:12
别的问题看出来了

还是不行,感谢硬汉哥最近的解答了
回复

使用道具 举报

1

主题

13

回帖

16

积分

新手上路

积分
16
 楼主| 发表于 2024-5-15 10:06:49 | 显示全部楼层
无限火力 发表于 2024-5-13 01:14
是递增的,但是不知道为啥,到论坛上之后就没了,我char* str[4096],就是每个str都分配了20个字节的内存 ...

问题已解决,本次不在采用字符指针数组,而是直接定义一个字符指针char*str,给这个指针开辟足够大的内存空间,可以定义一个占用内存较小的char *ADc来存放用sprintf转换后的字符串,用starct函数将ADc里的字符串连接到str里,然后用fwirte函数写入成功,同时测试了sdio驱动下的存储速度,大概在1704kb/s,对于我的数据量来说已经足够了
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116225
QQ
发表于 2024-5-16 09:15:55 | 显示全部楼层
无限火力 发表于 2024-5-15 10:06
问题已解决,本次不在采用字符指针数组,而是直接定义一个字符指针char*str,给这个指针开辟足够大的内存 ...

好的,果然是前面的字符串处理问题。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-6-10 14:41 , Processed in 0.307686 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表