当前位置:编程学习 > C#/ASP.NET >>

如何客户端通过WebService调用服务器端电表串口返回电表读数.

项目需求:
客户端程序通过WebService调用服务器上写好的读数电表读数的服务:如下

  public string GetAmmeterAm(string amNo)
        {
            return new AmmeterOperator().GetAmService(amNo);          
        }

AmmeterOperator类是服务器端端的电表的串口操作类

  //数据发送
        public  string GetAmService(string meterNo)
        {
            string comName = SerialPort.GetPortNames()[0];
            comm = new SerialPort(comName, 1200, Parity.Even, 8, StopBits.One);
            comm.NewLine = "\r\n";
            comm.RtsEnable = true;//根据实际情况吧。
            //获取或设置 DataReceived 事件发生前内部输入缓冲区中的字节数(这个设置很重要)
            comm.ReceivedBytesThreshold = 17;

            //添加事件注册
            comm.DataReceived += new SerialDataReceivedEventHandler(comm_DataReceived);
            //timer1.Start();
            //che
            //string meterNo = "000801386009";
            //string meterNo = this.textBox1.Text.Trim();
            if (!comm.IsOpen)
            {
                comm.Open();
            }

            string strMeterNo = "68" + GetMeterNo(meterNo) + "68";          //表号
                     int n = sendByte.Count();
            comm.Write(sendByte, 0, sendByte.Count());
            return am;
        }
    //数据接收
        void comm_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {

            //获取接收缓冲区域的字节数
            int n = comm.BytesToRead;//先记录下来,避免某种原因,人为的原因,操作几次之间时间长,缓存不一致          
            byte[] buf = new byte[n];//声明一个临时数组存储当前来的串口数据
            received_count += n;//增加接收计数
            comm.Read(buf, 0, n);//读取缓冲数据          
            //因为要访问ui资源,所以需要使用invoke方式同步ui。
            string ReceivedStr = new ConvertClass().GetHexStrFromByte(buf);
            if (ReceivedStr.Substring(0, 2) == "FE" || ReceivedStr.Substring(0, 2) == "68")
            {
                //分析字符串
                string strMeterNo = ReceivedStr.Substring(ReceivedStr.IndexOf("68") + 2, 12);
                //电表
                //lblMeterNo.Text = GetMeterNo(strMeterNo);
                am = GetAm(ReceivedStr);            
                           }
            else
            {
                //丢弃来自串行驱动程序的接收缓冲区的数据
                comm.DiscardInBuffer();
            }

        }
       

经过测试,不通过服务调用的方式,一点都没问题。但是如果是服务的方式,由于GetAmService方法中的 

 comm.Write(sendByte, 0, sendByte.Count());
            return am;


就立即返回了am读数(但还是初始值),而真正的电表读数是在GetAmService方法执行完了,才调用comm_DataReceived(object sender, SerialDataReceivedEventArgs e),才会得到真正的电表读数,如何让GetAmService中 return am;

滞后于comm_DataReceived(object sender, SerialDataReceivedEventArgs e)的执行?
comm_DataReceived(object sender, SerialDataReceivedEventArgs e)的触发呢?
--------------------编程问答-------------------- 平台调用不行吗.
没太懂楼主意思.
--------------------编程问答-------------------- 这种写成WebService? --------------------编程问答-------------------- 可以写两个方法,一个打开端口,另一个返回读取的值 --------------------编程问答--------------------
眼拙。。。

你 return am;是从哪里来的啊。。 --------------------编程问答--------------------
引用 4 楼 porschev 的回复:
眼拙。。。

你 return am;是从哪里来的啊。。

am是事先定义好的全局变量(这里没有把全部代码贴出来)
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,