SerialPort访问COM接口获取电子秤数据(C#)

 using System;
using System.IO.Ports;
using System.Text;
using System.Threading;

namespace weight
{
    /// <summary>
    /// 电子秤接口信息类,封装COM口数据
    /// </summary>
    public class WeightInformation
    {
        string _wdata;
        string _wunit;
        string _qdata;
        string _qunit;
        string _percentage;

        /// <summary>
        /// 获取或设置重量
        /// </summary>
        public string WData { get { return this._wdata; } set { this._wdata = value; } }
        /// <summary>
        /// 获取或设置重量单位
        /// </summary>
        public string WUnit { get { return this._wunit; } set { this._wunit = value; } }
        /// <summary>
        /// 获取或设置数量
        /// </summary>
        public string QData { get { return this._qdata; } set { this._qdata = value; } }
        /// <summary>
        /// 获取或设置数量单位
        /// </summary>
        public string QUnit { get { return this._qunit; } set { this._qunit = value; } }
        /// <summary>
        /// 获取或设置百分数
        /// </summary>
        public string Percentage { get { return this._percentage; } set { this._percentage = value; } }
    }

    /// <summary>
    /// 电子称数据读取类
    /// </summary>
    public class WeightReader : IDisposable
    {
        #region 字段、属性与构造函数
        SerialPort sp;
        int _speed = 300;

        /// <summary>
        /// 获取或设置电脑取COM数据缓冲时间,单位毫秒
        /// </summary>
        public int Speed
        {
            get
            {
                return this._speed;
            }
            set
            {
                if (value < 300)
                    throw new Exception("串口读取缓冲时间不能小于300毫秒!");
                this._speed = value;
            }
        }

        public bool InitCom(string PortName)
        {
            return this.InitCom(PortName, 4800, 300);
        }

        /// <summary>
        /// 初始化串口
        /// </summary>
        /// <param name="PortName">数据传输端口</param>
        /// <param name="BaudRate">波特率</param>
        /// <param name="Speed">串口读数缓冲时间</param>
        /// <returns></returns>
        public bool InitCom(string PortName, int BaudRate,int Speed)
        {
            try
            {
                sp = new SerialPort(PortName, BaudRate, Parity.None, 8);
                sp.ReceivedBytesThreshold = 10;
                sp.Handshake = Handshake.RequestToSend;
                sp.Parity = Parity.None;
                sp.ReadTimeout = 600;
                sp.WriteTimeout = 600;
                this.Speed = Speed;
                if (!sp.IsOpen)
                {
                    sp.Open();
                }
                return true;
            }
            catch
            {
                throw new Exception(string.Format("无法初始化串口{0}!",PortName));
            }
        }

        #endregion

        #region 串口数据读取方法
        public WeightInformation ReadInfo()
        {
            string src = this.ReadCom();
            WeightInformation info = new WeightInformation();
            info.WData = this.DecodeWeightData(src);
            info.WUnit = this.DecodeWeightUnit(src);
            info.Percentage = this.DecodePercentage(src);
            info.QData = this.DecodeQualityData(src);
            info.QUnit = this.DecodeQualityUnit(src);

            return info;
        }
        /// <summary>
        /// 将COM口缓存数据全部读取
        /// </summary>
        /// <returns></returns>
        private string ReadCom()//返回信息
        {
            if (this.sp.IsOpen)
            {
                Thread.Sleep(this._speed);
                string res = "";
                //for (int i = 0; i < 5; i++)
                //{
                byte[] buffer = new byte[sp.BytesToRead];
                sp.Read(buffer, 0, buffer.Length);

                res = System.Text.Encoding.ASCII.GetString(buffer);
                //if (res != "")
                //    break;
                //}
                if (res == "")
                {
                    throw new Exception("串口读取数据为空,参数设置是否正确!");
                }
                return res;
            }
            return "";
        }
        #endregion

        #region  基本取数方法

        /// <summary>
        /// 从字符串中取值
        /// </summary>
        /// <param name="head">起始字符串</param>
        /// <param name="intervalLen">间隔位长度</param>
        /// <param name="valueLen">值长度</param>
        /// <param name="src">源字符串</param>
        /// <returns></returns>
        private string DecodeValue(string head, int intervalLen, int valueLen,string src)
        {
            int index = src.IndexOf(head);
            return src.Substring(index + intervalLen, valueLen);
        }
        /// <summary>
        /// 取重量
        /// </summary>
        /// <param name="srcString">源字符串</param>
        /// <returns></returns>
        private string DecodeWeightData(string srcString)
        {
            return this.DecodeValue("GS,", 3, 8,srcString);
        }
        /// <summary>
        /// 取重量单位
        /// </summary>
        /// <param name="srcString">源字符串</param>
        /// <returns></returns>
        private string DecodeWeightUnit(string srcString)
        {
            return this.DecodeValue("GS,", 12, 2, srcString);
        }
        /// <summary>
        /// 取百分数
        /// </summary>
        /// <param name="srcString">源字符串</param>
        /// <returns></returns>
        private string DecodePercentage(string srcString)
        {
            return this.DecodeValue("U.W.", 4, 14, srcString);
        }
        /// <summary>
        /// 取数量
        /// </summary>
        /// <param name="srcString">源字符串</param>
        /// <returns></returns>
        private string DecodeQualityData(string srcString)
        {
            return this.DecodeValue("PCS", 3, 9, srcString);           
        }
       
        /// <summary>
        /// 取数量单位
        /// </summary>
        /// <param name="srcString">源字符串</param>
        /// <returns></returns>
        private string DecodeQualityUnit(string srcString)
        {
            return this.DecodeValue("PCS", 12, 3, srcString);           
        }
        #endregion

        #region 释放所有资源
        public void Dispose()
        {
            if (sp != null && sp.IsOpen)
            {
                sp.Close();
            }
        }
        #endregion
    }
}

  • 1
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
可以使用PHP调用C#编写的SerialPort程序来访问COM接口获取电子数据。以下是实现步骤: 1.编写C#SerialPort程序,打开COM接口并监听串口数据,当接收到数据时,将数据返回给PHP。 2.在PHP中调用C#程序,使用exec函数或者shell_exec函数执行C#程序,并传递需要的参数。 3.C#程序将获取数据返回给PHP,PHP可以对数据进行处理并输出到页面上。 示例代码如下: C#代码: ```csharp using System; using System.IO.Ports; namespace SerialPortDemo { class Program { static void Main(string[] args) { SerialPort sp = new SerialPort(); sp.PortName = "COM1"; //设置串口号 sp.BaudRate = 9600; //设置波特率 sp.DataBits = 8; //设置数据位 sp.Parity = Parity.None; //设置校验位 sp.StopBits = StopBits.One; //设置停止位 sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived); //注册数据接收事件 sp.Open(); //打开串口 Console.ReadLine(); } static void sp_DataReceived(object sender, SerialDataReceivedEventArgs e) { SerialPort sp = (SerialPort)sender; string data = sp.ReadExisting(); //读取串口数据 Console.WriteLine(data); } } } ``` PHP代码: ```php <?php $port = "COM1"; //设置串口号 $baud_rate = 9600; //设置波特率 $cmd = "SerialPortDemo.exe $port $baud_rate"; //设置执行命令 $data = shell_exec($cmd); //执行命令并获取返回值 echo $data; //输出数据 ?> ``` 注意:需要安装.NET Framework和PHP COM扩展。同时,C#程序需要编译为可执行文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值