WEB页获取串口数据

最近做一个B/S的项目,需要读取电子秤的值,之前一直没做过,也没有经验,于是在网上找到很多  大致分两种

  1. 使用ActiveX控件,JS调用MSCOMM32.dll的串口控件对串口进行控制
  2. 使用C#语言的控件对串口进行控制,然后使用JS+AJAX与C#进行交互获得串口数据

详情见  使用JS获得串口数据 http://blog.csdn.net/xuing/article/details/6688306    但是小弟用这两种办法都获取到数据

串口配置如下:

1                  serialPort1.PortName = "COM1";          //端口名称
2             serialPort1.BaudRate = 1200;            //波特率
3             serialPort1.Parity = Parity.None;       //奇偶效验
4             serialPort1.StopBits = StopBits.One;    //效验
5             serialPort1.DataBits = 8;               //每个字节的数据位长度

 

最后换种思路:使用C#写一个ActiveX控件(吉日老师提醒)最后嵌入网页中读取数据   如下:

  1. 第一步:新建项目,如下图,选择windows下的类库项目。
  2. 在项目中添加一个类:IObjectSafety.cs 
  3. 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);
        }
    }
    复制代码

     

  4. 添加一个用户控件 MyActiveXControl.cs 
  5. 修改 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 = 1;
                 pdwEnabledOptions = 2;
             }
    
            public void SetInterfaceSafetyOptions(int riid, int dwOptionsSetMask, int dwEnabledOptions)
             {
                 throw new NotImplementedException();
             }
             #endregion
         }
     }
    复制代码

    至此   Active控件制作完毕      下面我们添加文本框、按钮、SerialPort、Timer控件进行测试                                     

  6. 添加响应的事件代码如下
    复制代码
    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 = 1;
                pdwEnabledOptions = 2;
            }
    
            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 = 1200;            //波特率
                serialPort1.Parity = Parity.None;       //奇偶效验
                serialPort1.StopBits = StopBits.One;    //效验
                serialPort1.DataBits = 8;               //每个字节的数据位长度
            }
            /// <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 > 5)
                {
    
                    string strTemp = serialPort1.ReadExisting();//读取串口
                    double weight = -1;//获取到的重量
                    foreach (string str in strTemp.Split('='))//获取稳定的值
                    {
                        double flog = 0;
                        //数据是否正常
                        if(double.TryParse(str, out flog)&&str.IndexOf('.')>0&&str[str.Length-1]!='.')
                        {
                            //数据转换   串口获取到的数据是倒叙的  因此进行反转
                            char[] charArray = str.ToCharArray();
                            Array.Reverse(charArray);
                            string left = new string(charArray).Split('.')[0];
                            string right = new string(charArray).Split('.')[1];
                            if (right.Length==2)
                            {
                                weight = int.Parse(left) + int.Parse(right) / 100.0;
                            }
                        }
                    }
                    if(weight>=0)
                    {
                        //在拥有控件的基础窗口句柄的线程上,用指定的参数列表执行指定委托。                    
                        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)(27) + 'p';
                    send = serialPort1.ReadExisting();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                    button2_Click(null, null);
                }
            }
        }
    }
    复制代码


     

  7. 至此读取串口数据的Active控件制作完毕   下面我们来制作一个安装包,新建一个安装项目
  8. 在安装项目的文件系统中添加刚才之前我们制作的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="320"
         height="240"
         codebase="Setup1.msi">
 </object>
 </div>
 </body>
 </html>
复制代码

在IE浏览器下打开test.html,点击start     开始监听

 

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要通过Web应用程序访问和读取串口列表,你可以采用以下步骤: 1. 首先,你可以使用JavaScript编写一个前端脚本,通过调用mscomm32对象的方法来实现读取串口列表的功能。在前端脚本中,你可以使用XMLHttpRequest对象或Fetch API与服务器进行通信。 2. 在服务器端,你可以使用编程语言,如Python或Node.js来处理前端请求。根据你选择的编程语言,你可以使用相应的库或模块来读取串口列表。 3. 在服务器端,你可以编写一个处理器函数,用于接收前端请求并执行读取串口列表的操作。根据你选择的编程语言,这个处理器函数可以使用不同的方法来读取串口列表。例如,在Python中,你可以使用pySerial库来读取串口列表;在Node.js中,你可以使用serialport模块来读取串口列表。 4. 在处理器函数中,你可以调用mscomm32对象的相应方法,如getPort()来读取串口列表。将读取到的串口列表返回给前端脚本。 5. 在前端脚本中,你可以通过XMLHttpRequest对象或Fetch API接收到服务器返回的串口列表,并进行相应的处理和展示。 通过以上步骤,你就可以实现一个Web应用程序来读取串口列表。需要注意的是,mscomm32对象可能只在Windows操作系统上可用,因此你需要在部署该应用程序时确认目标服务器的操作系统是否支持mscomm32对象。 ### 回答2: 为了在Web上读取串口列表,我们可以使用JavaScript来实现。由于Web浏览器的安全限制,我们无法直接访问用户计算机上的串口,但是我们可以通过与本地应用程序进行通信来实现。 首先,我们需要在本地创建一个能够读取串口列表的应用程序。可以使用C或C++等编程语言来实现。通过使用串口通讯库如mscomm32等,我们可以轻松获取到可用的串口列表。 接下来,在Web面上使用JavaScript创建一个WebSocket连接,与本地应用程序进行通信。WebSocket是一种在Web浏览器和服务器之间进行双向通信的技术,我们可以使用它与本地应用程序进行数据交换。 当WebSocket连接建立后,我们可以向本地应用程序发送一个请求,请求获取串口列表的信息。本地应用程序接收到请求后,将串口列表信息通过WebSocket发送到Web面。 在Web面上,我们可以使用JavaScript接收到来自本地应用程序的串口列表信息,并将其显示在网上。我们可以使用HTML和CSS来创建一个用户界面,以呈现串口列表。 需要注意的是,由于Web浏览器的安全策略,我们不能直接访问用户计算机上的串口。该方法只能在用户在Web面上授权的情况下才能运行。 总结起来,要在Web上读取串口列表,我们需要使用本地应用程序作为中间人,并通过WebSocket与Web面进行通信,从而获取串口列表的信息,并在Web面上进行展示。 ### 回答3: 在Web环境下,使用mscomm32读取串口列表是不可行的。mscomm32是一个ActiveX控件,只能在桌面应用程序中使用,无法在Web环境中使用。 在Web环境中,可以使用HTML5提供的Web Serial API来读取串口列表。Web Serial API允许Web应用程序与串口设备进行通信。 要使用Web Serial API读取串口列表,首先需要在面中请求获取串口访问权限。可以使用以下代码来请求访问权限: ```javascript navigator.serial.requestPort().then(port => { // 获取串口访问权限后的处理逻辑 console.log(port); }).catch(error => { // 请求串口访问权限失败的处理逻辑 console.error(error); }); ``` 当用户确认授权后,`requestPort()`方法将返回一个代表串口的`SerialPort`对象,其中包含了串口的详细信息。你可以在控制台中查看这些信息。 请注意,由于Web Serial API是HTML5的一部分,支持程度可能因浏览器而异。在某些浏览器中,可能需要在面中启用开发者模式或设置特定的标志才能使用Web Serial API。 总之,在Web环境中,我们需要使用HTML5的Web Serial API而不是mscomm32来读取串口列表。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值