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串口通信,115200,n,8,1。 操作指令 开始测量指令 指令格式:$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
Languages
C#
100%