// 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();//启动线程
}