- // Csharp 上位机代码
- g.Set(20480);//设置最大存储深度(暂无作用)用于显示历史数据
- if (serialPort.IsOpen)//如果串口已经打开
- {
- connected = false;//设置为关闭状态
- serialPort.Close();//关闭串口
- button2.Text = "连接";//更改按键文字
- }
- else
- {
- connected = true;//设置为连接状态
- g.LineSet(0, 0, Color.Red, 1f, 20, 1, 0.5f, 1024, 4096, false, false);//设置电压线
- g.LineSet(1, 0, Color.Green, 1f, 20, 1, 0.5f, 1024, 4096, false, false);//设置电流线
- serialPort.PortName = comboBox1.Text;//串口名为当前comboBox的本
- serialPort.BaudRate = 115200;//速率
- serialPort.DataBits = 8;//停止位
- serialPort.Parity = System.IO.Ports.Parity.None;
- serialPort.StopBits = System.IO.Ports.StopBits.One;
- serialPort.Handshake = System.IO.Ports.Handshake.None;
- //serialPort.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(serialPort_DataReceived);
- serialPort.Open();//打开串口
- button2.Text = "断开";//设置按钮文本
- new Thread((ThreadStart)delegate//开一个线程用来读串口数据(试过使用串口中断事件,速度比较慢)
- {
- while (true)
- {
- if (connected)//如果串口已经连接
- {
- try
- {
- stringBuffer += serialPort.ReadExisting();//读当前已经收到的全部数据
- stringBuffer = stringBuffer.Replace("\r", "");//去掉换行,为了使用回车符分割字串
- string[] strs = stringBuffer.Split('\n');//使用回车分割字串
- stringBuffer = strs[strs.Length - 1];//将最后一个(一搬不一定有回车符,所以不是一条完整的数据)保留,下次从此字串后边续接
- for (int i = 0; i < strs.Length - 1; i++)//遍历数据
- {
- byte[] buffer = new byte[4];//定义缓冲
- totalRxCounter++;//接收数据数量++
- string str = strs[i];//取字串
- try
- {
- buffer = Convert.FromBase64String(str);//将字串从base64解码
- int voltage = (buffer[0] << 8 | buffer[1]);//得电压数据
- int current = (buffer[2] << 8 | buffer[3]);//得电流数据
- voltages.Add(voltage);//添加电压数据到临时list
- currents.Add(current);//添加电压数据到临时list
- if (writeFile)
- {
- stream.WriteLine(string.Format("{0:D},{1:D}", voltage, current));
- stream.Flush();//输出缓冲区
- }
- validRxCounter++;
- if (validRxCounter > showCount)//如果有效数据大于1024就显示数据
- {
- validRxCounter = 0;//置零
- g.PutData(0, voltages);//添加全部电压数据
- g.PutData(1, currents);//添加全部电流数据
- double U = 3.3f / 4096.0f * voltages.Average();//求平均电压
- // currentOffset = (int)currents.Average();
- double RU = 3.3f / 4096.0f * (currents.Average() - currentOffset)/50;//检流电阻电压
- double I = RU / 0.005;
- voltages.Clear();//清临时电压缓冲
- currents.Clear();//清临时电流缓冲
- label1.BeginInvoke((ThreadStart)delegate//界面线程有效
- {
- label1.Text = string.Format("电压:{0:F3}", U);//更新电压值
- label2.Text = string.Format("电流:{0:F3}", I);//更新电流值
- label3.Text = string.Format("接收总数:{0:D},错误数量:{1:D}", totalRxCounter, errorCounter);//更新总数据和错误数据数量
- });
- if (saveImage)//如果保存图像,在刷屏前保存上一屏图像
- {
- SaveImage();//保存图像
- }
- g.LineSet(0, 0, Color.Red, 1f, 20, 1, 0.5f, showCount, 4096, false, false);//设置电压线
- g.LineSet(1, 0, Color.Green, 1f, 20, 1, 0.5f, showCount, 4096, false, false);//设置电流线
- g.Draw();//画线
- }
- }
- catch (Exception ex)
- {
- label3.BeginInvoke((ThreadStart)delegate
- {
- label3.Text = string.Format("接收总数:{0:D},错误数量:", totalRxCounter, errorCounter++);//更新总数据和错误数据数量
- });
- }
- }
- }
- catch (Exception ex)
- {
- label3.BeginInvoke((ThreadStart)delegate
- {
- label3.Text = string.Format("接收总数:{0:D},错误数量:", totalRxCounter, errorCounter++);//更新总数据和错误数据数量
- });
- }
- }
- }
- }).Start();//启动线程
- }