如何客户端通过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;是从哪里来的啊。。 --------------------编程问答--------------------
am是事先定义好的全局变量(这里没有把全部代码贴出来)
补充:.NET技术 , C#