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