修改了解析北斗报文和数据报文部分

This commit is contained in:
春风过客 2023-07-31 10:52:56 +08:00
parent 38b1f9eafe
commit f954de289d
7 changed files with 148 additions and 64 deletions

View File

@ -205,19 +205,22 @@ namespace ZTTMS_Manage_ZDPLFZBD_20230301
//数据接收 //数据接收
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{ {
byte[] data = new byte[512]; //byte[] data = new byte[512];
int i = 0; //int i = 0;
while (this.serialPort1.BytesToRead > 0) //while (this.serialPort1.BytesToRead > 0)
{ //{
data[i] = (byte)serialPort1.ReadByte(); // data[i] = (byte)serialPort1.ReadByte();
i++; // i++;
} //}
byte[] receiveData = new byte[data.Length]; byte[] data = new byte[serialPort1.BytesToRead];
for (int j = 0; j < data.Length; j++) int num=serialPort1.Read(data, 0, data.Length);
byte[] receiveData = new byte[num];
for (int j = 0; j < num; j++)
{ {
receiveData[i] = data[i]; receiveData[j] = data[j];
} }
Thread trdDataAnalysis = new Thread(DataAnalysis); Thread trdDataAnalysis = new Thread(DataAnalysis);
@ -244,16 +247,16 @@ namespace ZTTMS_Manage_ZDPLFZBD_20230301
{ {
byte[] newDataTemp = o as byte[]; byte[] newDataTemp = o as byte[];
//将byte数组转为16进制string带- ////将byte数组转为16进制string带-
string strData = BitConverter.ToString(newDataTemp, 1, newDataTemp.Length - 5); //string strData = BitConverter.ToString(newDataTemp, 1, newDataTemp.Length - 5);
string[] data = strData.Split('-'); //string[] data = strData.Split('-');
//16进制string //16进制string
string data1 = ""; string data1 = ByteToString(newDataTemp);
for (int i = 0; i < data.Length; i++) //for (int i = 0; i < data.Length; i++)
{ //{
data1 += data[i]; // data1 += data[i];
} //}
//string 实际发的字符串 //string 实际发的字符串
string data2 = HexToString(data1); string data2 = HexToString(data1);
@ -267,39 +270,51 @@ namespace ZTTMS_Manage_ZDPLFZBD_20230301
//电文内容拆分 //电文内容拆分
string[] content = data4.Split('*'); string[] content = data4.Split('*');
//异或校验字节 //16进制string转byte[]
string code = content[1].Substring(0, 2); byte[] recviveData = StringToBytes(content[0]);
byte checkCode = byte.Parse(code);
//电文内容string //接收数据校验
string data5 = HexToString(content[0]); byte checkCode = recviveData[recviveData.Length - 1];
//发的是字符串 a实际是其ascii码表示的byte byte[] buffer = new byte[recviveData.Length - 1];
for (int i = 0; i < recviveData.Length - 1; i++)
//string转byte[]
byte[] checkTemp = Encoding.Default.GetBytes(data5);
byte[] checkData = new byte[checkTemp.Length - 7];
for (int i = 0; i < checkTemp.Length - 7; i++)
{ {
checkData[i] = checkTemp[i]; buffer[i] = recviveData[i];
} }
string[] recvData = data4.Split(' '); ////异或校验字节
//string code = content[1].Substring(0, 2);
//byte checkCode = byte.Parse(code);
//电文内容string
string data5 = HexToString(ByteToString(recviveData));
////发的是字符串 a实际是其ascii码表示的byte
////string转byte[]
//byte[] checkTemp = Encoding.Default.GetBytes(data5);
//byte[] checkData = new byte[checkTemp.Length - 7];
//for (int i = 0; i < checkTemp.Length - 7; i++)
//{
// checkData[i] = checkTemp[i];
//}
string[] recvData = data5.Split(' ');
//byte[] dataTemp = Encoding.Default.GetBytes(data4); //byte[] dataTemp = Encoding.Default.GetBytes(data4);
string path = Environment.CurrentDirectory; string path = Environment.CurrentDirectory;
string savePath = path + "/" + "WaringData.txt"; string savePath = path + "/" + "WaringData.txt";
for (int i = 0; i < data3.Length; i++) //for (int i = 0; i < data3.Length; i++)
{ //{
Console.WriteLine(data3[i]); // Console.WriteLine(data3[i]);
} //}
//发信人地址 //发信人地址
sqlTerminalEquipmentId = returnDeviceId(data3[2]); sqlTerminalEquipmentId = returnDeviceId(data3[2]);
if (newDataTemp[0] == 0x24 && newDataTemp[newDataTemp.Length - 1] == 0x0A && newDataTemp[newDataTemp.Length - 2] == 0x0D && CheckSum(newDataTemp) == checkCode && CheckSum(checkData) == byte.Parse(recvData[recvData.Length - 2]) && recvData[recvData.Length - 1] == "AABB" && sqlTerminalEquipmentId >= 0) if (CRC(ByteToString(buffer)) == checkCode.ToString())
{ {
sqlMessageType = recvData[0]; sqlMessageType = recvData[0];
sqlMessageId = recvData[1]; sqlMessageId = recvData[1];
@ -342,7 +357,7 @@ namespace ZTTMS_Manage_ZDPLFZBD_20230301
link.LinkClose(); link.LinkClose();
#endregion #endregion
if (sqlMessageType == "Position" && sqlMessageId == "01" && recvData.Length == 7) if (sqlMessageType == "Position" && sqlMessageId == "01" && recvData.Length == 6)
{ {
//位置信息 //位置信息
sqlDeviceName = "位置信息"; sqlDeviceName = "位置信息";
@ -390,7 +405,7 @@ namespace ZTTMS_Manage_ZDPLFZBD_20230301
} }
link.LinkClose(); link.LinkClose();
} }
else if (sqlMessageType == "Imu" && sqlMessageId == "01" && recvData.Length == 8) else if (sqlMessageType == "Imu" && sqlMessageId == "01" && recvData.Length == 7)
{ {
//姿态信息 //姿态信息
sqlDeviceName = "姿态信息"; sqlDeviceName = "姿态信息";
@ -487,7 +502,7 @@ namespace ZTTMS_Manage_ZDPLFZBD_20230301
link.LinkClose(); link.LinkClose();
} }
} }
else if (sqlMessageType == "Imu" && sqlMessageId == "02" && recvData.Length == 8) else if (sqlMessageType == "Imu" && sqlMessageId == "02" && recvData.Length == 7)
{ {
//姿态信息 //姿态信息
sqlDeviceName = "姿态信息"; sqlDeviceName = "姿态信息";
@ -510,7 +525,7 @@ namespace ZTTMS_Manage_ZDPLFZBD_20230301
} }
catch (Exception ex) catch (Exception ex)
{ {
Console.WriteLine("Data2Error:" + ex.ToString()); Console.WriteLine("TerminalAttitudeData2Error:" + ex.ToString());
} }
sqlRecordTime = DateTime.Now; sqlRecordTime = DateTime.Now;
@ -533,7 +548,7 @@ namespace ZTTMS_Manage_ZDPLFZBD_20230301
} }
catch (Exception ex) catch (Exception ex)
{ {
Console.WriteLine("Data2Error:" + ex.ToString()); Console.WriteLine("TerminalAttitudeData2Error:" + ex.ToString());
} }
if (num > 0) if (num > 0)
@ -565,7 +580,7 @@ namespace ZTTMS_Manage_ZDPLFZBD_20230301
} }
catch (Exception ex) catch (Exception ex)
{ {
Console.WriteLine("Data2Error:" + ex.ToString()); Console.WriteLine("TerminalAttitudeData2Error:" + ex.ToString());
} }
if (num > 0) if (num > 0)
@ -584,7 +599,7 @@ namespace ZTTMS_Manage_ZDPLFZBD_20230301
link.LinkClose(); link.LinkClose();
} }
} }
else if (sqlMessageType == "Imu" && sqlMessageId == "03" && recvData.Length == 8) else if (sqlMessageType == "Imu" && sqlMessageId == "03" && recvData.Length == 7)
{ {
//姿态信息 //姿态信息
sqlDeviceName = "姿态信息"; sqlDeviceName = "姿态信息";
@ -607,7 +622,7 @@ namespace ZTTMS_Manage_ZDPLFZBD_20230301
} }
catch (Exception ex) catch (Exception ex)
{ {
Console.WriteLine("Data3Error:" + ex.ToString()); Console.WriteLine("TerminalAttitudeData3Error:" + ex.ToString());
} }
sqlRecordTime = DateTime.Now; sqlRecordTime = DateTime.Now;
@ -630,7 +645,7 @@ namespace ZTTMS_Manage_ZDPLFZBD_20230301
} }
catch (Exception ex) catch (Exception ex)
{ {
Console.WriteLine("Data3Error:" + ex.ToString()); Console.WriteLine("TerminalAttitudeData3Error:" + ex.ToString());
} }
if (num > 0) if (num > 0)
@ -662,7 +677,7 @@ namespace ZTTMS_Manage_ZDPLFZBD_20230301
} }
catch (Exception ex) catch (Exception ex)
{ {
Console.WriteLine("Data3Error:" + ex.ToString()); Console.WriteLine("TerminalAttitudeData3Error:" + ex.ToString());
} }
if (num > 0) if (num > 0)
@ -681,7 +696,7 @@ namespace ZTTMS_Manage_ZDPLFZBD_20230301
link.LinkClose(); link.LinkClose();
} }
} }
else if (sqlMessageType == "ManyPara" && sqlMessageId == "01" && recvData.Length == 8) else if (sqlMessageType == "ManyPara" && sqlMessageId == "01" && recvData.Length == 7)
{ {
//多参数 //多参数
sqlDeviceName = "多参数数据"; sqlDeviceName = "多参数数据";
@ -704,7 +719,7 @@ namespace ZTTMS_Manage_ZDPLFZBD_20230301
} }
catch (Exception ex) catch (Exception ex)
{ {
Console.WriteLine("Data1Error:" + ex.ToString()); Console.WriteLine("TerminalMultiparameterData1Error:" + ex.ToString());
} }
sqlRecordTime = DateTime.Now; sqlRecordTime = DateTime.Now;
@ -749,7 +764,6 @@ namespace ZTTMS_Manage_ZDPLFZBD_20230301
{ {
while (cycleTime < 3) while (cycleTime < 3)
{ {
string sqlId = IdHelper.GetId();
int num = 0; int num = 0;
string sql = $"update ztms_observe_zhedapiaoliufuzi_data set temperature='{temperature}', ph='{ph}', conductivity='{conductivity}' where device_name='{sqlMessageType}' and serialnumber='{sqlMessageNum}';"; string sql = $"update ztms_observe_zhedapiaoliufuzi_data set temperature='{temperature}', ph='{ph}', conductivity='{conductivity}' where device_name='{sqlMessageType}' and serialnumber='{sqlMessageNum}';";
@ -778,7 +792,7 @@ namespace ZTTMS_Manage_ZDPLFZBD_20230301
link.LinkClose(); link.LinkClose();
} }
} }
else if (sqlMessageType == "ManyPara" && sqlMessageId == "02" && recvData.Length == 8) else if (sqlMessageType == "ManyPara" && sqlMessageId == "02" && recvData.Length == 7)
{ {
//多参数 //多参数
sqlDeviceName = "多参数数据"; sqlDeviceName = "多参数数据";
@ -875,14 +889,14 @@ namespace ZTTMS_Manage_ZDPLFZBD_20230301
link.LinkClose(); link.LinkClose();
} }
} }
else if (sqlMessageType == "InPara" && sqlMessageId == "01" && recvData.Length == 10) else if (sqlMessageType == "InPara" && sqlMessageId == "01" && recvData.Length == 8)
{ {
sqlDeviceName = "工作环境参数"; sqlDeviceName = "工作环境参数";
string etemperature = recvData[3]; string etemperature = recvData[3];
string humidity = recvData[4]; string humidity = recvData[4];
string pressure = recvData[5]; string pressure = recvData[5];
string dryBatteryVoltage = recvData[6]; string dryBatteryVoltage = recvData[6];
string destrcutionState = recvData[7]; //string destrcutionState = recvData[7];
//string destructionState1 = ""; //string destructionState1 = "";
//if (destrcutionState == "0") //if (destrcutionState == "0")
// destructionState1 = "关闭"; // destructionState1 = "关闭";
@ -988,25 +1002,95 @@ namespace ZTTMS_Manage_ZDPLFZBD_20230301
} }
return result; return result;
} }
/// <summary>
/// 将字符串形式的多位字节信息转换为对应的字节数组
/// </summary>
/// <param name="s"></param>
/// <returns></returns>
public static byte[] StringToBytes(string s)
{
string[] str = s.Split(' ');
int n = str.Length;
byte[] cmdBytes = null;
int p = 0;
for (int k = 0; k < n; k++)
{
int sLen = str[k].Length;
int bytesLen = sLen / 2;
int position = 0;
byte[] bytes = new byte[bytesLen];
for (int i = 0; i < bytesLen; i++)
{
string abyte = str[k].Substring(position, 2);
bytes[i] = Convert.ToByte(abyte, 16);
position += 2;
}
if (position >= 2)
{
byte[] cmdBytes2 = new byte[p + bytesLen];
if (cmdBytes != null)
{
Array.Copy(cmdBytes, 0, cmdBytes2, 0, p);
}
Array.Copy(bytes, 0, cmdBytes2, p, bytesLen);
cmdBytes = cmdBytes2;
p += bytesLen;
}
}
return cmdBytes;
}
#endregion #endregion
#region #region
private byte CheckSum(byte[] buffer) private static string CRC(string cmdString)
{ {
byte sum = 0; try
foreach (byte b in buffer)
{ {
if (b == 0x24 || b == 0x21) //CRC寄存器
continue; int CRCCode = 0;
if (b == 0x2A) //将字符串拆分成为16进制字节数据然后两位两位进行异或校验
break; for (int i = 1; i < cmdString.Length / 2; i++)
sum ^= b; {
string cmdHex = cmdString.Substring(i * 2, 2);
if (i == 1)
{
string cmdPrvHex = cmdString.Substring((i - 1) * 2, 2);
CRCCode = (byte)Convert.ToInt32(cmdPrvHex, 16) ^ (byte)Convert.ToInt32(cmdHex, 16);
}
else
{
CRCCode = (byte)CRCCode ^ (byte)Convert.ToInt32(cmdHex, 16);
}
}
return Convert.ToString(CRCCode, 16).ToUpper();//返回16进制校验码
}
catch
{
throw;
} }
return sum;
} }
#endregion #endregion
public static string ByteToString(byte[] bytes)
{
string length = BitConverter.ToString(bytes, 0, bytes.Length);
string[] length1 = length.Split('-');
string length2 = "";
for (int i = 0; i < length1.Length; i++)
{
length2 += length1[i];
}
return length2;
}
} }
} }