@@ -326,19 +326,19 @@ error_hardware:
326326
327327```c
328328typedef 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
337337typedef 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
344344void parser_init(Parser* p) {
@@ -350,42 +350,42 @@ void parser_init(Parser* p) {
350350ParseState 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