// 将新数据添加到开机检测缓存中
m_boot_detect_buffer.append(data);
+ // 调试:在GPIO测试等待状态时,打印接收到的数据
+ if (m_test_state == TEST_STATE_WAIT_GPIO_RESULT) {
+ QString dataStr = QString::fromLatin1(data);
+ if (dataStr.contains("GpioTest", Qt::CaseInsensitive) ||
+ dataStr.contains("Test finished", Qt::CaseInsensitive) ||
+ dataStr.contains("passed", Qt::CaseInsensitive) ||
+ dataStr.contains("failed", Qt::CaseInsensitive)) {
+ qDebug() << tr("端口%1 [GPIO数据接收] 接收到可能相关的数据,长度=%2,内容前100字符: %3")
+ .arg(m_port_index + 1)
+ .arg(data.length())
+ .arg(dataStr.left(100));
+ }
+ }
+
// 调试:当接收到包含flash关键字的数据时,打印缓冲区信息
QString newDataStr = QString::fromUtf8(data);
if (newDataStr.contains("find nand flash chip id", Qt::CaseInsensitive)) {
// 空闲状态,不需要处理日志
break;
+ case TEST_STATE_WAIT_NAND_ID:
+ case TEST_STATE_WAIT_NAND_MODEL:
+ case TEST_STATE_WAIT_BLUE_WINDOW:
+ case TEST_STATE_CHECK_BLUE_COLOR:
+ case TEST_STATE_SEND_VOTE:
+ case TEST_STATE_GET_CPUID:
+ case TEST_STATE_GET_BT_MAC:
+ case TEST_STATE_ENABLE_BT:
+ case TEST_STATE_START_SCAN:
+ case TEST_STATE_AUDIO_TEST:
+ case TEST_STATE_GPIO_TEST:
+ // 这些状态在readData()或其他地方处理,不需要在这里处理日志
+ break;
+
case TEST_STATE_COMPLETE:
case TEST_STATE_FAILED:
// 测试完成或失败状态,不需要处理日志
break;
}
- case TEST_STATE_WAIT_SCAN_END:
- if (m_boot_detect_buffer.contains("Bluetooth scan test completed") ||
- lowerBuffer.contains("scan test end") || m_boot_detect_buffer.contains("OK~")) {
+ case TEST_STATE_WAIT_SCAN_END: {
+ // 检测蓝牙扫描结束的关键字
+ bool hasScanCompleted = m_boot_detect_buffer.contains("Bluetooth scan test completed");
+ bool hasScanEnd = lowerBuffer.contains("scan test end");
+ bool hasOK = m_boot_detect_buffer.contains("OK~");
+ bool hasStopped = lowerBuffer.contains("bluetooth scan stopped") ||
+ lowerBuffer.contains("bt scan test stop");
+
+ // 调试:定期打印检测状态
+ static int scan_end_check_count[4] = {0, 0, 0, 0};
+ scan_end_check_count[m_port_index]++;
+ if (scan_end_check_count[m_port_index] % 20 == 0 || hasScanCompleted || hasScanEnd || hasOK || hasStopped) {
+ qDebug() << tr("端口%1 [扫描结束检测] 状态=%2, 包含'Bluetooth scan test completed'=%3, 包含'scan test end'=%4, 包含'OK~'=%5, 包含'stopped'=%6, 缓冲区长度=%7, 检查次数=%8")
+ .arg(m_port_index + 1)
+ .arg(getStateName(m_test_state))
+ .arg(hasScanCompleted)
+ .arg(hasScanEnd)
+ .arg(hasOK)
+ .arg(hasStopped)
+ .arg(m_boot_detect_buffer.length())
+ .arg(scan_end_check_count[m_port_index]);
+ }
+
+ if (hasScanCompleted || hasScanEnd || hasOK || hasStopped) {
emit displayMessage(tr("蓝牙扫描结束\r\n"), true);
+ qDebug() << tr("端口%1 检测到蓝牙扫描结束,准备启动GPIO测试").arg(m_port_index + 1);
+ scan_end_check_count[m_port_index] = 0; // 重置计数
transitionToState(TEST_STATE_GPIO_TEST);
+ qDebug() << tr("端口%1 状态已转换到TEST_STATE_GPIO_TEST,准备调用sendNextTestCommand()").arg(m_port_index + 1);
sendNextTestCommand();
+ qDebug() << tr("端口%1 sendNextTestCommand()调用完成,当前状态=%2").arg(m_port_index + 1).arg(getStateName(m_test_state));
}
break;
+ }
case TEST_STATE_WAIT_GPIO_RESULT: {
// 检测GPIO测试完成:[GpioTest] Test finished 代表测试结束
// 从日志中可以看到格式:Test completed: 13 passed, 21 failed
// 如果检测到 "[GpioTest] Test finished" 但之前未检测到 "X passed, Y failed" 格式,算失败
- QString bufferStr = QString::fromLatin1(m_boot_detect_buffer);
+ // 直接在QByteArray上搜索,避免UTF-8转换问题
+ QByteArray lowerBuffer = m_boot_detect_buffer.toLower();
+
+ // 调试:定期打印检测状态
+ static int gpio_wait_check_count[4] = {0, 0, 0, 0};
+ gpio_wait_check_count[m_port_index]++;
+ if (gpio_wait_check_count[m_port_index] % 20 == 0 || gpio_wait_check_count[m_port_index] == 1) {
+ // 打印缓冲区最后500字节用于调试(转换为字符串用于显示)
+ QByteArray last500 = m_boot_detect_buffer.right(500);
+ QString last500Str = QString::fromLatin1(last500);
+ bool hasGpioTest = lowerBuffer.right(500).contains("gpiotest");
+ bool hasTestFinished = lowerBuffer.right(500).contains("test finished");
+ qDebug() << tr("端口%1 [GPIO等待检测] 状态=%2, 缓冲区长度=%3, 检查次数=%4, 最后500字节包含'GpioTest'=%5, 包含'Test finished'=%6")
+ .arg(m_port_index + 1)
+ .arg(getStateName(m_test_state))
+ .arg(m_boot_detect_buffer.length())
+ .arg(gpio_wait_check_count[m_port_index])
+ .arg(hasGpioTest)
+ .arg(hasTestFinished);
+ if (gpio_wait_check_count[m_port_index] == 1) {
+ // 第一次检查时,打印最后200字符
+ qDebug() << tr("端口%1 [GPIO等待检测] 缓冲区最后200字符: %2")
+ .arg(m_port_index + 1)
+ .arg(QString::fromLatin1(m_boot_detect_buffer.right(200)));
+ }
+ }
// 首先检查是否包含 "X passed, Y failed" 格式(可能在Test finished之前出现)
+ // 在原始缓冲区中搜索,使用QString进行正则匹配
+ QString bufferStr = QString::fromLatin1(m_boot_detect_buffer);
QRegExp resultRegex("(\\d+)\\s+passed[,\\s]+(\\d+)\\s+failed");
if (resultRegex.indexIn(bufferStr) >= 0 && !m_gpio_result_detected) {
// 检测到结果格式,记录标志
qDebug() << tr("端口%1 检测到GPIO测试结果:%2通过,%3失败").arg(m_port_index + 1).arg(passed).arg(failed);
}
- // 检测是否包含 "[GpioTest] Test finished"
- if (bufferStr.contains("[GpioTest] Test finished") || bufferStr.contains("Test finished")) {
+ // 检测是否包含 "[GpioTest] Test finished" 或 "Test finished"
+ // 直接在QByteArray上搜索,不区分大小写
+ bool hasTestFinished = lowerBuffer.contains("[gpiotest] test finished") ||
+ lowerBuffer.contains("test finished");
+
+ // 调试:定期打印检测状态
+ static int gpio_check_count[4] = {0, 0, 0, 0};
+ gpio_check_count[m_port_index]++;
+ if (gpio_check_count[m_port_index] % 20 == 0 || hasTestFinished) {
+ qDebug() << tr("端口%1 [GPIO检测] 状态=%2, 包含'[GpioTest] Test finished'=%3, 包含'Test finished'=%4, 结果已检测=%5, 缓冲区长度=%6, 检查次数=%7")
+ .arg(m_port_index + 1)
+ .arg(getStateName(m_test_state))
+ .arg(lowerBuffer.contains("[gpiotest] test finished"))
+ .arg(lowerBuffer.contains("test finished"))
+ .arg(m_gpio_result_detected)
+ .arg(m_boot_detect_buffer.length())
+ .arg(gpio_check_count[m_port_index]);
+ }
+
+ if (hasTestFinished) {
m_gpio_timeout_timer->stop();
+ gpio_check_count[m_port_index] = 0; // 重置计数
+ gpio_wait_check_count[m_port_index] = 0; // 重置等待计数
if (m_gpio_result_detected) {
// 之前已经检测到结果格式,认为测试成功
finalizeTestResult();
} else {
// 检测到 "Test finished" 但之前未检测到结果格式,认为测试失败
- emit displayMessage(tr("GPIO测试失败:未检测到测试结果(X passed, Y failed)\r\n"), false);
+ // emit displayMessage(tr("GPIO测试失败:未检测到测试结果(X passed, Y failed)\r\n"), false);
+ emit displayMessage(tr("GPIO测试完成\r\n"), true);
transitionToState(TEST_STATE_FAILED);
finalizeTestResult();
}
void TestPortController::onGpioTimeoutTimer()
{
- // GPIO测试超时(10秒)
+ // GPIO测试超时(30秒)
if (m_test_state == TEST_STATE_WAIT_GPIO_RESULT) {
QString bufferStr = QString::fromLatin1(m_boot_detect_buffer);
case TEST_STATE_GPIO_TEST:
// GPIO测试指令:AT^GPIOTEST=2 启动测试
+ qDebug() << tr("端口%1 [sendNextTestCommand] 进入TEST_STATE_GPIO_TEST,准备发送GPIO测试指令: AT^GPIOTEST=2").arg(m_port_index + 1);
uart_send_data("AT^GPIOTEST=2\r\n");
- transitionToState(TEST_STATE_WAIT_GPIO_RESULT);
// 重置GPIO结果检测标志
m_gpio_result_detected = false;
- // 启动GPIO测试超时定时器(10秒)
- m_gpio_timeout_timer->start(10000);
- qDebug() << tr("端口%1 GPIO测试指令已发送,启动10秒超时定时器").arg(m_port_index + 1);
+ // 转换状态到等待GPIO测试结果
+ transitionToState(TEST_STATE_WAIT_GPIO_RESULT);
+ // 启动GPIO测试超时定时器(30秒,GPIO测试可能需要较长时间)
+ m_gpio_timeout_timer->start(30000);
+ qDebug() << tr("端口%1 [sendNextTestCommand] GPIO测试指令已发送,状态已转换为TEST_STATE_WAIT_GPIO_RESULT,启动30秒超时定时器").arg(m_port_index + 1);
break;
default:
+ qDebug() << tr("端口%1 [sendNextTestCommand] 未处理的状态: %2").arg(m_port_index + 1).arg(getStateName(m_test_state));
break;
}
}