C#上位机初学应用笔记

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';            //使用数字显示
                     }
                 }
             }
         }
     }
 }

至此,一个简单的串口数据波形显示助手就完成了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值