예제 #1
0
파일: Form1.cs 프로젝트: zanllp/SerialPort
        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);
        }
예제 #2
0
파일: Form1.cs 프로젝트: zanllp/SerialPort
        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);
        }
예제 #3
0
파일: Form1.cs 프로젝트: zanllp/SerialPort
        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;
                }
            }
        }