我写一个状态机在c为一个串行协议。我的数据包格式看起来像这样。状态机的串行协议
delim0接口command_H command_L length_H长度_1有效载荷校验delim1
编辑:我的问题是如何编写C代码用于计算负载和使用这种状态机校验。
我是这个主题的新手,如果我犯了任何简单的错误,请原谅。
switch (dev_int_state) {
case UART_INT_STATE_IDLE:
if (c == '<') { // Delim0 = 0x3C
dev_int_state = UART_INT_STATE_INTERFACE;
}
break;
case UART_INT_STATE_INTERFACE:
if (c == 0x00) { //Generic Commands = 0x00
dev_int_state = UART_INT_STATE_REQ_INTERFACE_SUPPORTED;
}
break;
case UART_INT_STATE_REQ_INTERFACE_SUPPORTED:
if (c == 0x00) { // REQ_INTERFACE_SUPPORTED = 0x00
dev_int_state = UART_INT_STATE_GET_PROTOCOLHH;
}
break;
case UART_INT_STATE_GET_PROTOCOLHH:
if (c == 0x00) { // GET_PROTOCOL = 0x00
dev_int_state = UART_INT_STATE_GET_PROTOCOLHL;
}
break;
case UART_INT_STATE_GET_PROTOCOLHL:
if (c == 0x0B) { // GET_PROTOCOL_RESPONSE = 0x000B
dev_int_state = UART_INT_STATE_LENGTHH;
}
break;
case UART_INT_STATE_LENGTHH:
if (c ==0x04) {
dev_int_state = UART_INT_STATE_LENGTHL; // LENGHT = 4 bytes
}
break;
case UART_INT_STATE_LENGTHL:
if (c == 0x00) {
dev_int_state = UART_INT_STATE_PAYLOAD;
}
break;
case UART_INT_STATE_PAYLOAD:
{ //--- i want to store the payload in this state
}
case UART_INT_STATE_CHECKSUM:
{
size = 0;
for (unsigned i = 0; i< headerLength-1; i++) { /* i have computed checksum but not sure about it */
size += headerBuffer[i];
}
dev_int_state = UART_INT_STATE_DELIM1;
}
break;
dev_int_state = UART_INT_STATE_DELIM1;
}
break;
case UART_INT_STATE_DELIM1:
if (c == '>') {
}
break;
default:
break;
}
*“我的问题是如何计算的有效载荷和校验和使用这种状态机。” *你是什么意思呢?问题必须是确切的,否则将不会负责。请[编辑],并且只有一个*清除*问题。 – user694733
您将按给定协议的规定计算有效负载和校验和。您如何期望互联网上的一些随机人员能够告诉_you_您的特定定制UART协议是如何构建的? – Lundin
注意:您的状态都只有一个*传出*状态。我认为你需要回到初始状态,然后(错误)重新同步。 – joop