Решение, которое сработало для меня, заключается в следующем: 1: используйте try catch block и поместите в него весь код открытия и закрытия порта.
2: Используйте функцию IsOpen (), чтобы проверить, является ли портуже открыт или нет.
3: Если возникает какое-либо исключение (доступ запрещен), напишите код Port.Close () в блоке перехвата, чтобы освободить этот порт.
4: Сделать объектпоследовательного порта перед попыткой перехватить блок, чтобы сделать его универсальным.
5: вызов Open () не должен быть внутри цикла.Вы должны открыть порт только один раз, а после цикла вы должны закрыть его.
Если вы выполните все эти шаги, вы никогда больше не столкнетесь с этой проблемой.
Пример кода приведен ниже:
GsmCommMain comm = new GsmCommMain(COMPort.ToString(), 9600, 500);
try{ for (int i = 0; i < dtObj.Rows.Count; i++)
{
if (dtObj.Rows[i]["smsNumber"] != null)
{
if (dtObj.Rows[i]["smsNumber"].ToString() != "")
{
if (dtObj.Rows[i]["status"].ToString() != "Sent")
{
Thread.Sleep(Convert.ToInt32("50000"));
string txtMessage = dtObj.Rows[i]["sms"].ToString();
string txtDestinationNumbers = dtObj.Rows[i]["smsNumber"].ToString();
bool unicode = true;
SmsSubmitPdu[] pdu = SmartMessageFactory.CreateConcatTextMessage(txtMessage, unicode, txtDestinationNumbers);
comm.SendMessages(pdu);
obj_bal_ForAll.bal_forAll_Delete("tbl_SMS", "smsId", dtObj.Rows[i]["smsId"].ToString());
}
}
}
}
if (comm.IsOpen())
{
comm.Close();
}
}catch(Exception ex){if (comm.IsOpen()){comm.Close();}}