用C语言写一个状态机

设计模式(21) 状态模式 状态模式允许一个对象在其内部状态改变时改变它的行为。用电梯来举例,电梯可以认为具有开门、关门、运行、停止四种状态,这四种状态之间的切换具有多种限制,比如在开门状态下不电梯不能运行,只能转为关门状态;在运行状态下,电梯只能转为停止状态… 设想一下,如果要常规的if-else或者switch-case描述电梯的这几种状态间的切换,将生成非常复杂的、逻辑相互交织的代码,可读性差且不易维护。 而如果用状态模式来实现,会是怎样的呢? 首先创建LiftState,代表抽象的电梯状态,包含了电梯的四个动作(方法),通过这 阅读详情

      最近在做一个项目,中间需要一个串口数据传输并且检测有效序列的问题要解决。(是在单片机上做的 msp430f149)

      由于以前做过一段时间的FPGA设计,在fpga中,这个检测就是一个序列状态检测机就能搞定。而且速度非常的快,用的是verilog语言,一种硬件描述语言。它和C语言的的工作模型完全不一样的。其实说了这些。我就是想把这种状态机知识迁移到我的单片机上,然后解决我的问题 。

      我的初步思路是这样的:

 #define   IDLE       0
 #define   STATEA     1
  ...
 
int state;while(1)
 {   
          switch (state)
        {
          case IDLE:if()
                           {......
                            }
          case STATEA:if()
                           {.......
                            }
          .......
         }
}     
使用define把所有的状态宏定义出来,使用switch -case 选择,放入一个while中实现不但的检测。
说了这些,我就把最后自己在单片机430上实现的代码贴出来。大家参考参考:

MCU:MSP430f194 
通讯格式:RS232    9600
接收数据报(32字节),包头四字节效验位是:0xAA  0xD0  0x08 0x00;
下面是状态机状态的定义,以及序列检测函数

#include  <msp430x14x.h>
#define  num1  0x00
#define  num2  0x02
#define  num3  0x04
#define  num4  0x06
#define  num5  0x08
/*
检测上传数据开始的位
检测到前五字节正确返回1,否则返回0;
*/
unsigned char check_sta(void)   
{
  unsigned char state;
  unsigned char Temp;
  state=num1;
  while(1)
  {
    Temp=get_data();
    switch(state)
    {
    case num1:{
               if(Temp==0xAA)
                 state=num2;
               else
                 break;
               }
    case num2:{
               if(Temp==0xD0)
                 state=num3;
               else
                 break;;
               }
    case num3:{
               if(Temp==0x08)
                 state=num4;
               else
                 break;;
               }
    case num4:{
               if(Temp==0x00)
                 state=num5;
               else
                 break;;
               }
    case num5:{
               if(Temp==0x00)
                 {
                  state=num1;
                  return 1;
                 }
               else
                 break;;
               }
    }
  } 
}

主要是,状态的切换,以及最后循环的退出。代码有的地方写的可能不是很精简,希望指正。







告别AT指令裸写:用C语言状态机优雅驱动移远EC200N-CN 4G模块(附STM32工程) 本文详细介绍了如何使用C语言状态机优雅驱动移远EC200N-CN 4G模块,并提供了STM32实现方案。通过状态机架构,解决了传统AT指令顺序执行中的阻塞、状态管理混乱等问题,显著提升了代码可维护性和通信稳定性。文章包含硬件接口配置、状态机核心数据结构、关键状态转移逻辑等实用内容,并提供了RTOS集成与线程安全措施,适合嵌入式物联网开发者参考。 阅读详情

相关推荐

用C语言给51单片机写个“双层嵌套”状态机:扫地机器人避障、充电逻辑实战

本文详细介绍了如何使用C语言在51单片机上实现双层嵌套状态机(HSM),应用于扫地机器人的避障和充电逻辑。通过层次化状态设计和内存优化技巧,解决了传统有限状态机(FSM)在复杂场景下的状态爆炸和代码冗余问题,适合嵌入式开发者提升系统设计效率。

weixin_42522374的博客 184

C语言实现状态机(二)

前言 对于之前的一篇博客《C语言实现状态机》(链接:https://blog.youkuaiyun.com/qq_36969264/article/details/105865099?spm=1001.2014.3001.5501),看网友的留言,似乎对pFsm->stNextState 和 EVENT_MAP_END的比较有一些误解。 这里需要解释一下,当时这么写是为了省事,但后面看这么写确实很容易让人误解,所以这篇文章的目的是为了修改掉这个容易让人误解的地方,同时对该状态机做了一些优化。 一、实现状态机的基本

qq_36969264的博客 8733

C语言实现简单状态机

有限状态机(finite state machine)简称FSM,表示有限个状态及在这些状态之间的转移和动作等行为的数学模型,在计算机领域有着广泛的应用。FSM是一种逻辑单元内部的一种高效编程方法,在服务器编程中,服务器可以根据不同状态或者消息类型进行相应的处理逻辑,使得程序逻辑清晰易懂。 状态机实现的方式有多种,下面讲述三种. 1.使用if/else if语句实现的FSM 使用if/else if语句是实现的FSM最简单最易懂的方法,我们只需要通过大量的if /else if语句来判断状态值来执行相应

qq13955的博客 5115

状态机----C语言实现

状态机(C语言实现状态机)

weixin_42404595的博客 4435

C语言实现状态机:详解与示例代码

在上面的示例代码中,我们定义了三个状态:IDLE(空闲状态)、RUNNING(运行状态)和FINISH(完成状态)。通过定义状态和状态之间的转换条件,并使用条件语句进行状态切换,我们可以有效地处理复杂的逻辑流程。通常,我们会使用枚举类型来定义状态,并使用条件语句(如switch语句)来处理状态之间的转换。每个状态代表系统或程序在某一时刻的行为或状态,而状态之间的转换代表了不同条件下状态的变化。我们可以根据具体的需求定义更多的状态和状态之间的转换条件,以实现更加复杂的程序逻辑。

PixelLoom的博客 1528

C语言实现状态机的三种方法(附完整源码)

本文介绍了C语言实现状态机的三种方法:1)switch-case方法,通过分支语句实现状态转换,适合简单场景;2)状态转移表法,使用二维数组定义状态转换规则,便于维护复杂状态机;3)函数指针映射法,将状态封装为独立函数,实现面向对象风格。每种方法都提供了完整代码示例,展示了从状态定义到转换处理的具体实现。根据状态机复杂度可选择不同方案,switch-case适合简单逻辑,转移表适合中等复杂度,函数指针法则适用于需要封装状态行为的场景。

希望我的博客,能帮上你解决学习中工作中所遇到的问题 1035

c语言中的状态机到底该怎么写呢?如果还不明白关注博客私信我

c语言中的状态机到底该怎么写呢?如果还不明白关注博客私信我

奋斗在路上的博客 1536

时序SDC约束set_data_check及常见应用场景

时序约束SDC之set_data_check命令及常见应用场景解析

weixin_37584728的博客 2287

状态机的学习

从零开始学状态机 参考1 [https://baike.baidu.com/item/状态机/6548513?fr=aladdin] 参考2 https://blog.youkuaiyun.com/v__king__/article/details/71740492 1、状态机的概念 状态机 ( State Machine )由状态寄存器和组合逻辑电路构成,能够根据控制信号按预先设定的状态进行状态转移,是协调信号动作、完成特定操作的控制中心。有限状态机(Finite State Machine FSM)主要分为两

weixin_43589294的博客 399

声纹识别初学

最近开始关注声纹识别技术,发现国内做这个的确实没有几家,而且大多重点推声纹认证,用在公安司法金融领域,而我却关注文本无关的声纹识别,这里把我搜到的一点资料汇总在此. 发现njustzj001的专栏有两篇文章适合入门的我,贴下链接: 综述:  http://blog.youkuaiyun.com/xmu_jupiter/article/details/47209961 PLDA解释:  http://

u013452331的专栏 2759

为什么Nano Banana在图像一致性上碾压GPT和豆包?深度解析其技术原理与使用技巧

本文深度解析了Nano Banana在图像一致性上超越GPT和豆包等工具的技术原理。它通过基于参考图的强条件生成、精准的区域感知与掩码控制等核心技术,实现了“外科手术式”的精准图像编辑。文章还分享了包括提示词工程、参数调整在内的实用技巧,并探讨了通过API Key将其能力集成到自动化工作流中的潜力。

omega的博客 357

用C语言写一个有限状态机(finite-state machine, FSM) -- 无动态内存管理版本

用C语言写一个有限状态机(finite-state machine, FSM) – 无动态内存管理版本 0. FAQ Q: 什么是FSM? A: 有限状态机(finite-state machine, FSM),是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。看不懂?没关系,下面举一个例子吧:-) 按下按钮按下按钮灭灯状态亮灯状态 如上图所示,这是通过一个按钮来控制灯状态的状态机,...

qq_35576794的博客 1186

告别降级CUDA!手把手教你为RTX 50系显卡(5080/5090)配置专属的PyTorch Nightly + vLLM推理环境

本文详细指导如何为RTX 50系显卡(5080/5090)配置专属的PyTorch Nightly和vLLM推理环境,特别针对CUDA 12.8的适配问题提供解决方案。从硬件准备到源码编译,再到模型部署与性能调优,手把手教你构建高效AI推理系统。

weixin_33724046的博客 409

用C语言给51单片机写个‘双层’状态机:从扫地机器人代码看HSM架构实战

本文通过扫地机器人案例,详细讲解如何使用C语言在51单片机上实现层次状态机(HSM)架构。文章涵盖HSM核心概念、状态节点设计、状态转换原则及实战代码,展示如何通过状态嵌套处理复杂业务逻辑,特别适合嵌入式开发中需要清晰可控逻辑框架的场景。

weixin_42632434的博客 221

电容式三点式振荡电路/电感式三点振荡电路基础知识及Multisim电路仿真

摘要:三极管振荡电路利用放大特性与正反馈实现自激振荡,需满足巴克豪森条件(增益≥1,相位匹配)。核心由放大级、反馈网络、选频网络和稳幅环节构成。主要分为三类:1)LC/RC正弦波振荡电路(如电容三点式、电感三点式),输出高频/低频正弦波;2)多谐振荡电路,通过电容充放电产生方波;3)张弛振荡电路,生成锯齿波等。设计需关注相位匹配、增益控制和元件适配。LC振荡频率由谐振参数决定,RC振荡由时间常数控制。稳幅机制通过非线性或主动元件维持等幅输出。该电路在信号发生、时钟源等领域有广泛应用。

XU157303764的博客 2039

2025年09月中国电子学会青少年软件编程(Python)等级考试试卷(一级)答案 + 解析

2025年09月中国电子学会青少年软件编程(Python)等级考试试卷(一级)答案 + 解析

伶俐角少儿编程 639

别再只会调库了!手把手教你用C语言为51单片机写一个抢答器状态机

本文详细介绍了如何使用C语言为51单片机编写一个抢答器状态机,通过有限状态机(FSM)设计实现清晰可靠的程序框架。内容涵盖状态空间建模、事件驱动编程、硬件抽象层设计以及Proteus仿真验证,帮助开发者告别复杂的if-else嵌套,提升代码可读性和维护性。

weixin_42528780的博客 112

【人工智能】国产开源大模型聊天 AquilaChat 快速开始上手实战&效果评测

Aquila语言大模型在技术上继承了GPT-3、LLaMA等的架构设计优点,替换了一批更高效的底层算子实现、重新设计实现了中英双语的tokenizer,升级了BMTrain并行训练方法,在Aquila的训练过程中实现了比Magtron+DeepSpeed zero-2将近8倍的训练效率。Aquila语言大模型是在中英文高质量语料基础上从0开始训练的,通过数据质量的控制、多种训练的优化方法,实现在更小的数据集、更短的训练时间,获得比其它开源模型更优的性能。

AI天才研究院 2万+

用C语言给51单片机写个HSM状态机:从扫地机器人代码里学架构设计

本文详细介绍了如何用C语言为51单片机实现层次状态机(HSM),通过扫地机器人的实际案例展示HSM在嵌入式开发中的优势。文章涵盖HSM的核心架构设计、状态转移表、实战代码实现及性能优化技巧,帮助开发者高效管理复杂状态逻辑,提升代码可维护性。

weixin_33672109的博客 450

OpenAI Error: 403 Country, region, or territory not supported [Python]

从OpenAI的API服务中获取数据时,由于你所在的国家、地区或领土不被支持,因此请求被拒绝了

suiusoar 5670

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

嵌入式老司机带你解锁 C 语言状态机的正确姿势

在嵌入式系统中,有限状态机(FSM)是处理复杂任务的有效工具。本文讨论了如何通过改进C语言中的状态机框架来增强其通用性和实用性。传统的switch-case方法在处理多个事件和状态时容易导致代码混乱,难以维护。为此,文中提出了一个更清晰、更健壮的状态机框架,通过函数指针和类型安全的改进,使代码更易于管理和调试。

奋斗在路上的博客 435

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

12_状态机模式的进阶:分层状态机(HSM)在嵌入式中的落地 —— 解决复杂业务逻辑的混乱

/ 1. 事件类型定义(所有可能的事件)EVT_NONE = 0, // 无事件KEY_VERIFY, // 验证按键(触发进入验证状态)KEY_CANCEL, // 取消按键(取消验证,返回待机)EVT_VERIFY_SUCCESS, // 验证成功事件EVT_VERIFY_FAIL, // 验证失败事件EVT_VERIFY_TIMEOUT, // 验证超时事件EVT_MAX // 事件数量上限} HsmEvent;// 2. 事件结构体(存储事件类型和附加数据)// 事件类型。

C语言无原生OOP特性,却能借结构体+函数指针实现封装、继承、多态,落地工厂等设计模式。博客中以标准C语法实操教学,融入跨平台兼容设计,助开发者掌握C语言OOP核心与工程实践技巧。 1010

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

使用deepseek写一个单击,双击和长按的检测函数

DeepSeek好火,注册试用一下:提问:请使用c语言写一个函数,输入参数是是为: A为当前的输入量,1000-2000,根据它的变化, B为当前这个输入量的状态数据结构, 函数检查这个A,判断它的变化,从而判断用户是单击还双击,还是长按。具体当A变化量大于300时认为是开始了有效的点击,这时认为是按下按钮,记录变化前的值为C ,当A变回和C差值只有50左右时,认为释放按钮。已深度思考(用时 272 秒)

aerror的专栏 860

今天刚学的一招,C语言中的函数指针数组!!!

  写状态机程序的时候,经常会在case里面写一大串的程序操作,而学C语言的老师经常说哦,要把大块大块的代码封装成一个个函数,这样调用起来,或者移植起来就方便很多啦~~因为以前一直没有领会其中的方便,所以都没有用,今天没办法,状态实在太多了,而且每个状态的操作实在是麻烦,所以上网学了一个方法,C语言中的函数指针数组,可是帮了我的大忙了。首先需要定义一个函数指针数组:void (*state[max...

weixin_34348174的博客 300

C语言实战:手把手教你读写INI配置文件(附完整代码示例)

本文提供了一份C语言读写INI配置文件的完整实战指南。通过设计链表结构的内存模型,详细讲解了从文件解析、键值对处理到原子性保存的核心实现,并附带了类型安全接口、遍历功能及可直接集成的完整代码示例,帮助开发者构建健壮的配置管理模块。

bert9linguist的博客 633

【C语言固件OTA断点续传实战手册】:20年嵌入式老兵亲授3大核心机制、5层校验逻辑与1行代码规避Flash写崩风险

解决嵌入式设备OTA升级中断失败难题,详解C语言固件OTA升级断点续传实现:覆盖裸机/RTOS场景,融合镜像分块、校验位图、Flash事务日志三大机制,集成5层校验逻辑,1行代码规避Flash写崩风险。实战可靠,值得收藏。

FastSolve的博客 259
下一篇: 一致性哈希(最喜欢的算法之一)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值