Skip to content

Commit 3875e05

Browse files
对C_Journey第六章的状态机代码部分做的注释补充 (#104)
* 对C_tutorials 第六章的状态机示例代码添加了注释 * 对C_tutorials 第六章的状态机示例代码添加了注释(修正版) * docs(vol1): refine state machine comments 追加到 PR #104 的 review 修正,纯注释、零逻辑改动: - payload_len / index: 把「几个负载」改成「几个字节」, 代码实际含义如此,负载更像是完整的Payload,跟代码还是具备实际差距 - kStateHeader: 修正为「帧头已收完,接下来等长度字节」, - 顺手修了结构体注释的对齐(payload[64]) --------- Co-authored-by: Charliechen114514 <725610365@qq.com>
1 parent 27775d6 commit 3875e05

1 file changed

Lines changed: 26 additions & 24 deletions

File tree

documents/vol1-fundamentals/c_tutorials/04-control-flow.md

Lines changed: 26 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -326,19 +326,19 @@ error_hardware:
326326
327327
```c
328328
typedef enum {
329-
kStateIdle,
330-
kStateHeader,
331-
kStatePayload,
332-
kStateChecksum,
333-
kStateDone,
334-
kStateError
329+
kStateIdle, // 空闲态:等待帧头 0xAA
330+
kStateHeader, // 帧头态:帧头已收完,接下来等长度字节
331+
kStatePayload, // 负载态:正在接收数据
332+
kStateChecksum, // 校验态:准备校验数据
333+
kStateDone, // 完成态:一帧解析成功
334+
kStateError // 错误态:数据不对(比如长度超限或校验失败)
335335
} ParseState;
336336
337337
typedef struct {
338-
ParseState state;
339-
unsigned char payload[64];
340-
unsigned char payload_len;
341-
unsigned char index;
338+
ParseState state; // 记录当前状态
339+
unsigned char payload[64]; // 仓库:存放接收到的负载数据
340+
unsigned char payload_len; // 记录:这帧要收多少个字节的负载
341+
unsigned char index; // 计数器:当前已经收到了几个字节
342342
} Parser;
343343
344344
void parser_init(Parser* p) {
@@ -350,42 +350,42 @@ void parser_init(Parser* p) {
350350
ParseState parser_feed(Parser* p, unsigned char byte) {
351351
switch (p->state) {
352352
case kStateIdle:
353-
if (byte == 0xAA) {
354-
p->state = kStateHeader;
353+
if (byte == 0xAA) { // 看到帧头了吗?
354+
p->state = kStateHeader; // 看到了,进入下一个状态(等长度)
355355
}
356356
break;
357357
358358
case kStateHeader:
359-
p->payload_len = byte;
360-
if (p->payload_len > 64) {
361-
p->state = kStateError;
359+
p->payload_len = byte; // 把收到的这个字节当作长度存起来
360+
if (p->payload_len > 64) { // 长度太大了,仓库装不下怎么办?
361+
p->state = kStateError; // 报错!
362362
} else {
363-
p->index = 0;
364-
p->state = kStatePayload;
363+
p->index = 0; // 准备开始收数据,计数器清零
364+
p->state = kStatePayload; // 进入接收负载的状态
365365
}
366366
break;
367367
368368
case kStatePayload:
369-
p->payload[p->index++] = byte;
370-
if (p->index >= p->payload_len) {
371-
p->state = kStateChecksum;
369+
p->payload[p->index++] = byte; // 把字节存进仓库,并且计数器+1
370+
if (p->index >= p->payload_len) { // 收够了吗?
371+
p->state = kStateChecksum; // 收够了,进入校验状态
372372
}
373373
break;
374374
375375
case kStateChecksum: {
376376
unsigned char calc = 0;
377377
for (int i = 0; i < p->payload_len; i++) {
378-
calc ^= p->payload[i];
378+
calc ^= p->payload[i]; // 把收到的所有数据按位异或一遍
379379
}
380-
p->state = (calc == byte) ? kStateDone : kStateError;
380+
p->state = (calc == byte) ? kStateDone : kStateError; // 算出来的和收到的校验码对比
381381
break;
382382
}
383383
384384
case kStateDone:
385385
case kStateError:
386-
break;
386+
break; // 什么都不做
387387
}
388-
return p->state;
388+
return p->state; // 把当前状态告诉外面的人
389389
}
390390
```
391391

@@ -405,13 +405,15 @@ int main(void)
405405
ParseState s = parser_feed(&p, frame[i]);
406406
printf("Byte 0x%02X → State %d\n", frame[i], s);
407407
if (s == kStateDone) {
408+
// 如果解析器说“完成”,就把收到的数据打印出来
408409
printf("Frame OK, payload: ");
409410
for (int j = 0; j < p.payload_len; j++) {
410411
printf("0x%02X ", p.payload[j]);
411412
}
412413
printf("\n");
413414
break;
414415
} else if (s == kStateError) {
416+
// 如果解析器报错,也停止
415417
printf("Parse error at byte %d\n", i);
416418
break;
417419
}

0 commit comments

Comments
 (0)