C#光功率计_扫码器导入excel
公司要求扫码器读入编码,然后光功率计取出数值,等完成后把两个数据导入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相关推荐
- 扫码器:壹码通(EMT 6621)二维码带多个回车换行处理
摘要:二维码运用越来越广泛了,目前在医院中一个二维码可以串联多个系统,二维码的内容也可以设置一些特殊字符去达成系统便捷性.本次遇到为二维码中开头内置了回车和空格,在程序判断为回车(KEY_ENTER) ...
- 商品扫码器驱动如何设置 商品扫码器驱动设置步骤
商品扫码器驱动如何设置?商品扫码器驱动设置步骤,商品扫码器一般分为三种接口,分别为USB接口.串口和键盘口.只需要选择适合使用的接口,也就是说电脑或其他设备上有什么接口,就选择什么接口就对了,就大多数 ...
- excel切片器显示错误_带切片器的Excel弹出选择器工具
excel切片器显示错误 Slicers make it easy to select from a list of items, but they take up valuable space on ...
- C# 控制新大陆扫码器自动扫码读取序列号
在开始代码前先要准备好两件事: 首先,要安装新大陆的相应驱动,使得COM口能识别到扫码器. 其次,将扫码器切换到代码控制的自动扫码模式.这个找厂家要一下就行,他们会给你一串码,用扫码器扫一下这些码就能 ...
- 三菱PLC与扫码器通讯控制PLC工作
实现目标: 1.通过扫码器,扫码到的二维码或者一维码 ,控制PLC的输出(对PLC的输出进行控制),本案例中通过扫描二维码控制Y0-Y3的点亮 2.熟悉232串口通讯RS通讯控制模式 硬件配置: 1. ...
- vue 扫码枪 扫码墩 扫码器 中文输入影响 大小写影响 解决方案 js web端扫码枪对接 前端扫码枪 html扫码枪 vue扫码枪
# vue3 扫马枪/扫马墩/扫码器 中文输入影响 大小写影响 解决方式 ## ps 你们觉得好用的话,能不能给我点个赞啊
- Android 扫码器串口通讯
最进接串口扫码器,参考 github上开源的串口通讯库https://github.com/cepr/android-serialport-api实现扫码器通讯. 1.集成 Android Studi ...
- 虹科HK-NT 50网关让扫码器轻松连接工业PLC
扫码器或扫码枪是一种读取条形码或二维码信息的机器.它利用发射出红外线光源,然后根据反射的结果,利用芯片来译码,最后再返回条形码或二维码所代表的正确字符.传统的扫码器主要应用在快递公司\仓储物流\仓库盘 ...
- 获取USB扫码器输入
USB扫码器相当于键盘输入 重写onKeyDown方法监听输入 int count = 1; StringBuffer sb = new StringBuffer(); TextView tv;pub ...
最新文章
- sola ris 简单命令
- 结构体中string类型成员
- sgm3157功能_SGM3157_SGM3157供应商_价格_Datasheet_pdf资料-IC资料网
- telnet IP不通/sybase central工具无法连接到数据库
- Spring+hibernate+JSP实现Piano的数据库操作---4.配置文件
- 2019-2020-1 20175313 《信息安全系统设计基础》第一周学习总结
- web安全day16:人人都要懂的OSI和TCP/IP协议簇
- TCPClient例子(3)基于委托和事件的TcpHelper程序
- maven 加入第三方库_项目pom里引入第三方库的四个方法
- 20145236《信息安全系统设计基础》第1周学习总结
- #1024程序员节# cc2530 按键唤醒功耗模式PM3例程
- 2019年 武汉理工大学计算机考研经验分享
- 哈希值 是什么?哈希值是什么东西啊?具体怎么识别?怎么用?
- 【Love2D】第0章-从零开始学习Love2D
- Android Hal层回调APP应用接口
- 微信PC端不显示头像和表情怎么解决
- WIN10-VS2019-SeetaFace6编译
- java计算机毕业设计线上旅行信息管理系统源代码+数据库+系统+lw文档
- Java除法结果带小数、进一法的实现(java)
- WebJars和wro4j集成
热门文章
- 红海市场杀出的细分蓝海,车队管理改变商用车命运的「核武器」
- 基于Springboot+Vue实现智能停车场管理系统
- 2023北京科技大学计算机考研信息汇总
- 快速微课制作方法和技巧
- 0x79B2A261 (ucrtbased.dll) (Project4.exe 中)处有未经处理的异常: 0xC0000005: 写入位置 0x00A41023 时发生访问冲突。
- Ubuntu Debian Kali 部署 巡风
- 全国/诚招线上IT讲师 薪酬丰富
- 瓦里安、勃林格殷格翰将参展第四届进博会;森世海亚集团中国区总部落地上海 | 医药健闻...
- 第一回软硬环境可操作之stm8s软硬件环境准备(上)
- linux 软件源 ppa,Linux 添加PPA源