WEB页获取串口数据
最近做一个B/S的项目,需要读取电子秤的值,之前一直没做过,也没有经验,于是在网上找到很多 大致分两种
- 使用ActiveX控件,JS调用MSCOMM32.dll的串口控件对串口进行控制
- 使用C#语言的控件对串口进行控制,然后使用JS+AJAX与C#进行交互获得串口数据
详情见 使用JS获得串口数据 http://blog.csdn.net/xuing/article/details/6688306 但是小弟用这两种办法都获取到数据
串口配置如下:
serialPort1.PortName = "COM1"; //端口名称
serialPort1.BaudRate = ; //波特率
serialPort1.Parity = Parity.None; //奇偶效验
serialPort1.StopBits = StopBits.One; //效验
serialPort1.DataBits = ; //每个字节的数据位长度
最后换种思路:使用C#写一个ActiveX控件(吉日老师提醒)最后嵌入网页中读取数据 如下:
- 第一步:新建项目,如下图,选择windows下的类库项目。

- 在项目中添加一个类:IObjectSafety.cs

- IObjectSafety.cs代码如下:
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
namespace MyActive
{
//Guid唯一,不可变更,否则将无法通过IE浏览器的ActiveX控件的安全认证
[ComImport, Guid("CB5BDC81-93C1-11CF-8F20-00805F2CD064")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IObjectSafety
{
[PreserveSig]
void GetInterfacceSafyOptions(int riid,out int pdwSupportedOptions,out int pdwEnabledOptions);
}
} - 添加一个用户控件 MyActiveXControl.cs

- 修改 MyActiveXControl.cs 代码,让其继承IObjectSafety,定义相应的Guid,该Guid就是ActiveX的classid
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices; namespace MyActiveX
{
[Guid("218849AF-1B2C-457B-ACD5-B42AC8D17EB7"), ComVisible(true)]
public partial class MyActiveXControl : UserControl,IObjectSafety
{
public MyActiveXControl()
{
InitializeComponent();
} #region IObjectSafety 成员 用于ActiveX控件安全信任
public void GetInterfacceSafyOptions(int riid, out int pdwSupportedOptions, out int pdwEnabledOptions)
{
pdwSupportedOptions = ;
pdwEnabledOptions = ;
} public void SetInterfaceSafetyOptions(int riid, int dwOptionsSetMask, int dwEnabledOptions)
{
throw new NotImplementedException();
}
#endregion
}
}至此 Active控件制作完毕 下面我们添加文本框、按钮、SerialPort、Timer控件进行测试


- 添加响应的事件代码如下
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.IO.Ports;
using System.Text;
using System.Threading;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using MyActive; namespace MyActiveX
{
//不可改变
[Guid("218849AF-1B2C-457B-ACD5-B42AC8D17EB7"), ComVisible(true)]
public partial class MyActiveXControl : UserControl, IObjectSafety
{ public MyActiveXControl()
{
InitializeComponent();
} public delegate void HandleInterfaceUpdataDelegate(string text);//定义一个委托 private HandleInterfaceUpdataDelegate interfaceUpdataHandle;//声明 bool isClose = false;//是否关闭 #region IObjectSafety 成员 用于ActiveX控件安全信任
public void GetInterfacceSafyOptions(int riid, out int pdwSupportedOptions, out int pdwEnabledOptions)
{
pdwSupportedOptions = ;
pdwEnabledOptions = ;
} public void SetInterfaceSafetyOptions(int riid, int dwOptionsSetMask, int dwEnabledOptions)
{
throw new NotImplementedException();
}
#endregion private void button1_Click(object sender, EventArgs e)
{
try
{
interfaceUpdataHandle = new HandleInterfaceUpdataDelegate(UpdateTextBox);//实例化委托对象 serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);
if (!serialPort1.IsOpen)
{
serialPort1.Open();
}
button2.Enabled = true;
button1.Enabled=false;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
return;
}
timer1.Enabled = true; }
/// <summary>
/// 控件加载事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void MyActiveXControl_Load(object sender, EventArgs e)
{
setOrgComb();
}
/// <summary>
/// 初始化串口
/// </summary>
private void setOrgComb()
{
serialPort1.PortName = "COM1"; //端口名称
serialPort1.BaudRate = ; //波特率
serialPort1.Parity = Parity.None; //奇偶效验
serialPort1.StopBits = StopBits.One; //效验
serialPort1.DataBits = ; //每个字节的数据位长度
}
/// <summary>
/// 更新数据
/// </summary>
/// <param name="text"></param>
private void UpdateTextBox(string text)
{
//richTextBox1.Text = text + "\n\t" + richTextBox1.Text;
richTextBox1.Text = text;
} /// <summary>
/// 接收数据是发生
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
//获取接收缓冲区中数据的字节数
if (serialPort1.BytesToRead > )
{ string strTemp = serialPort1.ReadExisting();//读取串口
double weight = -;//获取到的重量
foreach (string str in strTemp.Split('='))//获取稳定的值
{
double flog = ;
//数据是否正常
if(double.TryParse(str, out flog)&&str.IndexOf('.')>&&str[str.Length-]!='.')
{
//数据转换 串口获取到的数据是倒叙的 因此进行反转
char[] charArray = str.ToCharArray();
Array.Reverse(charArray);
string left = new string(charArray).Split('.')[];
string right = new string(charArray).Split('.')[];
if (right.Length==)
{
weight = int.Parse(left) + int.Parse(right) / 100.0;
}
}
}
if(weight>=)
{
//在拥有控件的基础窗口句柄的线程上,用指定的参数列表执行指定委托。
this.Invoke(interfaceUpdataHandle, weight.ToString());//取到数据 更新
}
}
} private void button2_Click(object sender, EventArgs e)
{
try
{
button1.Enabled = true;
button2.Enabled = false;
serialPort1.Close();
timer1.Enabled = false; }
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
} private void timer1_Tick(object sender, EventArgs e)
{
if (isClose)
{
return;
}
try
{
string send = "" + (char)() + 'p';
send = serialPort1.ReadExisting();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
button2_Click(null, null);
}
}
}
} - 至此读取串口数据的Active控件制作完毕 下面我们来制作一个安装包,新建一个安装项目

- 在安装项目的文件系统中添加刚才之前我们制作的ActiveX的DLL:MyActiveX.dll
(特别注意:在文件添加进来后,右击文件选择属性,设置其属性Register值为:vsdraCOM)

9. 生成安装程序,在项目MyActiveX\Setup1\Debug下找到Setup1.msi,双击安装它。
然后在该目录下新建一个html文件(test.html)用于测试我们的ActiceX控件。HTML代码如下:
<html>
<title>Powered by yyzq.net Email:yq@yyzq.net</title>
<head>
</head>
<body>
<div>
<object id="yyzq" classid="clsid:218849AF-1B2C-457B-ACD5-B42AC8D17EB7"
width=""
height=""
codebase="Setup1.msi">
</object>
</div>
</body>
</html>
在IE浏览器下打开test.html,点击start 开始监听


WEB页获取串口数据的更多相关文章
- [转]WEB页获取串口数据
本文转自:https://www.cnblogs.com/rockyhm/p/3434200.html 最近做一个B/S的项目,需要读取电子秤的值,之前一直没做过,也没有经验,于是在网上找到很多 大 ...
- 通过Places API Web Service获取兴趣点数据
实验将爬取新加坡地区的银行POI数据 数据库采用mongodb,请自行安装,同时申请google的key 直接上代码 #coding=utf-8 import urllib import json i ...
- Activex在没有电子秤api的情况下获取串口数据
大二做B/S架构的项目使用了安衡电子秤CHS-D+R和一款扫码枪,两个设备的串口使用一样,这款电子秤是相当的坑,没有开发的api,无奈只能自己开发Activex了,在B/S架构中进行引用Activex ...
- pyhton 从web获取json数据 保存到本地然后再读取
从web中获取json数据直接进行处理总认为太慢.主要是从web中获取获取数据的过程有点慢. 所以就在想 假设先利用空暇时间把json数据获取并保存到本地,然后再从本地文件里读取和操作.应该就要快非常 ...
- iOS开发网络篇之Web Service和XML数据解析
郝萌主倾心贡献,尊重作者的劳动成果,请勿转载. 假设文章对您有所帮助,欢迎给作者捐赠,支持郝萌主.捐赠数额任意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 游戏官方下 ...
- Xamarin.Android 调用Web Api(通过ListView展示远程获取的数据)
xamarin.android如何调用sqlserver 数据库呢(或者其他的),很多新手都会有这个疑问.xamarin.android调用远程数据主要有两种方式: 在Android中保存数据或调用数 ...
- Android学习笔记_12_网络通信之从web获取资源数据到Android
从web获取图片信息,并显示到android的imageView控件. 一.添加网络访问权限. <uses-permission android:name="android.permi ...
- SpringBoot web获取请求数据【转】
SpringBoot web获取请求数据 一个网站最基本的功能就是匹配请求,获取请求数据,处理请求(业务处理),请求响应,我们今天来看SpringBoot中怎么获取请求数据. 文章包含的内容如下: 获 ...
- jQuery Ajax使用FormData上传文件和其他数据,后端web.py获取
参考博文: 通过jQuery Ajax使用FormData对象上传文件 方法一:使用<form>表单初始化FormData对象方式上传文件 前端(JQuery): <form enc ...
随机推荐
- Maven学习 五 Maven项目创建(1)jar项目
第一步:Maven项目的创建 File->new->Maven project. 点击下一步 上方的两个多选框选上,第一个是不使用archetype 原型模板,第二个是使用默认工作空间 点 ...
- java web+模板
这次测试需要在java web的基础上套入模板,在测试的过程中我遇到了许多问题,现在我可以使用模板来美化网页的许多格式.但是模板的许多代码我还是看不懂,其中有jquery的许多代码.在今后我会学习相关 ...
- 差分模版题(需理解才明白)AT2442 フェーン現象 (Foehn Phenomena)
https://www.luogu.org/problemnew/show/AT2442 #include <bits/stdc++.h> #define read read() #def ...
- java框架学习_mybaties
Mybatis第一天 框架课程 1. 课程计划 第一天: 1.Mybatis的介绍 2.Mybatis的入门 a) 使用jdbc操作数据库存在的问题 b) Mybatis的架构 c) Mybati ...
- python之路(六)-函数相关
在没有学习函数之前我们的程序是面向过程的,不停的判断,不停的循环,同样的代码重复出现在我们的代码里.函数可以更好的提高我们的 代码质量,避免同样的代码重复出现,而只需要在用的时候调用函数即可执行.此为 ...
- 24.HashSet
在前篇博文(HashMap)中详细讲解了HashMap的实现过程,对于HashSet而言,它是基于HashMap来实现的,底层采用HashMap来保存元素.所以如果对HashMap比较熟悉,那么Has ...
- socketserver实现FTP
功能: 1.用户加密认证 2.允许同时多用户登录 3.每个用户有自己的家目录 ,且只能访问自己的家目录 4.对用户进行磁盘配额,每个用户的可用空间不同 5.允许用户在ftp server上随意切换目录 ...
- Awake()跟Start()差在哪?
刚开始学Unity的时候,最难搞定的就是这两个functions的差异,依照官方文件所描述的: Awake(): Awake is called when the script instance is ...
- ESB结合门户Portlet实现数据分析
1 背景概述 笔者在公司做集成项目时,通常会涉及ESB与Portal结合实现图表数据分析功能.通过ESB获取数据库信息,然后在门户上采用Portlet接收ESB中的数据URL最后展现到门户上.本文为项 ...
- 记web模拟手机环境已经微信开发者工具中可正常运行,实体机运行报错问题
问题描述: 有个手机微信OA的项目 用户信息采用cookie方式保存.发布后使用chorme浏览器进行模拟访问测试发现一切运行顺畅,使用微信开发者工具进行测试也一切正常. 采用实体机进行测试时,用微信 ...