公司要求扫码器读入编码,然后光功率计取出数值,等完成后把两个数据导入excel

用了将近一个月 时间  以前在学校一直想学一款上位机的,但是C#,LABVIEW,QT,VC,deliphi 选择太多了。

而且时间也不多,正好借这次机会简单的学了下上位机选的是C#(网上都说C#简单,学了之后感觉不简单(当然是指我这种只会点C语言的))

其实也就只要网上查了个串口的例子,然后自己在上面改(当然要看懂串口的例子,那是前提,所以先要把C#的书都一变)

还有光功率计读数很奇怪,原本我以为只要连上窗口就能开始读数据了,原来要先发射对应的数据才能接受数据(关于这个要打电话给仪器的售后)

一些简单的数据转换方面的知识

比如16进制的byte数组转成float

用float ff=bitconverter.getbytes(ff);

把其他类型的数据转成字符型用 object.tostring()         如int i; i.tostring()   把16进制的byte数组发送 byte[]  buf={0xaa,0xbb,0xcc} ;write(buf,0,3);从0开始的3字节数据

把字符串转成float类型 如convert.tosingle(string obj);

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

//messagebox的命名空间
using System.Windows;

//串口需要的命名空间
using System.IO.Ports;
using System.Text.RegularExpressions;

//excel需要的命名空间
using Microsoft.Office.Interop.Excel;

namespace 上位机
{
    public partial class Form1 : Form
    {
        private int count = 0;                              //计满10次,取平均值。
        private float sum = 0;                              //用来计和
        private float dbm;                                  //光功率
        private int hang = 2;                               //EXCEL表格行
        private int yanchi = 0;                             //每次textbox1有新数据的时候都延迟1S
        private long received_count = 0;                    //接收计数
        private long send_count = 0;                        //发送计数
        private int j=1;
        private int jianyan=0;
        private int bochang;
        private byte[] kaishi = { 0xaa, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01 };     //连续接收功率值命令
        private byte[] shineng = { 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
        private byte[] guanggonglv;

//用于创建EXCEL对象
        static Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application();
        static Workbook wbook = app.Workbooks.Add();         // 这三句没看懂关于接口的引用
        Worksheet worksheet = (Worksheet)wbook.Worksheets[1];

//创建一个串口对象
        private SerialPort comm = new SerialPort();

public Form1()
        {
            InitializeComponent();

}

private void Form1_Load(object sender, EventArgs e)
        {
            //初始化下拉串口名称列表框 
            string[] ports = SerialPort.GetPortNames();  //字符串port[]数组来保存串口的端口号
            //Array.Sort(ports);                           //用Array的sort方法对port数组进行排序
            comboBox1.Items.AddRange(ports);
            comboBox1.SelectedIndex = comboBox1.Items.Count > 0 ? 0 : -1;  //-1代表无显示

//初始化SerialPort对象 
            comm.NewLine = "\r\n";           //回车换行 _不是很理解
            comm.RtsEnable = true;      //根据实际情况吧。 
            //添加事件注册 
            comm.DataReceived += comm_DataReceived;
            comm.ReceivedBytesThreshold = 9;        //收到9字节的时候触发datareceive事件
            app.Visible = true;                     //excel打开的时候能跳出来
        }

void comm_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            jianyan = 1;
            if (e.EventType != SerialData.Eof)
            {
                if (textBox1.Text != "")
                {
                    if (yanchi == 0)
                    {
                        System.Threading.Thread.Sleep(200);
                    }
                    yanchi++;
                    System.Threading.Thread.Sleep(80);
                    int n = comm.BytesToRead;//先记录下来,避免某种原因,人为的原因,操作几次之间时间长,缓存不一致 
                    byte[] buf = new byte[n];//声明一个临时数组存储当前来的串口数据
                    received_count = j;//增加接收计数 
                    comm.Read(buf, 0, n);//读取缓冲数据

//如果buf[0]不正确的话,则退出
                    if (buf[0] != 0x55)
                    {
                        return;
                    }

//因为要访问ui资源,所以需要使用invoke方式同步ui。 
                    this.Invoke((EventHandler)(delegate
                    {
                        guanggonglv = new byte[4] { buf[4], buf[5], buf[6], buf[7] };
                        bochang=buf[2]*256+buf[3];

float ff = BitConverter.ToSingle(guanggonglv, 0);
                        count++;
                        //取5,6,7,8,9次的数来求和

if ( (count>1) && (count<4) )
                        {
                            sum = sum + ff;
                        }

richTextBox1.ScrollToCaret();
                        //追加的形式添加到文本框末端,并滚动到最后。 
                        this.richTextBox1.AppendText(ff.ToString("#0.00") + "\n");
                        //修改接收计数 
                        label5.Text = "接收字节数:" + received_count.ToString();

if (count == 4)
                        {
                            dbm = sum/2;
                            sum = 0;
                            count = 0;
                            yanchi = 0;
                            textBox2.Text = (dbm.ToString("#0.00"));
                            worksheet.Cells[hang, 1] = textBox1.Text;
                            worksheet.Cells[hang, 2] = textBox2.Text;
                            hang++;
                            j++;
                            label9.Text = bochang.ToString();
                            textBox1.Text = "";
                            this.richTextBox1.AppendText("\n\n");
                        }

}));
                }
            }
        }

private void button2_Click(object sender, EventArgs e)
        {
            //根据当前串口对象,来判断操作 
            if (comm.IsOpen)
            {
                //打开时点击,则关闭串口 
                comm.Close();
            }
            else
            {
                //关闭时点击,则设置好端口,波特率后打开 
                comm.PortName = comboBox1.Text;
                comm.BaudRate = 9600;
                try
                {
                    comm.Open();
                }
                catch (Exception ex)
                {
                    //捕获到异常信息,创建一个新的comm对象,之前的不能用了。 
                    comm = new SerialPort();
                    //现实异常信息给客户。 
                    MessageBox.Show(ex.Message);
                }
            }
            //设置按钮的状态 
            button2.Text = comm.IsOpen ? "关闭串口" : "打开串口";
            textBox1.Focus();
            //    buttonSend.Enabled = comm.IsOpen; 
        }

private void button3_Click(object sender, EventArgs e)
        {
            int n;
            //定义一个变量,记录发送了几个字节  ; 
            comm.Write(shineng, 0, 7);
            System.Threading.Thread.Sleep(900);
            comm.Write(kaishi, 0, 7);
            n = (kaishi.Length + shineng.Length);

//用于检验是否收到功率计发送的数据
            System.Threading.Thread.Sleep(90);

if (MessageBox.Show("connecting", "串口", MessageBoxButtons.OK) == DialogResult.OK)
            {
                if (jianyan == 1)
                {
                    label8.Text = "sucess";
                    jianyan = 0;
                }
                else
                {
                    label8.Text = "fail";
                    jianyan = 0;
                }

}

textBox1.Focus();

}

private void button1_Click(object sender, EventArgs e)
        {
            this.richTextBox1.Text = "";
            send_count = 0;
            label4.Text = "发送字节数:" + send_count.ToString();//更新界面 
            received_count = 0;
            label5.Text = "接收字节数:" + received_count.ToString();
            textBox1.Text = "";
            textBox2.Text = "";
        }

}
}

代码下载http://download.csdn.net/detail/yezhubenyue/4211778

C#光功率计_扫码器导入excel相关推荐

  1. 扫码器:壹码通(EMT 6621)二维码带多个回车换行处理

    摘要:二维码运用越来越广泛了,目前在医院中一个二维码可以串联多个系统,二维码的内容也可以设置一些特殊字符去达成系统便捷性.本次遇到为二维码中开头内置了回车和空格,在程序判断为回车(KEY_ENTER) ...

  2. 商品扫码器驱动如何设置 商品扫码器驱动设置步骤

    商品扫码器驱动如何设置?商品扫码器驱动设置步骤,商品扫码器一般分为三种接口,分别为USB接口.串口和键盘口.只需要选择适合使用的接口,也就是说电脑或其他设备上有什么接口,就选择什么接口就对了,就大多数 ...

  3. excel切片器显示错误_带切片器的Excel弹出选择器工具

    excel切片器显示错误 Slicers make it easy to select from a list of items, but they take up valuable space on ...

  4. C# 控制新大陆扫码器自动扫码读取序列号

    在开始代码前先要准备好两件事: 首先,要安装新大陆的相应驱动,使得COM口能识别到扫码器. 其次,将扫码器切换到代码控制的自动扫码模式.这个找厂家要一下就行,他们会给你一串码,用扫码器扫一下这些码就能 ...

  5. 三菱PLC与扫码器通讯控制PLC工作

    实现目标: 1.通过扫码器,扫码到的二维码或者一维码 ,控制PLC的输出(对PLC的输出进行控制),本案例中通过扫描二维码控制Y0-Y3的点亮 2.熟悉232串口通讯RS通讯控制模式 硬件配置: 1. ...

  6. vue 扫码枪 扫码墩 扫码器 中文输入影响 大小写影响 解决方案 js web端扫码枪对接 前端扫码枪 html扫码枪 vue扫码枪

    # vue3 扫马枪/扫马墩/扫码器 中文输入影响 大小写影响 解决方式 ## ps 你们觉得好用的话,能不能给我点个赞啊

  7. Android 扫码器串口通讯

    最进接串口扫码器,参考 github上开源的串口通讯库https://github.com/cepr/android-serialport-api实现扫码器通讯. 1.集成 Android Studi ...

  8. 虹科HK-NT 50网关让扫码器轻松连接工业PLC

    扫码器或扫码枪是一种读取条形码或二维码信息的机器.它利用发射出红外线光源,然后根据反射的结果,利用芯片来译码,最后再返回条形码或二维码所代表的正确字符.传统的扫码器主要应用在快递公司\仓储物流\仓库盘 ...

  9. 获取USB扫码器输入

    USB扫码器相当于键盘输入 重写onKeyDown方法监听输入 int count = 1; StringBuffer sb = new StringBuffer(); TextView tv;pub ...

最新文章

  1. sola ris 简单命令
  2. 结构体中string类型成员
  3. sgm3157功能_SGM3157_SGM3157供应商_价格_Datasheet_pdf资料-IC资料网
  4. telnet IP不通/sybase central工具无法连接到数据库
  5. Spring+hibernate+JSP实现Piano的数据库操作---4.配置文件
  6. 2019-2020-1 20175313 《信息安全系统设计基础》第一周学习总结
  7. web安全day16:人人都要懂的OSI和TCP/IP协议簇
  8. TCPClient例子(3)基于委托和事件的TcpHelper程序
  9. maven 加入第三方库_项目pom里引入第三方库的四个方法
  10. 20145236《信息安全系统设计基础》第1周学习总结
  11. #1024程序员节# cc2530 按键唤醒功耗模式PM3例程
  12. 2019年 武汉理工大学计算机考研经验分享
  13. 哈希值 是什么?哈希值是什么东西啊?具体怎么识别?怎么用?
  14. 【Love2D】第0章-从零开始学习Love2D
  15. Android Hal层回调APP应用接口
  16. 微信PC端不显示头像和表情怎么解决
  17. WIN10-VS2019-SeetaFace6编译
  18. java计算机毕业设计线上旅行信息管理系统源代码+数据库+系统+lw文档
  19. Java除法结果带小数、进一法的实现(java)
  20. WebJars和wro4j集成

热门文章

  1. 红海市场杀出的细分蓝海,车队管理改变商用车命运的「核武器」
  2. 基于Springboot+Vue实现智能停车场管理系统
  3. 2023北京科技大学计算机考研信息汇总
  4. 快速微课制作方法和技巧
  5. 0x79B2A261 (ucrtbased.dll) (Project4.exe 中)处有未经处理的异常: 0xC0000005: 写入位置 0x00A41023 时发生访问冲突。
  6. Ubuntu Debian Kali 部署 巡风
  7. 全国/诚招线上IT讲师 薪酬丰富
  8. 瓦里安、勃林格殷格翰将参展第四届进博会;森世海亚集团中国区总部落地上海 | 医药健闻...
  9. 第一回软硬环境可操作之stm8s软硬件环境准备(上)
  10. linux 软件源 ppa,Linux 添加PPA源