C#上位机初学应用笔记
1、创建EXCEL文件保存至指定路径,并写入数据
代码示例:
//创建EXCEL函数 学习而来
private void CreateExcelFile(string FileName) //参数为路径 + 文件名
{
//create
object Nothing = System.Reflection.Missing.Value; //这个我不知道是什么意思,但是好像必须有
var app = new Excel.Application();
app.Visible = false;
Excel.Workbook workBook = app.Workbooks.Add(Nothing);
Excel.Worksheet worksheet = (Excel.Worksheet)workBook.Sheets[1];
worksheet.Name = "YANJUN_Cheng"; //sheet名
//headline
worksheet.Cells[1, 1] = "index"; //设置单元格的字
worksheet.Cells[1, 2] = ID1.Text;
worksheet.Cells[1, 3] = "index";
worksheet.Cells[1, 4] = ID2.Text;
for (int i = 0; i < ID1_Array.Count; i++) //循环写入数据
{
worksheet.Cells[i + 2, 1] = i.ToString();
worksheet.Cells[i + 2, 2] = ID1_Array[i];
}
for (int i = 0; i < ID2_Array.Count; i++) //循环写入另一个曲线的数据
{
worksheet.Cells[i + 2, 3] = i.ToString();
worksheet.Cells[i + 2, 4] = ID2_Array[i];
}
//保存
worksheet.SaveAs(FileName, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Excel.XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing);
workBook.Close(false, Type.Missing, Type.Missing);
//退出
app.Quit();
}
2、linkLable控件,点击加载超链接,很简单,就一行
//这样是自动打开电脑默认的浏览器的
System.Diagnostics.Process.Start("http://www.yanjun.tech");
//如果强制打开IE则
System.Diagnostics.Process.Start("IEXPLORE.EXE","http://www.yanjun.tech");
3、chart控件
这个我从这个篇博客学习到,写的很全很详细
http://blog.sina.com.cn/s/blog_621e24e20101cp64.html
个人就不再发表愚见了。
5,上位机自动查找串口
//这个方法效率不是很高,但是我觉得的很实用可以做参考
for (int i=1; i < 20; i++) //对PC机进行20个端口的遍历,一般PC机不会有20个串口,基本可以完全扫描
{
try //try 语法,尝试给串口赋值端口号
{
buffer = "COM" + i.ToString();
MyPort.PortName = buffer; //遍历COM1->COM20,并赋值给串口号
MyPort.Open(); //尝试打开串口 能成功打开则说明成功扫描到串口,打开失败则跳到catch并继续循环
MyBox.Items.Add(buffer); //将端口号添加到端口框
MyBox.Text = buffer; //自动将扫描成功的串口显示端口框
MyPort.Close(); //保证在扫描完成时,串口是关闭的
SerialIsOk = true; //该端口正常
}
catch
{
}
}
6、遇到一个问题
线程修改界面UI时调试会出错
例如//启动一个线程
Thread thread=new Thread(new ThreadStart(DoWork));
thread.Start();
//线程方法
private void DoWork()
{
this.TextBox1.Text="hello word";
}
//但是,关闭调试器,直接打开应用程序也许不会出问题
//要解决这个问题需要实用托管
//这个里附上我的托管更新界面 线程代码
Thread UpdataThread = new Thread(new ThreadStart(DoWork)); //开启一个新线程同步更新text
UpdataThread.Start(); //线程开启
public void DoWork()
{
MyInvoke mi = new MyInvoke(UpdataForm); //使用代理更新界面
this.BeginInvoke(mi, new Object[] { ShowStr }); //开始代理
}
//更新呢界面的方法
public void UpdataForm(string str) //界面更新函数
{
//当显示选项不同的时候 显示的东西不同
if (DataShow.Checked || DCShow.Checked) //允许字符接收区显示时
{
if (HEXShow.Checked) //判断 是否要求16进制显示
{
foreach (byte hex in str) //遍历接收到的字符,将其转化为16进制
{
string buffer = Convert.ToString(hex, 16).ToUpper(); //规范起见 将每byte数据转化为16进制大写显示
ShowText.AppendText("0x" + ((buffer.Length == 1) ? ("0" + buffer) : buffer)/* 三目运算符 编程技巧*/ + " "); //显示在text box上
}
}
else //正常显示 直接显示在text box上即可。
{
ShowText.AppendText(str);
}
}
if (ChartShow.Checked || DCShow.Checked)
{
foreach (byte hex in str) //遍历接收到的字符,将其转化为16进制
{
if (hex == 0x0d) //判断是不是此次数据接收完成
{
if (IDStr == ID1.Text) //判断符合哪个ID
{
try
{
this.chart1.Series[0].Points.AddY(Convert.ToDouble(NumStr));
ID1_Array.Add(NumStr);
IDWarn.Text = "ID提示:正常";
}
catch
{
MessageBox.Show("数据异常", "提示");
}
}
else if (IDStr == ID2.Text)
{
try
{
this.chart1.Series[1].Points.AddY(Convert.ToDouble(NumStr));
ID2_Array.Add(NumStr); //将接收到的数据存放至数组
IDWarn.Text = "ID提示:正常";
}
catch
{
MessageBox.Show("数据异常", "提示");
}
}
else
{
IDWarn.Text = "ID提示:无对应ID";
}
IDStr = ""; //清除缓存
NumStr = "";
}
else
{
if (hex > 64 && hex < 123) //判断为字母
{
IDStr += (char)hex; //ID使用字符显示
}
else if ((hex > 47 && hex < 58) || hex == 46) //判断为数字
{
if (hex == 46)
{
NumStr += (char)hex;
}
else
{
NumStr += hex - '0'; //使用数字显示
}
}
}
}
}
}
至此,一个简单的串口数据波形显示助手就完成了。