我正在尝试编写 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 );...
}