private DATA_SPLIT GetData_Keyword_SD(string a) { int data = -1; //字符串中包含几个数据 string[] data_split = new string[50]; //将串口收到的信息分割 string[] data_split_Y = new string[50]; //将串口收到的信息分割 for (int i = 0; i < a.Length - 4; i++) { if (a[i] == 'P' && IsNumber(a[i + 1]) && (a[i + 2] == 'X' || a[i + 2] == 'Y') && a[i + 3] == ':')//散点图关键字捕获 { data = a[i + 1] - 48; string var = ""; for (int i_0 = i + 4; i_0 < a.Length - 1; i_0++) { var += a[i_0]; if (!IsNumber(a[i_0 + 1])) { break; } } if (a[i + 2] == 'X') { if (IsNumber(var)) { data_split[data] = var; } else { data_split[data] = "0"; } } else { if (IsNumber(var)) { data_split_Y[data] = var; } else { data_split_Y[data] = "0"; } } } } if (data > 4)//限制上限5条 { data = 4; } DATA_SPLIT sPLIT = new DATA_SPLIT(); sPLIT.DATA = data; sPLIT.data_split = data_split; sPLIT.data_split_Y = data_split_Y; return(sPLIT); }
private DATA_SPLIT GetData_Free(string a) { int data = -1; //字符串中包含几个数据 string[] data_split = new string[50]; //将串口收到的信息分割 bool isnum_last = false; foreach (char item in a) { if (IsNumber(item)) { if (!isnum_last) { data++; data_split[data] = data_split[data] + item; isnum_last = true; } else { data_split[data] = data_split[data] + item; } } if (isnum_last == true && !IsNumber(item)) { isnum_last = false; } if (item == '\n') { break; } } if (data > 4)//限制上限5条 { data = 4; } DATA_SPLIT sPLIT = new DATA_SPLIT(); sPLIT.DATA = data; sPLIT.data_split = data_split; return(sPLIT); }
public int line_num = 0; //接收到多少行 private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) //对于串口要接收大量数据不能用定时获取的方式 { Thread.Sleep(serial_read_dealy); //等待串口数据全部到达,如果出现乱码就加长些 if (serialPort1.IsOpen) //serialPort1.IsOpen&&serial_temp!="" { line_num++; serial = serialPort1.ReadExisting(); serialPort1.DiscardInBuffer();//记得清空串口,不然容易留到下次接收导致乱码 LM_print(serial); if (draw_open) { DATA_SPLIT A = new DATA_SPLIT(); if (form2.serial_read_way_0 == "自由捕获") { A = GetData_Free(serial); } else { A = GetData_Keyword(serial); } line_var = A.DATA + 1; for (int i = 0; i < line_var; i++) { if (line_var_first) { coor[i, coor_var - 1, 0] = 0; //ms time_temp = Environment.TickCount; //系统启功后到当前的时间 } else { coor[i, coor_var - 1, 0] = Environment.TickCount - time_temp;//开始画图后到现在的时间 } coor[i, coor_var - 1, 1] = Convert.ToDouble(A.data_split[i]); for (int i_0 = 0; i_0 < coor_var - 1; i_0++) { coor[i, i_0, 0] = coor[i, i_0 + 1, 0]; coor[i, i_0, 1] = coor[i, i_0 + 1, 1]; if (auto_limit) { if (coor[i, i_0 + 1, 1] < var_min && coor[i, i_0 + 1, 1] != 0) { var_min = coor[i, i_0 + 1, 1]; } if (coor[i, i_0 + 1, 1] > var_max) { var_max = coor[i, i_0 + 1, 1] + 1; var_min = var_max - 1;//防止等于0 } } } line_var_first = false; } /*************************散点图**********************************/ DATA_SPLIT B = GetData_Keyword_SD(serial); sd_var = B.DATA + 1; for (int i = 0; i < sd_var; i++) { coor_sd[i, coor_var_sd - 1, 0] = Convert.ToDouble(B.data_split[i]); coor_sd[i, coor_var_sd - 1, 1] = Convert.ToDouble(B.data_split_Y[i]); for (int i_0 = 0; i_0 < coor_var_sd - 1; i_0++) { coor_sd[i, i_0, 0] = coor_sd[i, i_0 + 1, 0]; coor_sd[i, i_0, 1] = coor_sd[i, i_0 + 1, 1]; if (coor_sd[i, i_0 + 1, 1] < var_min_sdy && coor_sd[i, i_0 + 1, 1] != 0) { var_min_sdy = coor_sd[i, i_0 + 1, 1]; } if (coor_sd[i, i_0 + 1, 1] > var_max_sdy) { var_max_sdy = coor_sd[i, i_0 + 1, 1] + 1; var_min_sdy = var_max_sdy - 1;//防止等于0 } if (coor_sd[i, i_0 + 1, 0] < var_min_sdx && coor_sd[i, i_0 + 1, 0] != 0) { var_min_sdx = coor_sd[i, i_0 + 1, 0]; } if (coor_sd[i, i_0 + 1, 0] > var_max_sdx) { var_max_sdx = coor_sd[i, i_0 + 1, 0] + 1; var_min_sdx = var_max_sdx - 1;//防止等于0 } } } } //***********************************数据记录与保存****************************************************/ if (excel_record) { label_excel_record_val.Text = "已记录\n折线" + row_var + "条\n点阵" + row_var_sd + "条"; HSSFSheet Sheet1 = (HSSFSheet)workbook2003.GetSheet("散点图"); //获取名称为Sheet1的工作表 HSSFSheet Sheet2 = (HSSFSheet)workbook2003.GetSheet("数据可视化"); //获取名称为Sheet1的工作表 row_var_sd++; if (excel_first_sd) { for (int i = 0; i < sd_var; i++)//散点图 { if (i > 0) { Sheet1.GetRow(0).CreateCell(0 + i * 3).SetCellValue("点" + i + " X坐标"); Sheet1.GetRow(0).CreateCell(1 + i * 3).SetCellValue("点" + i + "Y坐标"); } else { Sheet1.CreateRow(0).CreateCell(0 + i * 3).SetCellValue("点" + i + " X坐标"); Sheet1.GetRow(0).CreateCell(1 + i * 3).SetCellValue("点" + i + "Y坐标"); } } excel_first_sd = !excel_first_sd; } for (int i = 0; i < sd_var; i++) { if (i > 0) { Sheet1.GetRow(row_var_sd).CreateCell(0 + i * 3).SetCellValue(coor_sd[i, coor_var_sd - 1, 0]); Sheet1.GetRow(row_var_sd).CreateCell(1 + i * 3).SetCellValue(coor_sd[i, coor_var_sd - 1, 1]); } else { Sheet1.CreateRow(row_var_sd).CreateCell(0).SetCellValue(coor_sd[0, coor_var_sd - 1, 0]); Sheet1.GetRow(row_var_sd).CreateCell(1).SetCellValue(coor_sd[0, coor_var_sd - 1, 1]);//已经创造过的不能再用create,会被覆盖 } } if (line_var > 0) { row_var++; Sheet2.CreateRow(0).CreateCell(0).SetCellValue("时间(秒)"); for (int i = 0; i < line_var; i++)//数据可视化 { Sheet2.GetRow(0).CreateCell(i + 1).SetCellValue("数据 " + i); } Sheet2.CreateRow(row_var).CreateCell(0).SetCellValue((coor[0, coor_var - 1, 0] * 0.001)); for (int i = 0; i < line_var; i++) { Sheet2.GetRow(row_var).CreateCell(i + 1).SetCellValue(coor[i, coor_var - 1, 1]); } } } if (ecxel_save)//导出文件 { FileStream file2003 = new FileStream(@file_name, FileMode.Create); workbook2003.Write(file2003); file2003.Close(); workbook2003.Close(); ecxel_save = false; } } }