可以利用
利用這個資料只要不去換USB的PORT位置就可針對這個裝置下指令!
延伸閱讀
- 針對固定USB裝置上帶出的Com port號碼進行清除(2026/01)
- ESP32 WiFi Mesh 控制 4 port Relay模組(2022/12)
- C# 讀取超大檔案方式(2024/07)
- 雷達產品測試站別規劃(2024/02)
- CPU SN software lock(2024/01)

PeakCAN(PCAN-USB)──CAN 500 kbit/s──▶ ECU Simulator 1. 送 Mode 03 讀取 DTC:ID 0x7DF,資料 01 03 00 00 00 00 00 00 2. 收到 First Frame:ID 0x7E8,10 10 43 02 01 68 03 03 3. 回 Flow Control:ID 0x7E0,30 00 00 00 00 00 00 00 4. 解碼:01 68 → P0168、03 03 → P0303 5. 把故障碼送給 AI,取得中文解釋,顯示在下方訊息區第 1~4 步的細節在前一篇:PeakCAN 與 ECU Simulator 通訊 擷取 DTC Data。這篇補充的重點在第 5 步。
| 故障碼 | SAE 標準定義 | gemma4:12b 的回答 | qwen3.6:35b 的回答 |
|---|---|---|---|
| P0168 | Fuel Temperature Too High(燃油溫度過高) | ❌ 燃燒過稀 Bank 1(這其實是 P0171) | ❌ 第三列氧感測器電路異常 |
| P0303 | Cylinder 3 Misfire Detected(第 3 缸失火) | ✔ 正確 | ✔ 正確 |
| P0218 | Transmission Fluid Over Temperature Condition(變速箱油溫過高) | ❌ 冷卻液溫度感測器電路 | ❌ 怠速時冷卻液溫度偏高 |
提示詞:OBD2 故障碼 P0168 的 SAE 標準定義是「Fuel Temperature Too High」。
請只根據這個定義,用繁體中文、三句話以內說明它代表什麼,
以及最常見的兩個原因。不要更改定義。
P0168 → 引擎偵測到燃油溫度過高。最常見的兩個原因是燃油溫度傳感器故障或燃料相關系統過熱。 ✔
P0303 → 引擎偵測到第三缸發生失火……最常見的兩個原因是火星塞或點火線圈損壞。 ✔
P0218 → 變速箱油溫過高……最常見的兩個原因是變速箱油量不足,以及內部磨損導致摩擦過熱。 ✔
P1234 → 本地表查不到,不送 AI ✔
三個全部正確,連小模型也不會再講錯。另外,要求「三句話以內」也讓回答從 1,400~1,900 個 token 降到幾十個字,訊息區比較好讀,用雲端 API 時費用也跟著降下來。"P0218",實際要用解碼出來的結果;而且 ECU 一次可能回好幾個碼(畫面上的 P0168P0303),要拆開逐一查catch 區塊是空的,出錯時畫面上什麼都不會顯示,至少要把錯誤訊息印出來static List<string> DecodeDtcs(byte[] data, int count)
{
char[] type = { 'P', 'C', 'B', 'U' };
var list = new List<string>();
for (int i = 0; i < count; i++)
{
byte b1 = data[i * 2], b2 = data[i * 2 + 1];
if (b1 == 0 && b2 == 0) continue; // 00 00 是填充,不是故障碼
list.Add($"{type[b1 >> 6]}{(b1 >> 4) & 0x3}{b1 & 0xF:X}{b2:X2}");
}
return list; // 01 68 03 03 → P0168, P0303
}
2. 先查表、再問 AI:static readonly Dictionary<string, string> DtcTable = new()
{
["P0168"] = "Fuel Temperature Too High",
["P0303"] = "Cylinder 3 Misfire Detected",
["P0218"] = "Transmission Fluid Over Temperature Condition",
// ……其餘從 CSV 載入
};
async Task<string> ExplainDtcAsync(ChatClient client, string code)
{
if (!DtcTable.TryGetValue(code, out var name))
return $"{code}:本地表查不到,請查原廠維修手冊";
string prompt = $"OBD2 故障碼 {code} 的 SAE 標準定義是「{name}」。" +
"請只根據這個定義,用繁體中文、三句話以內說明它代表什麼," +
"以及最常見的兩個原因。不要更改定義。";
ChatCompletion c = await client.CompleteChatAsync(prompt);
return $"{code}({name}):{c.Content[0].Text}";
}
3. 雲端或本機二選一:OpenAI 的 NuGet 套件也能連 Ollama,因為 Ollama 提供相容 OpenAI 的 API,只要換掉 Endpoint:using System.ClientModel;
using OpenAI;
using OpenAI.Chat;
// 雲端 OpenAI:金鑰從環境變數讀
ChatClient cloud = new("gpt-4.1-mini",
Environment.GetEnvironmentVariable("OPENAI_API_KEY"));
// 本機 Ollama(GX10):金鑰隨便填,不會檢查
ChatClient local = new("gemma4:12b",
new ApiKeyCredential("ollama"),
new OpenAIClientOptions { Endpoint = new Uri("http://GX10的IP:11434/v1") });
注意:Ollama 預設只聽 127.0.0.1,Windows 測試機要連 GX10 的話,要在 GX10 設 OLLAMA_HOST=0.0.0.0,而且建議走 Tailscale,不要把 11434 埠直接開到公司或家裡的整個網段。| 雲端 OpenAI(gpt-4.1 / mini) | 本機 Ollama(GX10) | |
|---|---|---|
| 費用 | 按 token 計費 | 免費 |
| 網路 | 要能連外網 | 產線、實驗室內網也能用 |
| 速度 | 通常幾秒 | 這次實測 gemma4:12b 一個碼約 20~70 秒 |
| 不查表直接問 | 常見碼大多正確 | 實測 3 個錯 2 個,不建議 |
| 先查表再問 | 正確 | 實測 3 個全對 |