정상동작 확인

This commit is contained in:
2026-04-01 20:40:24 +00:00
parent b320150ce0
commit 892a8ace50
2 changed files with 29 additions and 8 deletions

View File

@@ -688,8 +688,8 @@ void applySerialSettings() {
else config = SERIAL_8O1;
}
if (serialSettings.stopBits == 2) config |= 0x3000;
SerialComm.setRxBufferSize(2048); // ★ begin() 전에 호출 필수 (ESP32)
SerialComm.begin(serialSettings.baudRate, config, SERIAL_RX_PIN, SERIAL_TX_PIN);
SerialComm.setRxBufferSize(2048);
uint32_t config2 = SERIAL_8N1;
if (serial2Settings.dataBits == 5) {
@@ -710,8 +710,8 @@ void applySerialSettings() {
else config2 = SERIAL_8O1;
}
if (serial2Settings.stopBits == 2) config2 |= 0x3000;
Serial2Comm.setRxBufferSize(2048); // ★ begin() 전에 호출 필수 (ESP32)
Serial2Comm.begin(serial2Settings.baudRate, config2, SERIAL2_RX_PIN, SERIAL2_TX_PIN);
Serial2Comm.setRxBufferSize(2048);
}
// ========================================
@@ -1142,8 +1142,9 @@ void canRxTask(void *parameter) {
// 읽기 완료 후 즉시 다음 폴링 (loop 재진입)
} else {
// INT HIGH, 플래그도 없음 → 타 태스크에 CPU 양보
// ★ vTaskDelay 사용 금지: delay 중 HW 오버플로우 가능
taskYIELD();
// ★ vTaskDelay(1) 사용: taskYIELD()는 동일 우선순위에만 양보하므로
// 하위 우선순위 태스크(Serial RX 등)가 CPU를 받을 수 없음
vTaskDelay(pdMS_TO_TICKS(1));
}
}
}
@@ -1618,6 +1619,7 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t *payload, size_t length)
DynamicJsonDocument doc(44384);
if (deserializeJson(doc, payload)) return;
const char* cmd = doc["cmd"];
if (!cmd) return; // ★ cmd 없는 메시지 무시 (NULL strcmp 크래시 방지)
if (strcmp(cmd, "getSettings") == 0) {
DynamicJsonDocument r(1024);
@@ -1765,6 +1767,14 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t *payload, size_t length)
serialSettings.stopBits = doc["stopBits"] | 1;
saveSerialSettings(); applySerialSettings();
}
else if (strcmp(cmd, "setSerialBaud") == 0) {
// ★ JS applySettings()에서 전송하는 커맨드 지원
serialSettings.baudRate = doc["baud"] | 115200;
saveSerialSettings(); applySerialSettings();
char resp[128];
snprintf(resp, sizeof(resp), "{\"type\":\"serialConfig\",\"baudRate\":%u}", serialSettings.baudRate);
webSocket.sendTXT(num, resp);
}
else if (strcmp(cmd, "getSerialConfig") == 0) {
DynamicJsonDocument r(512);
r["type"]="serialConfig"; r["baudRate"]=serialSettings.baudRate;
@@ -1836,6 +1846,14 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t *payload, size_t length)
serial2Settings.stopBits = doc["stopBits"] | 1;
saveSerialSettings(); applySerialSettings();
}
else if (strcmp(cmd, "setSerial2Baud") == 0) {
// ★ JS applySettings()에서 전송하는 커맨드 지원
serial2Settings.baudRate = doc["baud"] | 115200;
saveSerialSettings(); applySerialSettings();
char resp[128];
snprintf(resp, sizeof(resp), "{\"type\":\"serial2Config\",\"baudRate\":%u}", serial2Settings.baudRate);
webSocket.sendTXT(num, resp);
}
else if (strcmp(cmd, "getSerial2Config") == 0) {
DynamicJsonDocument r(512);
r["type"]="serial2Config"; r["baudRate"]=serial2Settings.baudRate;
@@ -2675,8 +2693,8 @@ void setup() {
xTaskCreatePinnedToCore(sdMonitorTask, "SD_MONITOR", 4096, NULL, 1, NULL, 1);
xTaskCreatePinnedToCore(sdFlushTask, "SD_FLUSH", 4096, NULL, 9, &sdFlushTaskHandle, 0);
xTaskCreatePinnedToCore(sdWriteTask, "SD_WRITE", 18576, NULL, 8, &sdWriteTaskHandle, 0);
xTaskCreatePinnedToCore(serialRxTask, "SERIAL_RX", 6144, NULL, 6, &serialRxTaskHandle, 1);
xTaskCreatePinnedToCore(serial2RxTask, "SERIAL2_RX", 6144, NULL, 6, &serial2RxTaskHandle, 1);
xTaskCreatePinnedToCore(serialRxTask, "SERIAL_RX", 6144, NULL, 6, &serialRxTaskHandle, 0);
xTaskCreatePinnedToCore(serial2RxTask, "SERIAL2_RX", 6144, NULL, 6, &serial2RxTaskHandle, 0);
if (timeSyncStatus.rtcAvailable)
xTaskCreatePinnedToCore(rtcSyncTask,"RTC_SYNC", 3072, NULL, 0, &rtcTaskHandle, 0);
// ★ canRxTask 마지막 생성 (Core 1 Pri 24 → 이 시점엔 setup() 완료 직전)
@@ -2687,10 +2705,10 @@ void setup() {
Serial.println("========================================");
Serial.println("Core 1:");
Serial.printf(" CAN_RX Pri 24 → canRing (SPSC push, no mutex)\n");
Serial.printf(" WEB_UPDATE Pri 8 ← serialRing (SPSC pop, no mutex)\n");
Serial.printf(" TX/SEQ/MON Pri 3/2/1\n");
Serial.println("Core 0:");
Serial.printf(" SD_FLUSH Pri 9 (Double Buffer 비동기 flush)\n");
Serial.printf(" WEB_UPDATE Pri 8 ← serialRing (SPSC pop, no mutex)\n");
Serial.printf(" SD_WRITE Pri 8 ← canRing (SPSC pop, BIN no mutex)\n");
Serial.printf(" SERIAL_RX Pri 6 → serialRing (SPSC push)\n");
Serial.printf(" SERIAL2_RX Pri 6 → serial2Ring(SPSC push)\n");