Browse Source

exfat支持修复。添加uart框架中控485端口功能完成

master
sc 20 hours ago
parent
commit
fd04893625
  1. 9
      .config
  2. 5
      .cproject
  3. BIN
      .settings/.rtmenus
  4. 2
      .settings/language.settings.xml
  5. 14
      applications/DATA/DATA_comm.c
  6. 2
      applications/DATA/DATA_comm.h
  7. 13
      applications/DATA/DATA_uart.c
  8. 152
      applications/DATA/uart_rs485.c
  9. 15
      applications/DATA/uart_rs485.h
  10. 262
      applications/DBSQL/DB_SQLite.c
  11. 6
      applications/main.c
  12. 179
      applications/mount_sdio_elmfatfs_pin.c
  13. 1
      packages/UartFramework-latest
  14. 5
      packages/pkgs.json
  15. 30
      rt-thread/components/dfs/filesystems/elmfat/dfs_elm.c
  16. 4
      rt-thread/components/dfs/filesystems/elmfat/ffconf.h
  17. 2
      rtconfig.h

9
.config

@ -536,6 +536,7 @@ CONFIG_PKG_CJSON_VER="v1.7.17"
# CONFIG_PKG_USING_RVBACKTRACE is not set
# CONFIG_PKG_USING_HPATCHLITE is not set
# CONFIG_PKG_USING_THREAD_METRIC is not set
# CONFIG_PKG_USING_UORB is not set
# end of tools packages
#
@ -630,7 +631,13 @@ CONFIG_PKG_USING_SQLITE_V3193=y
# CONFIG_PKG_USING_FLASH_BLOB is not set
# CONFIG_PKG_USING_MLIBC is not set
# CONFIG_PKG_USING_TASK_MSG_BUS is not set
# CONFIG_PKG_USING_UART_FRAMEWORK is not set
CONFIG_PKG_USING_UART_FRAMEWORK=y
CONFIG_PKG_UART_FRAMEWORK_PATH="/packages/system/UartFramework"
# CONFIG_PKG_USING_UART_FRAMEWORK_V001 is not set
# CONFIG_PKG_USING_UART_FRAMEWORK_V004 is not set
# CONFIG_PKG_USING_UART_FRAMEWORK_V100 is not set
CONFIG_PKG_USING_UART_FRAMEWORK_LATEST_VERSION=y
CONFIG_PKG_UART_FRAMEWORK_VER="latest"
# CONFIG_PKG_USING_SFDB is not set
# CONFIG_PKG_USING_RTP is not set
# CONFIG_PKG_USING_REB is not set

5
.cproject

@ -83,6 +83,7 @@
<listOptionValue builtIn="false" value="&quot;${workspace_loc://${ProjName}//.}&quot;" />
<listOptionValue builtIn="false" value="&quot;${workspace_loc://${ProjName}//cubemx/Inc}&quot;" />
<listOptionValue builtIn="false" value="&quot;${workspace_loc://${ProjName}//cubemx}&quot;" />
<listOptionValue builtIn="false" value="&quot;${workspace_loc://${ProjName}//packages/UartFramework-latest}&quot;" />
<listOptionValue builtIn="false" value="&quot;${workspace_loc://${ProjName}//packages/cJSON-v1.7.17}&quot;" />
<listOptionValue builtIn="false" value="&quot;${workspace_loc://${ProjName}//packages/sqlite-v3.19.3}&quot;" />
<listOptionValue builtIn="false" value="&quot;${workspace_loc://${ProjName}//rt-thread/components/dfs/filesystems/devfs}&quot;" />
@ -195,6 +196,7 @@
<listOptionValue builtIn="false" value="&quot;${workspace_loc://${ProjName}//.}&quot;" />
<listOptionValue builtIn="false" value="&quot;${workspace_loc://${ProjName}//cubemx/Inc}&quot;" />
<listOptionValue builtIn="false" value="&quot;${workspace_loc://${ProjName}//cubemx}&quot;" />
<listOptionValue builtIn="false" value="&quot;${workspace_loc://${ProjName}//packages/UartFramework-latest}&quot;" />
<listOptionValue builtIn="false" value="&quot;${workspace_loc://${ProjName}//packages/cJSON-v1.7.17}&quot;" />
<listOptionValue builtIn="false" value="&quot;${workspace_loc://${ProjName}//packages/sqlite-v3.19.3}&quot;" />
<listOptionValue builtIn="false" value="&quot;${workspace_loc://${ProjName}//rt-thread/components/dfs/filesystems/devfs}&quot;" />
@ -284,6 +286,7 @@
<listOptionValue builtIn="false" value="&quot;${workspace_loc://${ProjName}//.}&quot;" />
<listOptionValue builtIn="false" value="&quot;${workspace_loc://${ProjName}//cubemx/Inc}&quot;" />
<listOptionValue builtIn="false" value="&quot;${workspace_loc://${ProjName}//cubemx}&quot;" />
<listOptionValue builtIn="false" value="&quot;${workspace_loc://${ProjName}//packages/UartFramework-latest}&quot;" />
<listOptionValue builtIn="false" value="&quot;${workspace_loc://${ProjName}//packages/cJSON-v1.7.17}&quot;" />
<listOptionValue builtIn="false" value="&quot;${workspace_loc://${ProjName}//packages/sqlite-v3.19.3}&quot;" />
<listOptionValue builtIn="false" value="&quot;${workspace_loc://${ProjName}//rt-thread/components/dfs/filesystems/devfs}&quot;" />
@ -377,6 +380,7 @@
<listOptionValue builtIn="false" value="&quot;${workspace_loc://${ProjName}//.}&quot;" />
<listOptionValue builtIn="false" value="&quot;${workspace_loc://${ProjName}//cubemx/Inc}&quot;" />
<listOptionValue builtIn="false" value="&quot;${workspace_loc://${ProjName}//cubemx}&quot;" />
<listOptionValue builtIn="false" value="&quot;${workspace_loc://${ProjName}//packages/UartFramework-latest}&quot;" />
<listOptionValue builtIn="false" value="&quot;${workspace_loc://${ProjName}//packages/cJSON-v1.7.17}&quot;" />
<listOptionValue builtIn="false" value="&quot;${workspace_loc://${ProjName}//packages/sqlite-v3.19.3}&quot;" />
<listOptionValue builtIn="false" value="&quot;${workspace_loc://${ProjName}//rt-thread/components/dfs/filesystems/devfs}&quot;" />
@ -468,6 +472,7 @@
<listOptionValue builtIn="false" value="&quot;${workspace_loc://${ProjName}//.}&quot;" />
<listOptionValue builtIn="false" value="&quot;${workspace_loc://${ProjName}//cubemx/Inc}&quot;" />
<listOptionValue builtIn="false" value="&quot;${workspace_loc://${ProjName}//cubemx}&quot;" />
<listOptionValue builtIn="false" value="&quot;${workspace_loc://${ProjName}//packages/UartFramework-latest}&quot;" />
<listOptionValue builtIn="false" value="&quot;${workspace_loc://${ProjName}//packages/cJSON-v1.7.17}&quot;" />
<listOptionValue builtIn="false" value="&quot;${workspace_loc://${ProjName}//packages/sqlite-v3.19.3}&quot;" />
<listOptionValue builtIn="false" value="&quot;${workspace_loc://${ProjName}//rt-thread/components/dfs/filesystems/devfs}&quot;" />

BIN
.settings/.rtmenus

Binary file not shown.

2
.settings/language.settings.xml

@ -5,7 +5,7 @@
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
<provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="-1258495279358323302" id="ilg.gnuarmeclipse.managedbuild.cross.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT ARM Cross GCC Built-in Compiler Settings " parameter="${COMMAND} ${FLAGS} ${cross_toolchain_flags} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="-1271074065029506902" id="ilg.gnuarmeclipse.managedbuild.cross.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT ARM Cross GCC Built-in Compiler Settings " parameter="${COMMAND} ${FLAGS} ${cross_toolchain_flags} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<language-scope id="org.eclipse.cdt.core.gcc"/>
<language-scope id="org.eclipse.cdt.core.g++"/>
</provider>

14
applications/DATA/DATA_comm.c

@ -101,6 +101,9 @@ void pasre_DAT(const char *api, const char *json_str)
cJSON_AddItemToObject(dat,"Groups",cJSON_CreateString(machine_ID));
}
else if (strcmp(api, "SC810") == 0)
{
}
else if (strcmp(api, "SC811") == 0)
{//工单明细
// === 解析整数变量 StepN ===
GET_INT_VAR(StepN, root, "StepN", 0);
@ -132,11 +135,10 @@ void pasre_DAT(const char *api, const char *json_str)
GET_FLOAT_VAR(P3S3, root, "P3S3", 0.0f);
GET_FLOAT_VAR(P4S3, root, "P4S3", 0.0f);
GET_FLOAT_VAR(P5S3, root, "P5S3", 0.0f);
cJSON_AddItemToObject(dat,"Work",cJSON_CreateString(Work));
cJSON_AddItemToObject(dat,"ReDye",cJSON_CreateNumber(Redye));
}
else if (strcmp(api, "SC811") == 0) {
printf("Processing:SC811\n");
cJSON_AddItemToObject(dat,"StepN",cJSON_CreateNumber(StepN));
}
else if (strcmp(api, "SC812") == 0) {
printf("Processing:SC812\n");
@ -295,18 +297,22 @@ void proc_thread_entry(void *parameter)
if (!req) continue;
memcpy(DATA_api,req->input,5);
extract_between(req->input, "[", "]", machine_ID, sizeof(machine_ID));
char *p=strstr(req->input,"]");
if(!p){cjson_falg=0;}
else {
p += strlen("]");
}
//处理指令分析
pasre_DAT(DATA_api,p);
// 回复
int16_t total_len = strlen(machine_ID) + strlen(json_buffer) + 8;
char t_buffer[total_len];
snprintf(t_buffer,total_len,"%s[%s]%s",DATA_api,machine_ID,json_buffer);
snprintf(t_buffer,total_len,"%s[%s]%s\n",DATA_api,machine_ID,json_buffer);
req->output_len = rt_snprintf(req->output, sizeof(req->output),t_buffer);
// 通知 UART 线程可以发送了
if (req->sem)
{

2
applications/DATA/DATA_comm.h

@ -11,7 +11,7 @@
#define APPLICATIONS_DATA_COMM_H_
// 最大输入/输出长度
#define MAX_INPUT_LEN 1024
#define MAX_INPUT_LEN 512
#define MAX_OUTPUT_LEN 1024*3
// 请求结构体

13
applications/DATA/DATA_uart.c

@ -14,7 +14,7 @@
#define SAMPLE_UART_NAME "uart2"
#define DMA_RX_BUF_SIZE 512
#define RINGBUF_SIZE 4096
#define RINGBUF_SIZE 1024
static rt_device_t serial;
@ -74,21 +74,14 @@ void uart_thread_entry(void *parameter)
{
// 处理接收到的数据(提取完整行)
while ((len = get_line(input, sizeof(input))) > 0)
{ // 调试:打印每个字节
/* rt_kprintf("Len=%d, Data: ", len);
for (int i = 0; i < len; i++) {
rt_kprintf("[%02X '%c'] ", input[i],
(input[i] >= 32 && input[i] < 127) ? input[i] : '.');
}
rt_kprintf("\n");
rt_kprintf("Received: [%.*s]\n", len, input);*/
{
// 动态分配请求结构体(见之前完整代码)
struct proc_request *req = rt_malloc(sizeof(struct proc_request));
if (!req) continue;
rt_strncpy(req->input, input, sizeof(req->input));
req->input_len = len;
//req->input[len]='\0';
req->sem = rt_malloc(sizeof(struct rt_semaphore));
if (!req->sem) {

152
applications/DATA/uart_rs485.c

@ -0,0 +1,152 @@
/*
* Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2025-10-25 Administrator the first version
*/
# include <rtthread.h>
# include <rtdevice.h>
# include <board.h>
# include <stdio.h>
#include "uart_framework.h"
#include "data_comm.h"
#define LOG_TAG "uart.rx"
#define LOG_LVL LOG_LVL_DBG
//#include <ulog.h>
#define UART_NAME "uart2"
#define UART_BAUD_RATE BAUD_RATE_115200
#define RS485RD GET_PIN(A,10)
#define RS485_RX() rt_pin_write(RS485RD, 0)
#define RS485_TX() rt_pin_write(RS485RD, 1)
#define RECV_BUF_SIZE (512)
#define FRAME_TIMEOUT_MS 20
#define SEND_INTERVAL_MS 0
#define REQUEST_TIMEOUT_MS 250
static uart_framework_t uf = RT_NULL;
static void rs485_set_tx(void)
{
RS485_TX();
rt_thread_mdelay(1);
}
static void rs485_set_rx(void)
{
rt_thread_mdelay(1);
RS485_RX();
}
static void rs485_gpio_init(void)
{
rt_pin_mode(RS485RD, PIN_MODE_OUTPUT);
rs485_set_rx();
}
static rt_err_t uart_rs485_init(void)
{
rt_device_t serial_device = rt_device_find(UART_NAME);
if (serial_device == RT_NULL)
{
rt_kprintf("not find the serial device:%s!", UART_NAME);
return -RT_ERROR;
}
/* 修改串口配置 */
struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;
config.baud_rate = UART_BAUD_RATE;
config.bufsz = RECV_BUF_SIZE; // 接收缓冲区大小
rt_device_control(serial_device, RT_DEVICE_CTRL_CONFIG, &config);
rs485_gpio_init();
struct uart_framework_cfg cfg = { .uart_name = UART_NAME, .max_frame_size = RECV_BUF_SIZE, .frame_interval_ms =
FRAME_TIMEOUT_MS, .send_interval_ms = SEND_INTERVAL_MS, .rs485_txd = rs485_set_tx, .rs485_rxd = rs485_set_rx };
//如果不是485,则配置rs485_txd和rs485_rxd为RT_NULL
uf = uart_framework_create(&cfg);
if (uf == RT_NULL)
{
rt_kprintf("SCCM link create failed on %s\n", UART_NAME);
return -RT_ERROR;
}
else
{
rt_kprintf("SCCM link create success on %s!\n", UART_NAME);
return RT_EOK;
}
}
static rt_err_t frame_handler(rt_uint8_t *data, rt_size_t size)
{
//解析数据
rt_err_t res;
struct proc_request *req = rt_malloc(sizeof(struct proc_request));
if (!req){ return RT_ERROR;}
rt_strncpy(req->input, (const char *)data, sizeof(req->input));
req->input_len = size;
req->sem = rt_malloc(sizeof(struct rt_semaphore));
if (!req->sem) {
rt_free(req);
return RT_ERROR;
}
rt_sem_init(req->sem, "uart_resp", 0, RT_IPC_FLAG_FIFO);
// 发送到处理线程
if (rt_mq_send(proc_mq, &req, sizeof(req)) == RT_EOK)
{
// 等待处理完成
if (rt_sem_take(req->sem, RT_WAITING_FOREVER) == RT_EOK)
{
res= uart_framework_send(uf, (rt_uint8_t *)req->output, req->output_len);
}
}
// 清理
rt_sem_detach(req->sem); // 或 rt_sem_delete
rt_free(req->sem);
rt_free(req);
//这里直接返回接收到的数据
// rt_uint8_t *frame_data = data;
// rt_uint16_t frame_len = size;
// rt_kprintf("rx_buf", 16, frame_data, frame_len);
// rt_err_t res = uart_framework_send(uf, frame_data, frame_len);
return res;
}
static void rs485_rx_handler(void *params)
{
while (1)
{
if(uart_framework_receive(uf, RT_WAITING_FOREVER, RT_NULL, RT_NULL, 0) == RT_EOK)
{
frame_handler(uf->rx_buf, uf->rx_size);
}
}
}
int app_uart_rs485_startup(void)
{
rt_err_t rst;
rst = uart_rs485_init();
if (rst != RT_EOK)
return rst;
rt_thread_t t = rt_thread_create("rs485rx", rs485_rx_handler, RT_NULL, 1024 * 4, 12, 20);
if (t == RT_NULL)
return -RT_ENOMEM;
rst = rt_thread_startup(t);
return rst;
}
//INIT_APP_EXPORT(app_uart_rs485_startup);

15
applications/DATA/uart_rs485.h

@ -0,0 +1,15 @@
/*
* Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2025-10-25 Administrator the first version
*/
#ifndef APPLICATIONS_DATA_UART_RS485_H_
#define APPLICATIONS_DATA_UART_RS485_H_
int app_uart_rs485_startup(void);
#endif /* APPLICATIONS_DATA_UART_RS485_H_ */

262
applications/DBSQL/DB_SQLite.c

@ -10,25 +10,262 @@
#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>
#include <dfs_posix.h>
#include "DB_SQLite.h"
#include "sqlite3.h"
#include <dbhelper.h>
#define DB_NAME "/rt.db"
#define DB_NAME "/SC828.db"
int db_HelperInit;
sqlite3 **db;
static const char *sql_upgrade_workorder_steps =
"CREATE TABLE WorkorderSteps ("
"WorkOrder VARCHAR,"
"DYELOT VARCHAR,"
"ProgramID VARCHAR,"
"Program VARCHAR,"
"ReDye INT DEFAULT (0),"
"Mode VARCHAR,"
"Step INT,"
"StepID VARCHAR,"
"StepName VARCHAR,"
"ParameterName VARCHAR,"
"Parameter1 DOUBLE,"
"Parameter2 DOUBLE,"
"Parameter3 DOUBLE,"
"Parameter4 DOUBLE,"
"Parameter5 DOUBLE,"
"Parameter6 INT,"
"Parameter7 INT,"
"Parameter8 INT,"
"Parameter9 INT,"
"Parameter10 INT,"
"Remark VARCHAR,"
"StepTime INT,"
"StepID_S1 VARCHAR,"
"StepID_S2 VARCHAR,"
"StepID_S3 VARCHAR,"
"StepName_S1 VARCHAR,"
"StepName_S2 VARCHAR,"
"StepName_S3 VARCHAR,"
"Parameter1_S1 DOUBLE,"
"Parameter1_S2 DOUBLE,"
"Parameter1_S3 DOUBLE,"
"Parameter2_S1 DOUBLE,"
"Parameter2_S2 DOUBLE,"
"Parameter2_S3 DOUBLE,"
"Parameter3_S1 DOUBLE,"
"Parameter3_S2 DOUBLE,"
"Parameter3_S3 DOUBLE,"
"Parameter4_S1 DOUBLE,"
"Parameter4_S2 DOUBLE,"
"Parameter4_S3 DOUBLE,"
"Parameter5_S1 DOUBLE,"
"Parameter5_S2 DOUBLE,"
"Parameter5_S3 DOUBLE"
"); ";
static const char *sql_upgrade_workorder_set =
"CREATE TABLE WorkOrderSet ("
"WorkOrder VARCHAR,"
"ReDye INT DEFAULT (0),"
"PumpSpeed INT,"
"Blower INT,"
"Swing INT,"
"ClothWheel INT,"
"Nozzle INT"
"); ";
static const char *sql_upgrade_workorder =
"CREATE TABLE WorkOrder ("
"WorkOrder VARCHAR,"
"Dyelot VARCHAR,"
"ReDye INT DEFAULT (0),"
"ProgramName VARCHAR,"
"StartTime DATETIME,"
"EndTime DATETIME,"
"Time TEXT,"
"lock INT,"
"State INT,"
"ProgramID VARCHAR,"
"Machines VARCHAR,"
"color VARCHAR,"
"ColorNumber VARCHAR,"
"Client VARCHAR,"
"ClothWeight VARCHAR,"
"ClothSpecies VARCHAR,"
"BathRatio VARCHAR,"
"Total VARCHAR,"
"USER VARCHAR,"
"ColorName VARCHAR,"
"Remark TEXT"
"); ";
static const char *sql_upgrade_run_table =
// "PRAGMA foreign_keys = OFF; "
// "BEGIN TRANSACTION; "
// "CREATE TABLE sqlitestudio_temp_table AS SELECT * FROM RUN; "
// "DROP TABLE RUN; "
"CREATE TABLE RUN ("
"WorkOrder VARCHAR,"
"DYELOT VARCHAR,"
"ReDye INT DEFAULT (0),"
"RUN INT,"
"Mode VARCHAR,"
"ProgramID VARCHAR,"
"Program VARCHAR,"
"StepID VARCHAR,"
"Step INT,"
"StepName VARCHAR,"
"ParameterName VARCHAR,"
"Parameter1 DOUBLE,"
"Parameter2 DOUBLE,"
"Parameter3 DOUBLE,"
"Parameter4 DOUBLE,"
"Parameter5 DOUBLE,"
"Parameter6 INT,"
"Parameter7 INT,"
"Parameter8 INT,"
"Parameter9 INT,"
"Parameter10 INT,"
"Remark VARCHAR,"
"StepTime INT,"
"StepID_S1 VARCHAR,"
"StepID_S2 VARCHAR,"
"StepID_S3 VARCHAR,"
"StepName_S1 VARCHAR,"
"StepName_S2 VARCHAR,"
"StepName_S3 VARCHAR,"
"Parameter1_S1 DOUBLE,"
"Parameter1_S2 DOUBLE,"
"Parameter1_S3 DOUBLE,"
"Parameter2_S1 DOUBLE,"
"Parameter2_S2 DOUBLE,"
"Parameter2_S3 DOUBLE,"
"Parameter3_S1 DOUBLE,"
"Parameter3_S2 DOUBLE,"
"Parameter3_S3 DOUBLE,"
"Parameter4_S1 DOUBLE,"
"Parameter4_S2 DOUBLE,"
"Parameter4_S3 DOUBLE,"
"Parameter5_S1 DOUBLE,"
"Parameter5_S2 DOUBLE,"
"Parameter5_S3 DOUBLE"
");";
static const char *sql_upgrade_dyelot_table =
"CREATE TABLE Dyelot ("
"WorkOrder VARCHAR,"
"Dyelot VARCHAR,"
"ReDye INT,"
"Machine VARCHAR,"
"Step INT,"
"Tank INT,"
"State INT,"
"ProductCode VARCHAR,"
"ProductName VARCHAR,"
"ProductType INT,"
"Grams FLOAT,"
"Amount FLOAT,"
"CALL_TIME VARCHAR,"
"DispenseEndTime VARCHAR,"
"Type INT"
"); ";
static const char *sql_upgrade_iolog_table =
// "CREATE TABLE sqlitestudio_temp_table AS SELECT * FROM IOLog; "
// "DROP TABLE IOLog; "
"CREATE TABLE IOLog ("
"ID varchar(32),"
"IOName varchar(32),"
"type varchar(32),"
"Value DOUBLE DEFAULT (0),"
"DIO BOOLEAN,"
"AIO INTEGER DEFAULT (0),"
"PLC varchar(32)"
"); ";
static const char *sql_upgrade_chart_table =
"CREATE TABLE Chart ("
"WorkOrder varchar(32),"
"DYELOT varchar(32),"
"ReDye INTEGER ,"
"Name varchar(32),"
"Time varchar(32),"
"MTT DOUBLE DEFAULT (0),"
"MTL DOUBLE DEFAULT (0),"
"STTA DOUBLE DEFAULT (0),"
"STLA DOUBLE DEFAULT (0),"
"STTB DOUBLE DEFAULT (0),"
"STLB DOUBLE DEFAULT (0),"
"STTC DOUBLE DEFAULT (0),"
"STLC DOUBLE DEFAULT (0),"
"MTH DOUBLE DEFAULT (0),"
"MST DOUBLE DEFAULT (0),"
"MSL DOUBLE DEFAULT (0),"
"MUT DOUBLE DEFAULT (0)"
"); ";
void db_sqlite(void *parameter)
{
int db_HelperInit;
int db_;
db_HelperInit = db_helper_init();
if (access(DB_NAME, F_OK) == 0)
{
rt_kprintf("DB open\n");
if (db_connect(DB_NAME) == RT_EOK){
if(db_table_is_exist("WorkorderSteps")<=0){
if(db_create_database(sql_upgrade_workorder_steps)==0)
{rt_kprintf("WorkorderSteps Created successfully \n");}else{rt_kprintf("WorkorderSteps Creation failed \n");}
}
if(db_table_is_exist("WorkOrderSet")<=0){
if(db_create_database(sql_upgrade_workorder_set)==0)
{rt_kprintf("WorkOrderSet Created successfully \n");}else{rt_kprintf("WorkOrderSet Creation failed \n");}
}
if(db_table_is_exist("WorkOrder")<=0){
if(db_create_database(sql_upgrade_workorder)==0)
{rt_kprintf("WorkOrder Created successfully \n");}else{rt_kprintf("WorkOrder Creation failed \n");}
}
if(db_table_is_exist("RUN")<=0){
if(db_create_database(sql_upgrade_run_table)==0)
{rt_kprintf("RUN Created successfully \n");}else{rt_kprintf("RUN Creation failed \n");}
}
if(db_table_is_exist("Dyelot")<=0){
if(db_create_database(sql_upgrade_dyelot_table)==0)
{rt_kprintf("Dyelot Created successfully \n");}else{rt_kprintf("Dyelot Creation failed \n");}
}
if(db_table_is_exist("IOLog")<=0){
if(db_create_database(sql_upgrade_iolog_table)==0)
{rt_kprintf("IOLog Created successfully \n");}else{rt_kprintf("IOLog Creation failed \n");}
}
if(db_table_is_exist("Chart")<=0){
if(db_create_database(sql_upgrade_chart_table)==0)
{rt_kprintf("Chart Created successfully \n");}else{rt_kprintf("Chart Creation failed \n");}
}
}else{
rt_kprintf("DB open failed \n");
}
if(db_HelperInit =RT_EOK){
rt_kprintf("HelperInit database\n");
}else{
// db_ = db_create_database("CREATE TABLE student(id INTEGER PRIMARY KEY AUTOINCREMENT,name varchar(32) NOT NULL,score INT NOT NULL);");
// if(db_=0){rt_kprintf("database ok\n");}else{rt_kprintf("database no\n");}
rt_kprintf("DB open failed \n");
sqlite3_open(DB_NAME, db);
//创建表
db_create_database(sql_upgrade_workorder_steps);
db_create_database(sql_upgrade_workorder_set);
db_create_database(sql_upgrade_workorder);
db_create_database(sql_upgrade_run_table);
db_create_database(sql_upgrade_dyelot_table);
db_create_database(sql_upgrade_iolog_table);
db_create_database(sql_upgrade_chart_table);
}
// db_HelperInit = db_helper_init();
// if(db_HelperInit =RT_EOK){
// rt_kprintf("HelperInit database\n");
// }else {
// sqlite3_open(DB_NAME, db);
// db_ = db_create_database("CREATE TABLE student(id INTEGER PRIMARY KEY AUTOINCREMENT,name varchar(32) NOT NULL,score INT NOT NULL);");
// if(db_=0){rt_kprintf("database ok\n");}else{rt_kprintf("database no\n");}
// }
/* int fd = 0;
const char *dbname = db_get_name();
fd = open(dbname, O_RDONLY);
@ -36,15 +273,12 @@ void db_sqlite(void *parameter)
rt_kprintf("%s exist\r\n", dbname);
else
rt_kprintf("%s not exist\r\n");
const char *sql = "CREATE TABLE IF NOT EXISTS student(id INTEGER PRIMARY KEY AUTOINCREMENT,name varchar(32) NOT NULL,score INT NOT NULL);";
rt_kprintf("sql cmd: %s\r\n\r\n", sql);
int ret = db_create_database(sql);
rt_kprintf("sql ret: %d\r\n", ret);*/
// sqlite3_os_init();
/* int rc = db_connect("/rt.db");
if (rc <0) {
const char *sql = "CREATE TABLE student(id INTEGER PRIMARY KEY AUTOINCREMENT,name varchar(32) NOT NULL,score INT NOT NULL);";
@ -57,7 +291,7 @@ void thread_DB_SQLite(void)
{
/* 初始化线程 1,名称是 thread1,入口是 thread1_entry*/
rt_thread_t tid;
tid = rt_thread_create("db_sqlite", db_sqlite, RT_NULL, 1024*32, 3, 10);
tid = rt_thread_create("db_sqlite", db_sqlite, RT_NULL, 1024*64, 3, 15);
if (tid != RT_NULL)
{

6
applications/main.c

@ -16,7 +16,7 @@
#include "RUN_LED.h"
#include "DB_SQLite.h"
#include "DATA_comm.h"
#include "DATA_uart.h"
#include "uart_rs485.h"
#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
@ -28,10 +28,8 @@ int main(void)
rt_sem_take(mount_sem, rt_tick_from_millisecond(5000)); // 等待挂载完成,最多等待 5 秒
thread_RUN_LED();//运行指示灯线程
thread_DB_SQLite();
start_uart_thread();
data_comm_init();
app_uart_rs485_startup();
return RT_EOK;

179
applications/mount_sdio_elmfatfs_pin.c

@ -0,0 +1,179 @@
/*
* Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2025-10-22 Administrator the first version
*/
#include "dfs_fs.h"
#include <rtdbg.h>
#include <board.h>
#include"drv_common.h"
#define DBG_TAG "sd_cd"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>
// ==================== 配置参数 ====================
#define SD_DEVICE_NAME "sd0"
#define MOUNT_POINT "/"
// CD 引脚配置(根据你的 BSP 修改)
#define CD_PIN GET_PIN(A, 0) // 示例:PA0,根据实际修改!
// 消息类型
#define SD_EVENT_INSERTED 1
#define SD_EVENT_REMOVED 2
// ===============================================
static rt_mq_t sd_event_mq = RT_NULL;
static rt_sem_t mount_sync_sem = RT_NULL;
/**
* @brief CD
*/
void cd_pin_irq(void *param)
{
rt_uint8_t event;
rt_base_t level = rt_hw_interrupt_disable();
// 读取当前电平
int pin_level = rt_pin_read(CD_PIN);
if (pin_level == PIN_HIGH)
{
rt_kprintf("SD Card removed (CD high)\n");
event = SD_EVENT_REMOVED;
}
else // PIN_LOW
{
rt_kprintf("SD Card inserted (CD low)\n");
event = SD_EVENT_INSERTED;
}
// 发送事件到消息队列
if (sd_event_mq != RT_NULL)
{
rt_mq_send(sd_event_mq, &event, 1);
}
rt_hw_interrupt_enable(level);
}
/**
* @brief CD
*/
int cd_pin_init(void)
{
rt_pin_mode(CD_PIN, PIN_MODE_INPUT_PULLUP); // 内部上拉
rt_pin_attach_irq(CD_PIN, PIN_IRQ_MODE_FALLING | PIN_IRQ_MODE_RISING, cd_pin_irq, RT_NULL);
rt_pin_irq_enable(CD_PIN, ENABLE); // 使能中断
return 0;
}
/**
* @brief SD 线
*/
void sd_card_event_thread(void *parameter)
{
uint8_t event;
rt_bool_t mounted = RT_FALSE;
rt_kprintf("SD card event thread started...\n");
while (1)
{
// 等待事件
if (rt_mq_recv(sd_event_mq, &event, 1, RT_WAITING_FOREVER) != RT_EOK)
continue;
switch (event)
{
case SD_EVENT_INSERTED:
if (!mounted)
{
rt_kprintf("Initializing and mounting SD card...\n");
// 等待设备 ready(可选)
rt_thread_mdelay(100);
// 尝试挂载
if (dfs_mount(SD_DEVICE_NAME, MOUNT_POINT, "elm", 0, 0) == RT_EOK)
{
rt_kprintf("SD card mounted to %s\n", MOUNT_POINT);
mounted = RT_TRUE;
// 通知其他模块可以使用 SD 卡
if (mount_sync_sem)
rt_sem_release(mount_sync_sem);
}
else
{
rt_kprintf("Failed to mount SD card\n");
}
}
break;
case SD_EVENT_REMOVED:
if (mounted)
{
if (dfs_unmount(MOUNT_POINT) == 0)
{
rt_kprintf("SD card unmounted\n");
mounted = RT_FALSE;
}
else
{
rt_kprintf("Unmount failed or not mounted\n");
}
}
break;
default:
break;
}
}
}
/**
* @brief SD
*/
int stm32_sdcard_hotplug_init(void)
{
rt_thread_t tid;
// 创建事件消息队列
sd_event_mq = rt_mq_create("sd_event", 1, 10, RT_IPC_FLAG_FIFO);
if (sd_event_mq == RT_NULL)
{
rt_kprintf("Failed to create message queue for SD event!\n");
return -RT_ENOMEM;
}
// 创建同步信号量(可选,用于通知挂载完成)
mount_sync_sem = rt_sem_create("sd_mount", 0, RT_IPC_FLAG_FIFO);
// 创建事件处理线程
tid = rt_thread_create("sd_event",
sd_card_event_thread,
RT_NULL,
2048,
RT_THREAD_PRIORITY_MAX - 2,
10);
if (tid != RT_NULL)
{
rt_thread_startup(tid);
LOG_I("SD event thread created\n");
}
else
{
rt_kprintf("Failed to create SD event thread!\n");
return -RT_ERROR;
}
return RT_EOK;
}
//INIT_COMPONENT_EXPORT(cd_pin_init);
//INIT_APP_EXPORT(stm32_sdcard_hotplug_init);

1
packages/UartFramework-latest

@ -0,0 +1 @@
Subproject commit 679392a4b6beb09dd3e2febe03c2aabc3f298412

5
packages/pkgs.json

@ -8,5 +8,10 @@
"path": "/packages/system/sqlite",
"ver": "v3.19.3",
"name": "SQLITE"
},
{
"path": "/packages/system/UartFramework",
"ver": "latest",
"name": "UART_FRAMEWORK"
}
]

30
rt-thread/components/dfs/filesystems/elmfat/dfs_elm.c

@ -863,7 +863,7 @@ DSTATUS disk_status(BYTE drv)
}
/* Read Sector(s) */
DRESULT disk_read(BYTE drv, BYTE *buff, DWORD sector, UINT count)
/*DRESULT disk_read(BYTE drv, BYTE *buff, DWORD sector, UINT count)
{
rt_size_t result;
rt_device_t device = disk[drv];
@ -875,10 +875,35 @@ DRESULT disk_read(BYTE drv, BYTE *buff, DWORD sector, UINT count)
}
return RES_ERROR;
}*/
DRESULT disk_read(BYTE drv, BYTE *buff, LBA_t sector, UINT count)
{
rt_size_t result;
rt_device_t device = disk[drv];
result = rt_device_read(device, sector, buff, count);
if (result == count)
{
return RES_OK;
}
return RES_ERROR;
}
/* Write Sector(s) */
DRESULT disk_write(BYTE drv, const BYTE *buff, DWORD sector, UINT count)
/*DRESULT disk_write(BYTE drv, const BYTE *buff, DWORD sector, UINT count)
{
rt_size_t result;
rt_device_t device = disk[drv];
result = rt_device_write(device, sector, buff, count);
if (result == count)
{
return RES_OK;
}
return RES_ERROR;
}*/
DRESULT disk_write(BYTE drv, const BYTE *buff, LBA_t sector, UINT count)
{
rt_size_t result;
rt_device_t device = disk[drv];
@ -1025,4 +1050,3 @@ void ff_memfree(void *mem)
rt_free(mem);
}
#endif /* FF_USE_LFN == 3 */

4
rt-thread/components/dfs/filesystems/elmfat/ffconf.h

@ -233,7 +233,7 @@
/ GET_SECTOR_SIZE command. */
#define FF_LBA64 0
#define FF_LBA64 1
/* This option switches support for 64-bit LBA. (0:Disable or 1:Enable)
/ To enable the 64-bit LBA, also exFAT needs to be enabled. (FF_FS_EXFAT == 1) */
@ -259,7 +259,7 @@
/ At the tiny configuration, size of file object (FIL) is shrinked FF_MAX_SS bytes.
/ Instead of private sector buffer eliminated from the file object, common sector
/ buffer in the filesystem object (FATFS) is used for the file data transfer. */
#define RT_DFS_ELM_USE_EXFAT//exfat支持
#ifdef RT_DFS_ELM_USE_EXFAT
#define FF_FS_EXFAT 1
#else

2
rtconfig.h

@ -234,6 +234,8 @@
#define PKG_SQLITE_SQL_MAX_LEN 1024
#define PKG_SQLITE_DB_NAME_MAX_LEN 64
#define PKG_USING_SQLITE_V3193
#define PKG_USING_UART_FRAMEWORK
#define PKG_USING_UART_FRAMEWORK_LATEST_VERSION
/* end of system packages */
/* peripheral libraries and drivers */

Loading…
Cancel
Save