2025-07-31 17:15:47 +08:00
2025-06-16 17:02:50 +08:00
2025-07-31 17:15:47 +08:00
2025-07-31 17:15:47 +08:00
2025-07-31 17:15:47 +08:00
2025-06-23 16:33:31 +08:00
2025-06-16 17:02:50 +08:00
2025-06-23 16:33:31 +08:00
2025-06-23 16:33:31 +08:00
2025-07-31 17:15:47 +08:00

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

我希望用C#写一个GUI应用能够打开2个串口然后读取数据然后能够整理数据把数据发送到配置好的网址上并且能够在界面上看到数据记录然后也能把数据写到一个log文件中。
一个串口是GPS的数据格式是这样的。要提取WGS84后面的经纬度信息。这个串口打开发送bestposa com1 1 \r\n后就有数据传输进来
#BESTPOSA,COM1,14394,98.0,UNKNOWN,1,1699.000,1700908,2,18;INSUFFICIENT_OBS,NONE,0.00000000000,0.00000000000,0.0000,0.0000,WGS84,0.0000,0.0000,0.0000,"",0.000,0.000,0,0,0,0,0,00,00,00*fcf220b4
另一个串口是谱仪数据,文档如下:
航空γ谱仪通信协议
通信方式
采用RS232串口通信115200n81。
操作指令
开始测量指令
指令格式:$start[回车][换行]
反馈格式ok[回车][换行]
谱数据刷新指令(刷新的回复要忽略)
指令格式:$refresh[回车][换行]
反馈格式0 0 0 0 0 0 0 0 0 0 0 0 0 (很长的一个序列)[回车][换行]
清空测量指令
指令格式:$clear[回车][换行]
反馈格式ok[回车][换行]
谱分析指令
指令格式:$getSperesult[回车][换行]
反馈格式xxxx.xx.xx xx:xx:xx aaaaaaa.aa bbbbbbb.bb 1111111.11 2222222.12 3333333.33 4444444.44 5555555.55 6666666.66 7777777.77 8888888.88 9999999.99 0000000.00 JJJJJJ.JJ cccccccccc.cc [回车][换行]
“aaaaaaa.aa bbbbbbb.bb”表示实时间和死时间单位s
“1111111.11 … …0000000.00”表示十种核素计数率单位cps
“JJJJJJ.JJ”表示环境总辐射剂量率值单位nSv/h
“cccccccccc.cc”表示γ谱的全谱计数率cps
“xxxx.xx.xx xx:xx:xx”表示返回该帧时间
1111111.11 (核素40K单位cps)
2222222.22 (核素208Tl单位cps)
3333333.33 (核素214Bi单位cps)
4444444.44 (核素214Pb单位cps)
5555555.55 (核素226Ra单位cps)
6666666.66 (核素232Th单位cps)
7777777.77 (核素60Co单位cps)
8888888.88 (核素131I单位cps)
9999999.99 (核素137Cs单位cps)
0000000.00 (核素192Ir单位cps)

这个需要打开串口的时候先开始,然后就进入一个循环,刷新一次,解析一次,得到数据,这样反复。我希望能选择刷新的频率。

两个串口的数据分别放到两个队列里每次要从谱仪队列里读取数据然后从GPS队列里读取时间最近的数据两个合并起来组成这样的格式{"OptTime":"2020-11-30 13:16:24.178","PointLat":"23.10606","PointLng":"113.213425","Value":1.9334545697802241E-07}。

然后通过mqtt发送出去。

这是大致的发布代码:
 String productKey = "gfcq950RDqt";
            String topicRoot = "a10inDdCRS6";
            String deviceName = "PubDevice";
            String deviceSecret = "1031a49a4f61c29a086f79b41ed971c7";

            //计算Mqtt建联参数
            MqttSign sign = new MqttSign();
            sign.calculate(productKey, deviceName, deviceSecret);

            Console.WriteLine("username: " + sign.getUsername());
            Console.WriteLine("password: " + sign.getPassword());
            Console.WriteLine("clientid: " + sign.getClientid());

            //使用Paho链接阿里云物联网平台
            int port = 443;
            String broker = productKey + ".iot-as-mqtt.cn-shanghai.aliyuncs.com";

            MqttClient mqttClient = new MqttClient(broker, port, true, MqttSslProtocols.TLSv1_2, null, null);
            mqttClient.Connect(sign.getClientid(), sign.getUsername(), sign.getPassword());

            Console.WriteLine("broker: " + broker + " Connected");

            // //Paho Mqtt 消息订阅
            // String topicReply = "/" + topicRoot + "/" + deviceName + "/user/get";

            // mqttClient.MqttMsgPublishReceived += MqttPostProperty_MqttMsgPublishReceived;
            // mqttClient.Subscribe(new string[] { topicReply }, new byte[] { MqttMsgBase.QOS_LEVEL_AT_MOST_ONCE });
            // Console.WriteLine("subscribe: " + topicReply);

            //Paho Mqtt 消息发布
            String topic = "/" + topicRoot + "/" + deviceName + "/user/update";
            String message = "{\"id\":\"1\",\"version\":\"1.0\",\"params\":{\"LightSwitch\":0}}";
            mqttClient.Publish(topic, Encoding.UTF8.GetBytes(message));
            Console.WriteLine("publish: " + message);

            while(true) {
                Thread.Sleep(2000);
            }

            //Paho Mqtt 断开连接
            mqttClient.Disconnect();

另外我希望是2个串口接收数据分别分配一个线程上传分配一个线程。数据读取后放到一个队列里上传线程去读取队列数据。
还要有一个日志线程,把数据写入到日志里。
软件要有个简单的文本框来展示串口收到的数据
日志要自动创建文件,每次打开的时候,日志的名字应该是当前的时间。

要有个按钮可以一键开始和结束。

另外,接收数据的时候很可能每次收到的是不完整的数据。
我已经创建好了模板程序。
Description
No description provided
Readme 56 KiB
Languages
C# 100%