C#串口编程 Dictionary作为人机语言转换的桥梁

    xiaoxiao2023-10-16  29

    .NET Framework : 4.7.2       IDE : Visual Studio Community 2019        OS : Windows 10 x64    typesetting : Markdown        blog : blog.csdn.net/yushaopu       github : github.com/GratefulHeartCoder

    博文起因

      当初我学习Dictionary的时候,老师讲了很多属性、方法,关于怎么遍历、查找和初始化,但是迷惑于它的实际用处,整天初始化、创建和查找,解决一些在理想世界中才能出现的问题,很是没有动力。

    应用背景

      在串口编程中,有几个参数必须需要配置,比如串口号、波特率,数据位等。为了工作的快捷,人们会提出将配置参数保存为一个文件,在下次程序启动时,自动提取出配置参数进行配置的需求。我是用的XML文件保存配置参数。

    XML文件

    <?xml version="1.0" encoding="utf-8"?> <portConfigure> <PortName>COM4</PortName><!--???--> <BaudRate>115200</BaudRate><!--460800 256000 128000 115200 57600 38400 28800 19200 9600 4800 1200--> <DataBits>8</DataBits> <!--8 7 6 5--> <StopBits>1</StopBits> <!--1 1.5 2--> <Parity>None</Parity> <!--None Odd Even Mark Space--> </portConfigure>

    思考

      问题出现了。PortName端口号、BaudRate波特率、DataBits数据位,直接读取XML中数据就可以交给C#进行赋值,但是StopBits停止位和Parity校验位在XML保存的数据是为了让人能够轻易看懂,然而直接将其交给C#进行赋值,程序就会报类型不匹配的错误。于是乎,作为桥梁的字典Dictionary就需要出现了。

      XML文件中的参数作为字典的键,赋值的时,通过键(人易识别的数据)找到对应的值(类型匹配的机器数据)进行赋值,就可以解决类型不匹配的问题了。

    code

    using System; using System.Collections.Generic; using System.Xml; using System.IO.Ports; namespace ConsoleApp5 { class Program { static void Main(string[] args) { Console.WriteLine("正在读取上次保存的配置参数"); string xmlFileName = "portArgsFile.xml"; XmlDocument xml = new XmlDocument(); // 打开现有的一个xml文件 xml.Load(xmlFileName); // 获得xml的根节点 XmlElement portConfigure = xml.DocumentElement; // 参数字典 var parityDictionary = new Dictionary<String, Parity>() { { "Even",Parity.Even}, { "Mark",Parity.Mark}, { "None",Parity.None}, { "Odd",Parity.Odd}, { "Space",Parity.Space} }; var stopBitsDictionary = new Dictionary<String, StopBits>() { { "1",StopBits.One}, { "1.5",StopBits.OnePointFive}, { "2",StopBits.Two} }; // 从xml文件中读取数据 // 端口号 string portName = portConfigure.SelectSingleNode("PortName").InnerText; // 波特率 int baudRate = Convert.ToInt32(portConfigure.SelectSingleNode("BaudRate").InnerText); // 校验位 Parity parity = parityDictionary[portConfigure.SelectSingleNode("Parity").InnerText]; // 数据位 int dataBits = Convert.ToInt32(portConfigure.SelectSingleNode("DataBits").InnerText); // 停止位 StopBits stopBits = stopBitsDictionary[portConfigure.SelectSingleNode("StopBits").InnerText]; // 参数配置成功后关闭xml文件,网上说这个操作归GC管了. Console.WriteLine("配置参数读取成功"); Console.ReadKey(); } } }

    result

    正在读取上次保存的配置参数 配置参数读取成功

    感想

      写应用经验方向的博文,是希望通过我的实践历程告诉新手:要好好学习基础知识,这些基础知识在未来的工作中是切实可用的,坚定信心,不要迷茫。加油!

    resource

    [文档] docs.microsoft.com/zh-cn/dotnet/csharp[规范] github.com/dotnet/docs/tree/master/docs/standard/design-guidelines[源码] referencesource.microsoft.com [平台] www.csdn.net[ IDE ] visualstudio.microsoft.com/zh-hans[.NET Core] dotnet.github.io


    感恩曾经帮助过 心少朴 的人。 C#优秀,值得学习。.NET Core具有跨平台的能力,值得关注。 Console,WinForm,WPF,ASP.NET,Azure WebJob,WCF,Unity3d,UWP可以适当地了解。 注:此文是自学笔记所生,质量中下等,故要三思而后行。新手到此,不可照搬,应先研究其理象数,待能变通之时,自然跳出深坑。

    最新回复(0)