我有一个Windows服务,用于侦听来自GSM调制解调器的传入文本的COM端口,然后将该消息插入SQL数据库。
我告诉我的服务部门在我的服务器上记录文本文件的任何异常,显然它一直在抛出一个异常,说明所请求的资源正在使用中。
我认为这与COM端口有关,但是,我无法看到我出错的地方,并且我想了解如何释放COM端口并启用我的代码正常运行,我的代码如下,任何和所有帮助将不胜感激。
我使用名为GSMComm的第三方库来实现这一目标。
private SmsServer server;
private string appDataDirectory;
private string logFilePath;
GsmCommMain Comm = new GsmCommMain("COM7",9600,300);
GsmPhone GSM = new GsmPhone("COM7", 115200, 30000);
private void SMSGetter()
{
Log("Getter Fired");
//var message = GSM.ReadMessage(4);
//GSM.ReadMessage(4);
//TcpClientChannel client = new TcpClientChannel();
//ChannelServices.RegisterChannel(client, false);
//string url = "192.168.100.67:2000";
//ISmsSender smssender = (ISmsSender)Activator.GetObject(typeof(ISmsSender), url);
try
{
if (GSM.IsOpen()==false && Comm.IsOpen()==false)
{
GSM.Open();
Comm.Open();
DecodedShortMessage[] messages = Comm.ReadMessages(PhoneMessageStatus.All, PhoneStorageType.Sim);
SqlConnection Conn = new SqlConnection("Data Source=tcp:crusader,49172;Initial Catalog=HermesSMS;User ID=admin;Password=w");
SqlCommand com = new SqlCommand();
com.Connection = Conn;
Conn.Open();
com.CommandText = ("INSERT INTO SMSArchives(ID,Message,Blacklist) VALUES ('" + messages + "', 'Yes')");
com.ExecuteNonQuery();
Conn.Close();
GSM.Close();
Comm.Close();
return;
}
else if (GSM.IsOpen()==true && Comm.IsOpen()==true)
{
DecodedShortMessage[] messages = Comm.ReadMessages(PhoneMessageStatus.All, PhoneStorageType.Sim);
SqlConnection Conn = new SqlConnection("Data Source=tcp:crusader,49172;Initial Catalog=HermesSMS;User ID=admin;Password=w");
SqlCommand com = new SqlCommand();
com.Connection = Conn;
Conn.Open();
com.CommandText = ("INSERT INTO SMSArchives(ID,Message,Blacklist) VALUES ('" + messages + "', 'Yes')");
com.ExecuteNonQuery();
Conn.Close();
GSM.Close();
return;
}
}
}
答案 0 :(得分:1)
代码尝试两次打开COM7。
答案 1 :(得分:1)
通常,您无法在共享模式下打开COM端口,因此无法打开COM7两次,这就是异常的原因。
即使出于某种原因,您可以使用两个手柄打开相同的COM端口,但您指定了两个波特率,这意味着一个流或另一个流将显示为您的服务损坏。
您需要选择一个或另一个并通过单个管道流式传输所有数据。我不知道您的系统是如何工作的,但您需要阅读文档或联系供应商以了解您应该如何获取数据。
可能的解决方法是简单地从代码中删除所有GSM.xxx()调用 - 看起来您只是打开和关闭该资源,但它从未在您的代码中用于获取任何数据。