【C# AT Lib】3:AT Command

本文介绍了在C#中构建AT Command框架的过程,包括定义ResultCode枚举、ResponseExpectation类来设置期望响应,以及AtCommand和AtCommandBuilder类用于简化命令构造。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们在设计AT Command,需要把期望AT Response是什么样的信息放进去,这样在底层进行AT通讯的时候就可以自动加入Retry功能。

 

定义ResultCode枚举变量

    public enum ResultCode
    {
        OK,
        ERROR
    }

 

定义ResponseExpectation类

  • 告知AT Response需不需要包含期望的Result Code
  • 告知AT Response中对于总体Data Lines有什么期许
  • 告知AT Response中对于某一行Data Line有什么期许
    public class ResponseExpectation
    {
        public ResultCode? ExpectedResultCode { get; set; }

        public Predicate<string[]> AllDataLinesPredicate { get; set; }

        public Predicate<string>[] AnyDataLinePredicates { get; set; }

        public bool Accepts(ResultCode? resultCode, string[] dataLines)
        {
            return Accepts(resultCode) && Accepts(dataLines);
        }

        private bool Accepts(ResultCode? resultCode)
        {
            if (!ExpectedResultCode.HasValue)
                return true;

            return ExpectedResultCode == resultCode;
        }

        private bool Accepts(string[] dataLines)
        {
            if (!AllDataLinesPredicateAccepts(dataLines))
                return false;

            if (!AnyDataLinePredicatesAccept(dataLines))
                return false;

            return true;
        }

        private bool AllDataLinesPredicateAccepts(string[] dataLines)
        {
            return AllDataLinesPredicate == null || AllDataLinesPredicate(dataLines);
        }

        private bool AnyDataLinePredicatesAccept(string[] dataLines)
        {
            return AnyDataLinePredicates.All(
                dataLinePredicate => dataLines.Any(line => dataLinePredicate(line)));
        }
    }

 

定义AtCommand类

    public class AtCommand
    {
        public string RawCommand { get; set; }

        public string SuffixedRawCommand
        {
            get
            {
                const string suffix = "\r";
                return RawCommand + suffix;
            }
        }

        public ResponseExpectation ResponseExpectation { get; set; }

        public override string ToString()
        {
            return RawCommand;
        }
    }

定义AtCommandBuilder类

因为AtCommand对象在构造的时候相对有些复杂,于是我们用一个单独的AtCommandBuilder类去帮助构造AtCommand对象。

    public class AtCommandBuilder
    {
        private string _rawCommand;
        private ResultCode? _expectedResultCode;
        private Predicate<string[]> _allDataLinesPredicate;
        private readonly List<Predicate<string>> _anyDataLinePredicates = new List<Predicate<string>>();

        public AtCommandBuilder WithRawCommand(string rawCommand)
        {
            if (string.IsNullOrWhiteSpace(rawCommand))
                throw new ArgumentException("Raw command can't be Null or WhiteSpace.", "rawCommand");

            _rawCommand = rawCommand.Trim();

            return this;
        }

        public AtCommandBuilder WithExpectedResultCode(ResultCode expectedResultCode)
        {
            _expectedResultCode = expectedResultCode;
            return this;
        }

        public AtCommandBuilder WithExpectedOkResultCode()
        {
            return WithExpectedResultCode(ResultCode.OK);
        }

        public AtCommandBuilder WithAllDataLinesPredicate(Predicate<string[]> predicate)
        {
            _allDataLinesPredicate = predicate;
            return this;
        }

        public AtCommandBuilder WithAnyDataLinePredicate(Predicate<string> predicate)
        {
            _anyDataLinePredicates.Add(predicate);
            return this;
        }

        public AtCommandBuilder WithAnyDataLinePredicateStartsWith(string startCriterion)
        {
            return WithAnyDataLinePredicate(
                dateLine => dateLine.StartsWith(startCriterion, StringComparison.CurrentCultureIgnoreCase));
        }

        public AtCommand Build()
        {
            return new AtCommand
            {
                RawCommand = _rawCommand,
                ResponseExpectation = new ResponseExpectation
                {
                    ExpectedResultCode = _expectedResultCode,
                    AllDataLinesPredicate = _allDataLinesPredicate,
                    AnyDataLinePredicates = _anyDataLinePredicates.ToArray()
                }
            };
        }
    }

 

正在文件夹 02_led_flow_register 中执行任务: "unify_builder -p "d:\project\stm32\02_led_flow_register\build\Target 1\builder.params" --rebuild" [ INFO ] start building at 2025-06-23 08:30:56 [ TOOL ] Product: ARM Compiler 5.06 [ INFO ] file statistics (rebuild mode) +---------+-----------+-----------+---------------+--------+ | C Files | Cpp Files | Asm Files | Lib/Obj Files | Totals | +---------+-----------+-----------+---------------+--------+ | 3 | 0 | 1 | 0 | 4 | +---------+-----------+-----------+---------------+--------+ [ INFO ] start compiling ... >> [ 25%] CC &#39;start/core_cm3.c&#39; >> [ 50%] AS &#39;start/startup_stm32f10x_md.s&#39; >> [ 75%] CC &#39;start/system_stm32f10x.c&#39; ".\start\stm32f10x.h", line 95: Error: #35: #error directive: "Please select first the target STM32F10x device used in your application (in stm32f10x.h file)" #error "Please select first the target STM32F10x device used in your application (in stm32f10x.h file)" ^ .\start\system_stm32f10x.c: 0 warnings, 1 error ERROR compilation failed at : "d:\project\stm32\02_led_flow_register\start\system_stm32f10x.c", exit code: 1 command: "C:\Users\yang&#39;mao&#39;jin\.eide\tools\armcc_v5_cracked\bin\armcc.exe" -c --apcs=interwork -Istart -Iuser -I.cmsis/include -I"RTE/_Target 1" --cpu Cortex-M3 --li --c99 -O0 --split_sections --gnu --diag_suppress=1 --diag_suppress=1295 -g -o ".\build\Target 1\.obj\start\system_stm32f10x.o" --no_depend_system_headers --depend ".\build\Target 1\.obj\start\system_stm32f10x.d" .\start\system_stm32f10x.c ERROR build failed !, elapsed time 0:0:2 怎么解决
最新发布
06-24
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值