我希望用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个串口接收数据分别分配一个线程,上传分配一个线程。数据读取后放到一个队列里,上传线程去读取队列数据。 还要有一个日志线程,把数据写入到日志里。 软件要有个简单的文本框来展示串口收到的数据 日志要自动创建文件,每次打开的时候,日志的名字应该是当前的时间。 要有个按钮可以一键开始和结束。 另外,接收数据的时候很可能每次收到的是不完整的数据。 我已经创建好了模板程序。