private void AskDataSend(byte cmd = 0x03, byte data = 0x00) { byte[] byteSendData = { 0x22, 0x06, 0x52, 0x02, 0x02, 0x00, 0x01, 0x00 }; byteSendData[5] = cmd; byteSendData[6] = data; //计算校验和 byteSendData[byteSendData.Length - 1] = Uart.byteCheakSum(byteSendData, 2, 5); //发送数据 sp1_DataSend(Uart.byteToHexStr(byteSendData)); }
private void menuRcvRhSave_Click(object sender, EventArgs e) { if (menuRcvRhSave.Text == "保存数据") { StartTimeNum = Uart.GetTimeStamp(); SaveFileDialog save = new SaveFileDialog(); save.Filter = "表格格式|*.xls|文本格式|*.txt|所有格式|*.*"; save.Title = "保存参数"; save.RestoreDirectory = true; save.FilterIndex = 1; if (save.ShowDialog() == DialogResult.OK) { string str = save.FileName; try { using (StreamWriter sw = new StreamWriter(str, false, Encoding.GetEncoding("gb2312"))) { sw.Write("时间" + "\t" + "参数"); sw.Flush(); sw.Close(); } } catch (Exception) { strRhOutPath = ""; MessageBox.Show("文件保存失败,请重新选择。"); return; } strRhOutPath = str; menuRcvRhSave.Text = "取消保存"; } } else { strRhOutPath = ""; menuRcvRhSave.Text = "保存数据"; } }
/// <summary> /// 接收数据处理 /// </summary> /// <param name="byteBuff">接收缓存数组</param> private void RcvDataProcess(byte[] byteBuff) { if (byteBuff.Length <= 0) { return; } else if (byteBuff.Length == 4) { if ((byteBuff[0] == 0x22) && (byteBuff[1] == 0x02)) { //水份参数 txtRcvRhH.Text = "0x" + byteBuff[2].ToString("X2") + byteBuff[3].ToString("X2"); } } else if (byteBuff.Length == 17) { if ((byteBuff[0] == 0x22) && (byteBuff[1] == 0x0F) && (byteBuff[2] == 0xA5)) { if (byteBuff[16] == Uart.byteCheakSum(byteBuff, 2, 14)) { //状态 switch (byteBuff[4]) { case 0x00: txtRcvStatus.Text = "关机"; break; case 0x01: txtRcvStatus.Text = "运行中"; break; case 0x02: txtRcvStatus.Text = "暂停"; break; case 0x03: txtRcvStatus.Text = "完成"; break; case 0xA1: txtRcvStatus.Text = "配置"; break; default: txtRcvStatus.Text = "未定义" + byteBuff[4].ToString("X2"); break; } //模式 if (Uart.isBinTest(byteBuff[5], 3)) { txtRcvMode.Text = "水份检测"; txtRcvAdjust.Text = "无"; if (!cbRH.DroppedDown && cbRH.SelectedIndex != 1) { cbRH.SelectedIndex = 1; } } else { if (!cbRH.DroppedDown && cbRH.SelectedIndex != 0) { cbRH.SelectedIndex = 0; } string strMode = "无"; string strAdjust = "无"; if (Uart.isBinTest(byteBuff[5], 0)) { strAdjust = "弱"; } if (Uart.isBinTest(byteBuff[5], 1)) { strAdjust = "中"; } if (Uart.isBinTest(byteBuff[5], 2)) { strAdjust = "强"; } if (Uart.isBinTest(byteBuff[5], 4)) { strMode = "清洁"; } if (Uart.isBinTest(byteBuff[5], 5)) { strMode = "保湿"; } if (Uart.isBinTest(byteBuff[5], 6)) { strMode = "导入"; } if (Uart.isBinTest(byteBuff[5], 7)) { strMode = "冷敷"; } txtRcvMode.Text = strMode; txtRcvAdjust.Text = strAdjust; } //运行时长 txtRcvTime.Text = byteBuff[6].ToString() + "秒"; //水份百分比 txtRcvRh1.Text = byteBuff[7].ToString() + "%"; //油分百分比 txtRcvRh2.Text = byteBuff[8].ToString() + "%"; //弹性百分比 txtRcvRh3.Text = byteBuff[9].ToString() + "%"; //加热片温度 txtRcvHotTemp.Text = byteBuff[10].ToString() + "℃"; //环境温度 txtRcvThTemp.Text = byteBuff[11].ToString() + "℃"; //水份参数 txtRcvRhH.Text = "0x" + byteBuff[12].ToString("X2") + byteBuff[13].ToString("X2"); //软件版本号 txtRcvVersion.Text = "V" + byteBuff[15].ToString(); //检测完成 DetectTaskDone(); } else { //检验和错误 txtRcvError.Text = Convert.ToString((Convert.ToInt64(txtRcvError.Text) + 1)); funcOutputLog("校验和错误,应为" + Uart.byteCheakSum(byteBuff, 2, 14).ToString("X2") + ",实为" + byteBuff[16] + "。", "错误"); } } } else if (byteBuff.Length == 14) { if ((byteBuff[0] == 0x22) && (byteBuff[1] == 12) && (byteBuff[2] == 0x52) && (byteBuff[3] == 0x02)) { if (byteBuff[13] == Uart.byteCheakSum(byteBuff, 2, byteBuff[1] - 1)) { if (byteBuff[5] == 0x03) { //状态 switch (byteBuff[6]) { case 0x00: txtRcvStatus.Text = "关机"; break; case 0x01: txtRcvStatus.Text = "运行中"; break; case 0x02: txtRcvStatus.Text = "暂停"; break; case 0x03: txtRcvStatus.Text = "完成"; break; case 0xA1: txtRcvStatus.Text = "配置"; break; default: txtRcvStatus.Text = "未定义" + byteBuff[6].ToString("X2"); break; } //模式 if (Uart.isBinTest(byteBuff[7], 3)) { txtRcvMode.Text = "水份检测"; txtRcvAdjust.Text = "无"; if (!isSendDataChange && !cbRH.DroppedDown && cbRH.SelectedIndex != 1) { cbRH.SelectedIndex = 1; } } else { if (!isSendDataChange && !cbRH.DroppedDown && cbRH.SelectedIndex != 0) { cbRH.SelectedIndex = 0; } string strMode = "无"; string strAdjust = "无"; if (Uart.isBinTest(byteBuff[7], 0)) { strAdjust = "弱"; } if (Uart.isBinTest(byteBuff[7], 1)) { strAdjust = "中"; } if (Uart.isBinTest(byteBuff[7], 2)) { strAdjust = "强"; } if (Uart.isBinTest(byteBuff[7], 4)) { strMode = "清洁"; } if (Uart.isBinTest(byteBuff[7], 5)) { strMode = "保湿"; } if (Uart.isBinTest(byteBuff[7], 6)) { strMode = "导入"; } if (Uart.isBinTest(byteBuff[7], 7)) { strMode = "冷敷"; } txtRcvMode.Text = strMode; txtRcvAdjust.Text = strAdjust; } //运行时长 txtRcvTime.Text = byteBuff[8].ToString() + "秒"; //水份百分比 txtRcvRh1.Text = byteBuff[9].ToString() + "%"; //油分百分比 txtRcvRh2.Text = byteBuff[10].ToString() + "%"; //弹性百分比 txtRcvRh3.Text = byteBuff[11].ToString() + "%"; //环境温度 txtRcvThTemp.Text = byteBuff[12].ToString() + "℃"; //发送应答数据 AskDataSend(); } //检测完成 DetectTaskDone(); } else { //检验和错误 txtRcvError.Text = Convert.ToString((Convert.ToInt64(txtRcvError.Text) + 1)); funcOutputLog("校验和错误,应为" + Uart.byteCheakSum(byteBuff, 2, byteBuff[1] - 1).ToString("X2") + ",实为" + byteBuff[13] + "。", "错误"); } } } else if (byteBuff.Length == 15) { if ((byteBuff[0] == 0x22) && (byteBuff[1] == 13) && (byteBuff[2] == 0x52) && (byteBuff[3] == 0x02)) { if (byteBuff[14] == Uart.byteCheakSum(byteBuff, 2, byteBuff[1] - 1)) { if (byteBuff[5] == 0x03) { //状态 switch (byteBuff[6]) { case 0x00: txtRcvStatus.Text = "关机"; break; case 0x01: txtRcvStatus.Text = "运行中"; break; case 0x02: txtRcvStatus.Text = "暂停"; break; case 0x03: txtRcvStatus.Text = "完成"; break; case 0xA1: txtRcvStatus.Text = "配置"; break; default: txtRcvStatus.Text = "未定义" + byteBuff[6].ToString("X2"); break; } //模式 if (Uart.isBinTest(byteBuff[7], 3)) { txtRcvMode.Text = "水份检测"; txtRcvAdjust.Text = "无"; if (!isSendDataChange && !cbRH.DroppedDown && cbRH.SelectedIndex != 1) { cbRH.SelectedIndex = 1; } } else { if (!isSendDataChange && !cbRH.DroppedDown && cbRH.SelectedIndex != 0) { cbRH.SelectedIndex = 0; } string strMode = "无"; string strAdjust = "无"; if (Uart.isBinTest(byteBuff[7], 0)) { strAdjust = "弱"; } if (Uart.isBinTest(byteBuff[7], 1)) { strAdjust = "中"; } if (Uart.isBinTest(byteBuff[7], 2)) { strAdjust = "强"; } if (Uart.isBinTest(byteBuff[7], 4)) { strMode = "清洁"; } if (Uart.isBinTest(byteBuff[7], 5)) { strMode = "保湿"; } if (Uart.isBinTest(byteBuff[7], 6)) { strMode = "导入"; } if (Uart.isBinTest(byteBuff[7], 7)) { strMode = "冷敷"; } txtRcvMode.Text = strMode; txtRcvAdjust.Text = strAdjust; } //运行时长 txtRcvTime.Text = byteBuff[8].ToString() + "秒"; //水份百分比 txtRcvRh1.Text = byteBuff[9].ToString() + "%"; //油分百分比 txtRcvRh2.Text = byteBuff[10].ToString() + "%"; //弹性百分比 txtRcvRh3.Text = byteBuff[11].ToString() + "%"; //环境温度 txtRcvThTemp.Text = byteBuff[12].ToString() + "℃"; //电量 switch (byteBuff[13]) { case 0x00: txtRcvVersion.Text = "充电中"; break; case 0x01: txtRcvVersion.Text = "一格"; break; case 0x02: txtRcvVersion.Text = "二格"; break; case 0x03: txtRcvVersion.Text = "三格"; break; case 0x04: txtRcvVersion.Text = "四格"; break; case 0x05: txtRcvVersion.Text = "满格"; break; case 0x06: txtRcvVersion.Text = "充电完成"; break; default: txtRcvVersion.Text = byteBuff[13].ToString(); break; } //发送应答数据 AskDataSend(); } //检测完成 DetectTaskDone(); } else { //检验和错误 txtRcvError.Text = Convert.ToString((Convert.ToInt64(txtRcvError.Text) + 1)); funcOutputLog("校验和错误,应为" + Uart.byteCheakSum(byteBuff, 2, byteBuff[1] - 1).ToString("X2") + ",实为" + byteBuff[14] + "。", "错误"); } } } else if (byteBuff.Length == 8) { if ((byteBuff[0] == 0x22) && (byteBuff[1] == 6) && (byteBuff[2] == 0x52) && (byteBuff[3] == 0x02)) { if (byteBuff[7] == Uart.byteCheakSum(byteBuff, 2, byteBuff[1] - 1)) { if (byteBuff[5] == 0x0E) { txtRcvError.Text = Convert.ToString((Convert.ToInt64(txtRcvError.Text) + 1)); funcOutputLog("接收端通信错误,错误代号:" + byteBuff[6] + "。", "错误"); } } } } else { txtRcvError.Text = Convert.ToString((Convert.ToInt64(txtRcvError.Text) + 1)); funcOutputLog("接收到无法解析的数据。", "错误"); } }
private void timUart_Tick(object sender, EventArgs e) { if (Function.F_PROT_SEND == "0") { byte[] byteSendData = { 0x22, 0x06, 0xA5, 0x00, 0x00, 0x00, 0x01, 0x00 }; //设置命令帧类型 if (isSendDataChange) { isSendDataChange = false; byteSendData[3] = 0x01; } //设置APP状态 byteSendData[4] = byteSendDataAPP; if (byteSendDataAPP != 0x00) { byteSendDataAPP = 0x00; cbAPP.SelectedIndex = 0; // 复位APP状态 } //设置水份检测开关 byteSendData[5] = byteSendDataRH; //计算校验和 byteSendData[byteSendData.Length - 1] = Uart.byteCheakSum(byteSendData, 2, 5); //发送数据 sp1_DataSend(Uart.byteToHexStr(byteSendData)); } else if (Function.F_PROT_SEND == "1") { //判断发送命令标志 if (isSendDataChange || (byteSendDataAPP != 0x00)) { byte[] byteSendData = { 0x22, 0x06, 0x52, 0x02, 0x01, 0x01, 0x00, 0x00 }; isSendDataChange = false; //设置APP状态 if (byteSendDataAPP != 0x00) { byteSendData[5] = 0x01; switch (byteSendDataAPP) { case 0xA0: byteSendData[6] = 0x01; break; case 0xA1: byteSendData[6] = 0x02; break; case 0xA2: byteSendData[6] = 0x03; break; case 0xAE: byteSendData[6] = 0x04; break; default: byteSendData[6] = 0x00; break; } // 复位APP状态 byteSendDataAPP = 0x00; cbAPP.SelectedIndex = 0; } //设置水份检测开关 else { byteSendData[5] = 0x02; byteSendData[6] = Convert.ToByte(byteSendDataRH == Convert.ToByte(0x08) ? 0x01 : 0x00); } //计算校验和 byteSendData[byteSendData.Length - 1] = Uart.byteCheakSum(byteSendData, 2, 5); //发送数据 sp1_DataSend(Uart.byteToHexStr(byteSendData)); } } else { funcOutputLog("无法识别发送协议,请在功能设置中重新选择", "错误"); return; } if (++intCharNum > 3) { intCharNum = 1; } funcOutputLog("串口通信中" + new string('.', intCharNum), "状态"); }