Слияние кода завершено, страница обновится автоматически
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using OxyPlot;
using OxyPlot.Annotations;
using OxyPlot.Wpf;
using OxyPlot.Axes;
using OxyPlot.Series;
namespace 帆板仪表盘
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
private SerialPort sp = new SerialPort();
private StringBuilder builder = new StringBuilder();//避免在事件处理方法中反复的创建,定义到外面。
private long received_count = 0;//接收计数
// private long send_count = 0;//发送计数
private string singleData;
string t = String.Empty;
Mod m;
List<Mod> list_Mod = new List<Mod>();
int flag = 10;
private MainViewModel viewModel1 = new MainViewModel();
private MainViewModel viewModel2 = new MainViewModel();
PlotModel model = new PlotModel();
public MainWindow()
{
//DataContext = new List<DataPoint>{new DataPoint(1,2),new DataPoint(10,20),new DataPoint(15,4)};
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
RefreshCb_COM();
// bt_Conn.IsEnabled= false;
plot.DataContext = viewModel1;
plot2.DataContext = viewModel2;
tt_Help.ToolTip = ToolTip = "单击坐标可查看XY的值;\r\n滚轮按下框选可放大;\r\n滚轮在坐标处滑动可改变间距;\r\n右键可拖动图像;\r\n最好在关闭端口后进行操作\r\n数据格式:power:xxx角度:xxx(英文标点,无视\\r\\n)";
}
//刷新combox
private void RefreshCb_COM()
{
viewModel1 = new MainViewModel();
viewModel2= new MainViewModel();
plot.DataContext = viewModel1;
plot2.DataContext = viewModel2;
sp.BaudRate = 115200;
if (sp.IsOpen)
{
//打开时点击,则关闭串口
sp.Close();
bt_Conn.Content = "打开";
cb_COM.IsEnabled = true;
}
sp.DataReceived -= comm_DataReceived;
sp.DataReceived += comm_DataReceived;
received_count = 0;
labelGetCount.Text = "待测";
cb_COM.IsEnabled = true;
cb_COM.Items.Clear();
foreach (string item in SerialPort.GetPortNames())
{
if (SerialFun.IsCommPortValid(item))
{
cb_COM.Items.Add(item);
}
else
{
cb_COM.Items.Add(item + "(Is Using)");
}
}
}
public void comm_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
try
{
int n = sp.BytesToRead;//先记录下来,避免某种原因,人为的原因,操作几次之间时间长,缓存不一致
byte[] buf = new byte[n];//声明一个临时数组存储当前来的串口数据
received_count += n;//增加接收计数
sp.Read(buf, 0, n);//读取缓冲数据
builder.Remove(0, builder.Length);///清除字符串构造器的内容
var backgroundWorker = new BackgroundWorker();
backgroundWorker.DoWork += (s, o) =>
{
string temp;
temp = Encoding.Default.GetString(buf).Replace("\r", "").Replace("\n", "").Replace(" ", "");//出去字符串中所有的无用符号
//直接按ASCII规则转换成字符串
builder.Append(Encoding.Default.GetString(buf));
if (temp.Length >= 10)
{
/*处理数据*/
m = new Mod(temp,received_count);
viewModel1.Add(m.Count, m.Angle, "Angle", "");
viewModel2.Add(m.Count, m.Power, "Power", "");
lock (t) { t = temp; };
}
#region MyRegion
//丢弃来自串行驱动程序的接受缓冲区的数据
// sp.DiscardInBuffer();
//丢弃来自串行驱动程序的传输缓冲区的数据
//sp.DiscardOutBuffer();
//追加的形式添加到文本框末端,并滚动到最后。
//this.tb_Rec.AppendText(builder.ToString());
//this.tb_Rec.AppendText("\r\n");
#endregion
//修改接收计数
};
backgroundWorker.RunWorkerCompleted += (s, args) =>
{
Dispatcher.BeginInvoke(new Action(() =>
{
labelGetCount.Text = received_count.ToString();
Angle.Text = m.Angle.ToString();
Power.Text = m.Power.ToString();
tb_State.Text = t;
}));
};
backgroundWorker.RunWorkerAsync();
}
catch (Exception)
{
MessageBox.Show("添大爷的程序竟然报Bug了!\r\nq请 刷 新 !\r\n 或者重启本软件!", "凸(艹皿艹 )");
}
}
private void bt_Conn_Click(object sender, RoutedEventArgs e)
{
if (sp.IsOpen)
{
//打开时点击,则关闭串口
sp.Close();
bt_Conn.Content = "打开";
cb_COM.IsEnabled = true;
}
else
{
//关闭时点击,则设置好端口,波特率后打开
bt_Conn.Content = "关闭";
cb_COM.IsEnabled = false;
sp.BaudRate = 115200;// int.Parse(comboBaudrate.Text);
try
{
sp.PortName = cb_COM.Text;
sp.BaudRate = 115200;
sp.Open();
}
catch (Exception ex)
{
//捕获到异常信息,创建一个新的comm对象,之前的不能用了。
bt_Conn.Content = "连接";
sp = new SerialPort();
sp.BaudRate = 115200;
RefreshCb_COM();
//现实异常信息给客户。
// MessageBox.Show(ex.Message+"\r\n刷新!");
}
}
}
private void Image_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
cb_COM.Items.Clear();
RefreshCb_COM();
}
private void cb_COM_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
/* if (cb_COM.Text == "" || cb_COM.Text.Length > 5)
{
}
else
{
bt_Conn.IsEnabled = true;//有效的COM才使能连接按钮
}*/
}
public void createRD()
{
Random ra = new Random();
for (int i = 0; i < 10; i++)
{
Mod md = new Mod((ra.NextDouble() * 5), ra.Next(2000), i);
list_Mod.Add(md);
}
}
private void createG_Click(object sender, RoutedEventArgs e)
{
// flag +=1;
// viewModel.Add(flag, new Random ().NextDouble()*5);
}
//private void SetUpModel()
//{
// model.LegendTitle = "Legend";
// model.LegendOrientation = LegendOrientation.Horizontal;
// model.LegendPlacement = LegendPlacement.Outside;
// model.LegendPosition = LegendPosition.TopRight;
// model.LegendBackground = OxyColor.FromAColor(200, OxyColors.White);
// model.LegendBorder = OxyColors.Black;
// var dateAxis = new OxyPlot.Axes.DateTimeAxis(AxisPosition.Bottom, "Date", "dd/MM/yy HH:mm") { MajorGridlineStyle = LineStyle.Solid, MinorGridlineStyle = LineStyle.Dot, IntervalLength = 80 };
// model.Axes.Add(dateAxis);
// var valueAxis = new OxyPlot.Axes.LinearAxis(AxisPosition.Left, 0) { MajorGridlineStyle = LineStyle.Solid, MinorGridlineStyle = LineStyle.Dot, Title = "Value" };
// model.Axes.Add(valueAxis);
//}
}
}
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарий ( 0 )