{"id":857,"date":"2026-05-05T15:55:51","date_gmt":"2026-05-05T07:55:51","guid":{"rendered":"https:\/\/hsiang.cc\/?p=857"},"modified":"2026-05-05T15:55:51","modified_gmt":"2026-05-05T07:55:51","slug":"c-%e7%9a%84%e9%82%a3%e4%ba%9b%e7%9c%89%e8%a7%92%e5%9b%9e%e5%82%b3%e5%80%bc%e4%b8%8d%e8%a6%81%e4%ba%82%e4%b8%9f-%e9%8c%af%e8%aa%a4%e8%99%95%e7%90%86%e7%9a%84%e8%a8%ad%e8%a8%88","status":"publish","type":"post","link":"https:\/\/hsiang.cc\/?p=857","title":{"rendered":"[C \u7684\u90a3\u4e9b\u7709\u89d2]\u56de\u50b3\u503c\u4e0d\u8981\u4e82\u4e1f \u2014 \u932f\u8aa4\u8655\u7406\u7684\u8a2d\u8a08"},"content":{"rendered":"<p>\u525b\u958b\u59cb\u5beb C \u7684\u6642\u5019\uff0c\u6211\u7684\u932f\u8aa4\u8655\u7406\u5927\u6982\u662f\u9019\u6a23\uff1a<\/p>\n<pre><code class=\"language-c\">void init_device(void) {\n    i2c_init();\n    sensor_init();\n    uart_init();\n    \/\/ \u5b8c\u6210\uff0c\u61c9\u8a72\u6c92\u554f\u984c\u5427\uff1f\n}<\/code><\/pre>\n<p>\u56de\u50b3 <code>void<\/code>\uff0c\u88e1\u9762\u6bcf\u500b\u51fd\u5f0f\u7684\u56de\u50b3\u503c\u90fd\u4e0d\u7ba1\u3002<\/p>\n<p>\u53cd\u6b63\u5728\u958b\u767c\u677f\u4e0a\u8dd1\u90fd\u6b63\u5e38\uff0c\u5c31\u9019\u6a23\u51fa\u8ca8\u4e86\u3002<\/p>\n<p>\u7136\u5f8c\u5ba2\u6236\u56de\u5831\u8aaa\u88dd\u7f6e\u5076\u723e\u6703\u521d\u59cb\u5316\u5931\u6557\uff0c<br \/>\n\u4f46 log \u5b8c\u5168\u770b\u4e0d\u51fa\u4f86\u54ea\u500b\u6b65\u9a5f\u51fa\u554f\u984c\uff0c<br \/>\n\u56e0\u70ba\u6839\u672c\u6c92\u6709\u4efb\u4f55\u932f\u8aa4\u8655\u7406\u3002<\/p>\n<p>\u90a3\u6b21\u4e4b\u5f8c\uff0c\u6211\u958b\u59cb\u8a8d\u771f\u601d\u8003\uff1a<strong>\u932f\u8aa4\u8655\u7406\u4e0d\u662f\u53ef\u9078\u7684\uff0c\u662f\u5fc5\u9808\u7684\u3002<\/strong><\/p>\n<hr \/>\n<h2>\u6700\u5e38\u898b\u7684\u58de\u7fd2\u6163<\/h2>\n<h3>1. \u5b8c\u5168\u4e0d\u8655\u7406\u56de\u50b3\u503c<\/h3>\n<p><!--more--><\/p>\n<pre><code class=\"language-c\">\/\/ \u274c \u547c\u53eb\u4e86\u4f46\u4e0d\u7ba1\u7d50\u679c\nmalloc(256);\nfwrite(buf, 1, len, fp);\npthread_mutex_lock(&amp;mutex);<\/code><\/pre>\n<p>\u9019\u4e9b\u51fd\u5f0f\u90fd\u53ef\u80fd\u5931\u6557\u3002<br \/>\n\u4e0d\u6aa2\u67e5\u56de\u50b3\u503c\uff0c\u5c31\u662f\u5047\u8a2d\u5b83\u5011\u6c38\u9060\u6210\u529f\u3002<\/p>\n<p>\u5728\u5d4c\u5165\u5f0f\u74b0\u5883\uff0c\u8a18\u61b6\u9ad4\u4e0d\u8db3\u3001\u786c\u9ad4\u7570\u5e38\u3001timeout\uff0c<br \/>\n\u9019\u4e9b\u60c5\u6cc1\u6bd4\u4f60\u60f3\u7684\u66f4\u5e38\u767c\u751f\u3002<\/p>\n<hr \/>\n<h3>2. \u56de\u50b3\u503c\u8a2d\u8a08\u96a8\u610f<\/h3>\n<pre><code class=\"language-c\">\/\/ \u274c \u9019\u500b\u51fd\u5f0f\u5931\u6557\u7684\u6642\u5019\u56de\u50b3\u4ec0\u9ebc\uff1f\nint read_sensor(float *value) {\n    \/\/ \u6210\u529f\u56de\u50b3 0\n    \/\/ \u5931\u6557\u56de\u50b3... -1\uff1f 1\uff1f 99\uff1f\n}<\/code><\/pre>\n<p>\u6c92\u6709\u4e00\u81f4\u7684\u898f\u5247\uff0c\u547c\u53eb\u7aef\u4e0d\u77e5\u9053\u600e\u9ebc\u5224\u65b7\uff0c<br \/>\n\u4e45\u4e86\u5c31\u4e7e\u8106\u4e0d\u5224\u65b7\u4e86\u3002<\/p>\n<hr \/>\n<h3>3. \u932f\u8aa4\u88ab\u541e\u6389<\/h3>\n<pre><code class=\"language-c\">\/\/ \u274c \u932f\u8aa4\u767c\u751f\u4e86\uff0c\u4f46\u6c92\u6709\u5f80\u4e0a\u50b3\nint process_data(void) {\n    if (read_sensor(&amp;value) != 0) {\n        return 0;  \/\/ \u5047\u88dd\u6210\u529f\uff1f\n    }\n    \/\/ ...\n}<\/code><\/pre>\n<p>\u9019\u7a2e\u6700\u96e3 debug\uff0c\u56e0\u70ba\u932f\u8aa4\u5728\u67d0\u4e00\u5c64\u88ab\u975c\u9ed8\u5403\u6389\uff0c<br \/>\n\u4e0a\u5c64\u5b8c\u5168\u4e0d\u77e5\u9053\u767c\u751f\u4e86\u4ec0\u9ebc\u4e8b\u3002<\/p>\n<hr \/>\n<h2>\u5efa\u7acb\u4e00\u81f4\u7684\u932f\u8aa4\u78bc\u7cfb\u7d71<\/h2>\n<p>\u6211\u5728\u5d4c\u5165\u5f0f\u5c08\u6848\u88e1\u7fd2\u6163\u7528\u9019\u7a2e\u65b9\u5f0f\u5b9a\u7fa9\u932f\u8aa4\u78bc\uff1a<\/p>\n<pre><code class=\"language-c\">\/\/ error_code.h\ntypedef enum {\n    ERR_OK              =  0,   \/\/ \u6210\u529f\n    ERR_FAIL            = -1,   \/\/ \u4e00\u822c\u6027\u5931\u6557\n    ERR_INVALID_PARAM   = -2,   \/\/ \u53c3\u6578\u932f\u8aa4\n    ERR_TIMEOUT         = -3,   \/\/ \u903e\u6642\n    ERR_NOT_READY       = -4,   \/\/ \u88dd\u7f6e\u672a\u5c31\u7dd2\n    ERR_NO_MEMORY       = -5,   \/\/ \u8a18\u61b6\u9ad4\u4e0d\u8db3\n    ERR_BUSY            = -6,   \/\/ \u8cc7\u6e90\u5fd9\u788c\u4e2d\n    ERR_NOT_SUPPORTED   = -7,   \/\/ \u529f\u80fd\u4e0d\u652f\u63f4\n    ERR_OVERFLOW        = -8,   \/\/ \u7de9\u885d\u5340\u6ea2\u4f4d\n    ERR_CHECKSUM        = -9,   \/\/ \u6821\u9a57\u78bc\u932f\u8aa4\n} ErrorCode;<\/code><\/pre>\n<p>\u5e7e\u500b\u8a2d\u8a08\u539f\u5247\uff1a<\/p>\n<ul>\n<li><strong>\u6210\u529f\u6c38\u9060\u662f 0<\/strong>\uff0c\u9019\u662f C \u7684\u6163\u4f8b\uff0c\u4e5f\u8ddf Linux \u7cfb\u7d71\u547c\u53eb\u4e00\u81f4<\/li>\n<li><strong>\u932f\u8aa4\u7528\u8ca0\u503c<\/strong>\uff0c\u9019\u6a23\u53ef\u4ee5\u8ddf\u300c\u6709\u6548\u7684\u6b63\u6574\u6578\u56de\u50b3\u503c\u300d\u5171\u5b58<\/li>\n<li><strong>\u7528 enum \u4e0d\u7528 <code>#define<\/code><\/strong>\uff0cdebugger \u53ef\u4ee5\u986f\u793a\u540d\u7a31<\/li>\n<li><strong>\u932f\u8aa4\u78bc\u8981\u6709\u610f\u7fa9<\/strong>\uff0c\u4e0d\u662f\u53ea\u6709 <code>ERR_FAIL<\/code> \u4e00\u500b<\/li>\n<\/ul>\n<hr \/>\n<h2>\u5e7e\u7a2e\u5e38\u898b\u7684\u56de\u50b3\u503c\u8a2d\u8a08\u6a21\u5f0f<\/h2>\n<h3>\u6a21\u5f0f\u4e00\uff1a\u7d14\u932f\u8aa4\u78bc<\/h3>\n<p>\u6700\u7c21\u55ae\uff0c\u51fd\u5f0f\u53ea\u56de\u50b3\u6210\u529f\u6216\u5931\u6557\uff0c<br \/>\n\u5be6\u969b\u7684\u7d50\u679c\u900f\u904e\u6307\u6a19\u53c3\u6578\u50b3\u51fa\uff1a<\/p>\n<pre><code class=\"language-c\">ErrorCode sensor_read_temperature(float *temperature) {\n    if (temperature == NULL) {\n        return ERR_INVALID_PARAM;\n    }\n\n    uint8_t raw[2];\n    if (i2c_read(SENSOR_ADDR, raw, sizeof(raw)) != ERR_OK) {\n        return ERR_TIMEOUT;\n    }\n\n    *temperature = ((raw[0] &lt;&lt; 8) | raw[1]) \/ 100.0f;\n    return ERR_OK;\n}<\/code><\/pre>\n<p>\u547c\u53eb\u7aef\uff1a<\/p>\n<pre><code class=\"language-c\">float temp;\nErrorCode err = sensor_read_temperature(&amp;temp);\nif (err != ERR_OK) {\n    LOG_ERROR(&quot;sensor read failed: %d&quot;, err);\n    return err;  \/\/ \u5f80\u4e0a\u50b3\uff0c\u4e0d\u8981\u541e\u6389\n}<\/code><\/pre>\n<p>\u9019\u662f\u6211\u6700\u5e38\u7528\u7684\u6a21\u5f0f\uff0c\u6e05\u695a\u3001\u4e00\u81f4\u3001\u5bb9\u6613\u6e2c\u8a66\u3002<\/p>\n<hr \/>\n<h3>\u6a21\u5f0f\u4e8c\uff1a\u56de\u50b3\u503c\u5e36\u8cc7\u6599\uff0c\u8ca0\u503c\u4ee3\u8868\u932f\u8aa4<\/h3>\n<p>\u9069\u5408\u56de\u50b3\u503c\u672c\u8eab\u5c31\u662f\u6709\u610f\u7fa9\u7684\u6578\u5b57\uff1a<\/p>\n<pre><code class=\"language-c\">\/\/ \u6210\u529f\u56de\u50b3\u8b80\u5230\u7684\u4f4d\u5143\u7d44\u6578\uff08&gt;= 0\uff09\n\/\/ \u5931\u6557\u56de\u50b3\u8ca0\u503c\u932f\u8aa4\u78bc\nint uart_receive(uint8_t *buf, size_t buf_size, uint32_t timeout_ms) {\n    if (buf == NULL || buf_size == 0) {\n        return ERR_INVALID_PARAM;\n    }\n\n    \/\/ ... \u5be6\u4f5c ...\n\n    if (timeout) {\n        return ERR_TIMEOUT;\n    }\n\n    return bytes_received;  \/\/ \u6b63\u6574\u6578\n}<\/code><\/pre>\n<p>\u547c\u53eb\u7aef\uff1a<\/p>\n<pre><code class=\"language-c\">int result = uart_receive(buf, sizeof(buf), 1000);\nif (result &lt; 0) {\n    LOG_ERROR(&quot;uart receive error: %d&quot;, result);\n    return result;\n}\n\/\/ result \u662f\u5be6\u969b\u6536\u5230\u7684\u4f4d\u5143\u7d44\u6578\nprocess_data(buf, result);<\/code><\/pre>\n<p>Linux \u7cfb\u7d71\u547c\u53eb\u5927\u91cf\u4f7f\u7528\u9019\u500b\u6a21\u5f0f\uff0c<br \/>\n\u7fd2\u6163\u4e86\u4e4b\u5f8c\u5f88\u76f4\u89ba\u3002<\/p>\n<hr \/>\n<h3>\u6a21\u5f0f\u4e09\uff1a\u7528\u7d50\u69cb\u9ad4\u56de\u50b3\u7d50\u679c<\/h3>\n<p>\u7576\u9700\u8981\u540c\u6642\u56de\u50b3\u932f\u8aa4\u78bc\u548c\u8cc7\u6599\uff0c<br \/>\n\u53c8\u4e0d\u60f3\u7528\u6307\u6a19\u53c3\u6578\u7684\u6642\u5019\uff1a<\/p>\n<pre><code class=\"language-c\">typedef struct {\n    ErrorCode err;\n    float     value;\n} SensorResult;\n\nSensorResult sensor_read_temperature(void) {\n    SensorResult result = { .err = ERR_OK, .value = 0.0f };\n\n    uint8_t raw[2];\n    if (i2c_read(SENSOR_ADDR, raw, sizeof(raw)) != ERR_OK) {\n        result.err = ERR_TIMEOUT;\n        return result;\n    }\n\n    result.value = ((raw[0] &lt;&lt; 8) | raw[1]) \/ 100.0f;\n    return result;\n}<\/code><\/pre>\n<p>\u547c\u53eb\u7aef\uff1a<\/p>\n<pre><code class=\"language-c\">SensorResult r = sensor_read_temperature();\nif (r.err != ERR_OK) {\n    LOG_ERROR(&quot;sensor error: %d&quot;, r.err);\n    return r.err;\n}\nuse_temperature(r.value);<\/code><\/pre>\n<p>\u9019\u500b\u6a21\u5f0f\u5728 C \u88e1\u4e0d\u592a\u5e38\u898b\uff0c\u4f46\u6709\u6642\u5019\u6bd4\u6307\u6a19\u53c3\u6578\u66f4\u6e05\u695a\u3002<br \/>\nC++ \u7684 <code>std::optional<\/code> \u6216 Rust \u7684 <code>Result&lt;T, E&gt;<\/code> \u5c31\u662f\u9019\u500b\u6982\u5ff5\u3002<\/p>\n<hr \/>\n<h2>\u932f\u8aa4\u8981\u5f80\u4e0a\u50b3\uff0c\u4e0d\u8981\u541e\u6389<\/h2>\n<p>\u9019\u662f\u6211\u89ba\u5f97\u6700\u91cd\u8981\u7684\u4e00\u9ede\u3002<\/p>\n<pre><code class=\"language-c\">\/\/ \u274c \u932f\u8aa4\u88ab\u541e\u6389\uff0c\u4e0a\u5c64\u4e0d\u77e5\u9053\u767c\u751f\u4e86\u4ec0\u9ebc\nint init_system(void) {\n    if (sensor_init() != ERR_OK) {\n        LOG_ERROR(&quot;sensor init failed&quot;);\n        \/\/ \u7136\u5f8c\u5462\uff1f\u7e7c\u7e8c\u8dd1\uff1f\n    }\n\n    if (network_init() != ERR_OK) {\n        LOG_ERROR(&quot;network init failed&quot;);\n        \/\/ \u4e00\u6a23\u7e7c\u7e8c\uff1f\n    }\n\n    return ERR_OK;  \/\/ \u660e\u660e\u6709\u932f\u8aa4\uff0c\u9084\u662f\u56de\u50b3\u6210\u529f\n}<\/code><\/pre>\n<pre><code class=\"language-c\">\/\/ \u2705 \u932f\u8aa4\u5f80\u4e0a\u50b3\nint init_system(void) {\n    ErrorCode err;\n\n    err = sensor_init();\n    if (err != ERR_OK) {\n        LOG_ERROR(&quot;sensor init failed: %d&quot;, err);\n        return err;\n    }\n\n    err = network_init();\n    if (err != ERR_OK) {\n        LOG_ERROR(&quot;network init failed: %d&quot;, err);\n        return err;\n    }\n\n    return ERR_OK;\n}<\/code><\/pre>\n<p>\u7576\u7136\uff0c\u4e0d\u662f\u6240\u6709\u932f\u8aa4\u90fd\u8981\u8b93\u6574\u500b\u7cfb\u7d71\u505c\u4e0b\u4f86\u3002<br \/>\n\u6709\u4e9b\u932f\u8aa4\u662f\u53ef\u4ee5 retry \u7684\uff0c\u6709\u4e9b\u662f\u53ef\u4ee5\u964d\u7d1a\u8655\u7406\u7684\u3002<\/p>\n<p>\u4f46\u9019\u662f\u696d\u52d9\u908f\u8f2f\u7684\u6c7a\u5b9a\uff0c\u61c9\u8a72\u5728<strong>\u5920\u9ad8\u7684\u5c64\u7d1a<\/strong>\u505a\u5224\u65b7\uff0c<br \/>\n\u4e0d\u662f\u5728\u5e95\u5c64\u51fd\u5f0f\u88e1\u9ed8\u9ed8\u541e\u6389\u3002<\/p>\n<hr \/>\n<h2>\u5d4c\u5165\u5f0f\u7684\u7279\u6b8a\u8003\u91cf<\/h2>\n<h3>\u4e0d\u8981\u5728 ISR \u88e1\u505a\u8907\u96dc\u7684\u932f\u8aa4\u8655\u7406<\/h3>\n<p>\u4e2d\u65b7\u670d\u52d9\u51fd\u5f0f\u8981\u8d8a\u77ed\u8d8a\u597d\uff0c<br \/>\n\u932f\u8aa4\u8655\u7406\u7559\u7d66 main loop\uff1a<\/p>\n<pre><code class=\"language-c\">\/\/ ISR \u53ea\u8a2d flag\nvoid UART_IRQHandler(void) {\n    if (UART-&gt;SR &amp; UART_SR_ORE) {\n        \/\/ Overrun error\n        g_uart_error_flag = true;\n        UART-&gt;SR &amp;= ~UART_SR_ORE;  \/\/ \u6e05\u9664 flag\n    }\n    \/\/ \u4e0d\u8981\u5728\u9019\u88e1\u505a\u8907\u96dc\u8655\u7406\n}\n\n\/\/ Main loop \u8655\u7406\u932f\u8aa4\nvoid uart_task(void) {\n    if (g_uart_error_flag) {\n        g_uart_error_flag = false;\n        handle_uart_overrun();\n    }\n}<\/code><\/pre>\n<hr \/>\n<h3>\u786c\u9ad4\u64cd\u4f5c\u5931\u6557\u8981\u8003\u616e retry<\/h3>\n<p>\u611f\u6e2c\u5668\u5076\u723e NAK\u3001I2C \u5076\u723e timeout\uff0c<br \/>\n\u9019\u4e9b\u5728\u5d4c\u5165\u5f0f\u5f88\u5e38\u898b\uff0c\u4e0d\u4e00\u5b9a\u662f\u771f\u7684\u58de\u6389\uff1a<\/p>\n<pre><code class=\"language-c\">ErrorCode sensor_read_with_retry(float *value) {\n    for (int i = 0; i &lt; MAX_RETRY; i++) {\n        ErrorCode err = sensor_read_temperature(value);\n        if (err == ERR_OK) {\n            return ERR_OK;\n        }\n        LOG_WARN(&quot;sensor read failed (attempt %d\/%d): %d&quot;,\n                 i + 1, MAX_RETRY, err);\n        delay_ms(10);\n    }\n    LOG_ERROR(&quot;sensor read failed after %d retries&quot;, MAX_RETRY);\n    return ERR_TIMEOUT;\n}<\/code><\/pre>\n<p>\u4f46 retry \u7684\u908f\u8f2f\u8981\u5728<strong>\u9069\u7576\u7684\u5c64\u7d1a<\/strong>\uff0c<br \/>\n\u4e0d\u662f\u6bcf\u500b\u5e95\u5c64\u51fd\u5f0f\u90fd\u81ea\u5df1 retry\uff0c<br \/>\n\u4e0d\u7136\u932f\u8aa4\u771f\u7684\u767c\u751f\u7684\u6642\u5019\uff0c\u4f60\u6703\u7b49\u5f88\u4e45\u624d\u77e5\u9053\u3002<\/p>\n<hr \/>\n<h2>\u8aaa\u5be6\u8a71<\/h2>\n<p>\u5b8c\u6574\u7684\u932f\u8aa4\u8655\u7406\uff0c\u5beb\u8d77\u4f86\u771f\u7684\u5f88\u56c9\u55e6\u3002<\/p>\n<p>\u6bcf\u500b\u51fd\u5f0f\u547c\u53eb\u5f8c\u9762\u90fd\u8981 <code>if (err != ERR_OK)<\/code>\uff0c<br \/>\n\u7a0b\u5f0f\u78bc\u7684\u300c\u6b63\u5e38\u6d41\u7a0b\u300d\u88ab\u4e00\u5806\u932f\u8aa4\u6aa2\u67e5\u6df9\u6c92\uff0c<br \/>\n\u6709\u6642\u5019\u8b80\u8d77\u4f86\u6bd4\u8f03\u50cf\u5728\u8b80\u932f\u8aa4\u8655\u7406\uff0c\u4e0d\u662f\u5728\u8b80\u696d\u52d9\u908f\u8f2f\u3002<\/p>\n<p>\u6211\u4e5f\u6c92\u6709\u5b8c\u7f8e\u7684\u89e3\u6cd5\uff0c\u9019\u662f C \u8a9e\u8a00\u672c\u8eab\u7684\u9650\u5236\u3002<\/p>\n<p>\u4f46\u6211\u7684\u5e95\u7dda\u662f\uff1a<strong>\u81f3\u5c11\u8981\u77e5\u9053\u54ea\u88e1\u51fa\u932f\u4e86\u3002<\/strong><\/p>\n<p>\u5c31\u7b97\u4e0d\u80fd\u512a\u96c5\u5730\u8655\u7406\uff0c\u81f3\u5c11\u8981\u6709 log\uff0c<br \/>\n\u8b93\u4f60\u5728 debug \u7684\u6642\u5019\u6709\u7dda\u7d22\u53ef\u4ee5\u8ffd\u3002<\/p>\n<p>\u4e00\u500b\u6c89\u9ed8\u5931\u6557\u7684\u7cfb\u7d71\uff0c\u6bd4\u4e00\u500b\u5927\u8072\u5831\u932f\u7684\u7cfb\u7d71\u96e3 debug \u4e00\u767e\u500d\u3002<\/p>\n<hr \/>\n<h2>\u9019\u7bc7\u7684 Checklist<\/h2>\n<ul>\n<li>[ ] \u51fd\u5f0f\u56de\u50b3\u503c\u6709\u4e00\u81f4\u7684\u8a2d\u8a08\uff08\u6210\u529f 0\uff0c\u932f\u8aa4\u8ca0\u503c\uff09<\/li>\n<li>[ ] \u932f\u8aa4\u78bc\u7528 enum \u5b9a\u7fa9\uff0c\u6709\u610f\u7fa9\u7684\u540d\u7a31<\/li>\n<li>[ ] \u6bcf\u500b\u51fd\u5f0f\u547c\u53eb\u7684\u56de\u50b3\u503c\u90fd\u6709\u6aa2\u67e5<\/li>\n<li>[ ] \u932f\u8aa4\u6709\u5f80\u4e0a\u50b3\uff0c\u6c92\u6709\u88ab\u975c\u9ed8\u541e\u6389<\/li>\n<li>[ ] \u932f\u8aa4\u767c\u751f\u6642\u6709 log\uff0c\u5305\u542b\u932f\u8aa4\u78bc<\/li>\n<li>[ ] Retry \u908f\u8f2f\u5728\u9069\u7576\u7684\u5c64\u7d1a\uff0c\u4e0d\u662f\u6bcf\u5c64\u90fd retry<\/li>\n<li>[ ] ISR \u88e1\u7684\u932f\u8aa4\u7528 flag \u50b3\u7d66 main loop \u8655\u7406<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>\u525b\u958b\u59cb\u5beb C \u7684\u6642\u5019\uff0c\u6211\u7684\u932f\u8aa4\u8655\u7406\u5927\u6982\u662f\u9019\u6a23\uff1a void init_device &hellip; <a href=\"https:\/\/hsiang.cc\/?p=857\">\u95b1\u8b80\u5168\u6587 <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[15],"tags":[975,912,922,970,974,973,919,972,911,971],"class_list":{"0":"post-857","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"hentry","6":"category-prog","7":"tag-c","12":"tag-errorcode","14":"tag-972","15":"tag-911","16":"tag-971"},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/hsiang.cc\/index.php?rest_route=\/wp\/v2\/posts\/857","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hsiang.cc\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hsiang.cc\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hsiang.cc\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/hsiang.cc\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=857"}],"version-history":[{"count":1,"href":"https:\/\/hsiang.cc\/index.php?rest_route=\/wp\/v2\/posts\/857\/revisions"}],"predecessor-version":[{"id":859,"href":"https:\/\/hsiang.cc\/index.php?rest_route=\/wp\/v2\/posts\/857\/revisions\/859"}],"wp:attachment":[{"href":"https:\/\/hsiang.cc\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=857"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hsiang.cc\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=857"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hsiang.cc\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=857"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}