0

我正在尝试编写 Windows 服务以通过 COM 端口从设备获取价值。首先我编写winform应用程序。它工作正常。在我切换到服务应用程序之后。我做了什么:获取我的 COM 设备及其连接参数的列表;然后使用创建实例 COM 端口类的方法为每个设备启动常规线程,该类将所有端口需求封装为参数、SerialDataReceivedEventHandler 和用于写入 DB 的实例。问题是:在服务中没有触发此事件,但在 winform 应用程序中我使用相同的组合 - 它工作得很好。

        void CreateScaleConn(ManualResetEventSlim mre, DataControl.Scale scaleItem)
    {
        CommunicationManager CommMan = new CommunicationManager(scaleItem.baudRate, scaleItem.parity, scaleItem.stopBits, scaleItem.dataBits, scaleItem.portName, DataCtrl.ScaleList.IndexOf(scaleItem));
        CommMan.CurrentTransmissionType = CommunicationManager.TransmissionType.Text;
        CommMan.OpenPort(DataCtrl.ConnStr, DataCtrl.InsCmd);
        if (!ExecutionAllowed) mre.Set();
    }


    protected override void OnStart(string[] args)
    {            
        string loadResDB, loadResDev;
        DataCtrl.LoadDBConf(out loadResDB);
        DataCtrl.LoadDevList(out loadResDev);
        AddLog("DB config load result is" + loadResDB);
        AddLog("Device config load result is" + loadResDev);            
        if (DataCtrl.ConnStr != null && DataCtrl.InsCmd != null)
        {                
            AddLog("CAS service Started");               
            foreach (DataControl.Scale scale in DataCtrl.ScaleList)
            {
                Thread scaleThread = new Thread(() => CreateScaleConn(mreS, scale));
                scaleThread.Name = "thr_" + scale.name;
                ThrArr.Add(scaleThread);
                AddLog("CAS service is started");                    
                scaleThread.Start();                    
            }
            mreS.WaitHandle.WaitOne();            
        }           
    }

我的端口通信课程看起来:

       public CommunicationManager(string baud, string par, string sBits, string dBits, string name, int scaleIndex)
    {
        _baudRate = baud;
        _parity = par;
        _stopBits = sBits;
        _dataBits = dBits;
        _portName = name;
        _scaleIndex = scaleIndex;     

        comPort.DataReceived += new SerialDataReceivedEventHandler(comPort_DataReceived);
    }


public bool OpenPort(string cStr, string insCmd)
    {
        try
        {                
            string DbConnState;                
            if (cStr != null & insCmd != null) DBCtrl.CreateConnToDB(cStr, insCmd, out DbConnState);
            if (comPort.IsOpen == true) comPort.Close();
            comPort.BaudRate = int.Parse(_baudRate);    //BaudRate
            comPort.DataBits = int.Parse(_dataBits);    //DataBits
            comPort.StopBits = (StopBits)Enum.Parse(typeof(StopBits), _stopBits);    //StopBits
            comPort.Parity = (Parity)Enum.Parse(typeof(Parity), _parity);    //Parity
            comPort.PortName = _portName;   //PortName
            comPort.Open();               
        }
        catch (Exception ex)
        {
           ...
        }
    }


void comPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {           
        switch (CurrentTransmissionType)
        ...
                string msg = comPort.ReadExisting();  
                DisplayData(MessageType.Incoming, msg );...
    }
4

0 回答 0