RashmitaS Ответов: 1

"Прием ответа неполон" при отправке и получении сообщения с использованием at-команд


Уважаемый Эксперт,

Я разрабатываю SMS-приложение для отправки и приема сообщений с помощью GSM-модема. Я использую код на этом сайте "отправка и получение SMS с помощью команды AT".

Я могу успешно отправлять и получать SMS с помощью GSM-модема с кодом в этом проекте. Когда я выполняю код в первый раз, он работает отлично (отправить несколько sms). но позже он показывает, что "полученный ответ неполон".!! почему это происходит? Пожалуйста, помогите мне как можно скорее. Я полагаю, что кто-то столкнулся с той же проблемой, пожалуйста, помогите, если есть какие-то идеи.

Что я уже пробовал:

public void CallReadSMS()
{
пробовать
{
// подсчет SMS
int uCountSMS = CountSMSmessages(this. port);

# команда региона
string strCommand = "AT+CMGL=\" ALL\"";

#endregion

#регион считывает SMS и записывает все SMS в порт в текстовый файл
//.............................................. Читайте все СМС ....................................................

objShortMessageCollection = ReadSMS(this. port, strCommand);

строка sPathName = @ " SMSapplicationReadMsgs";

Модулю записи StreamWriter ео = нуль;
sw = new StreamWriter(sPathName +". txt", false);



foreach (ShortMessage msg в objShortMessageCollection)
{
ув.Метода WriteLine(сообщ.Индекс + "|" + МСГ.Отправлено + " / "+ msg. отправитель + " | " + msg. сообщение);

Журнал(сообщ.Индекс + "|" + МСГ.Отправлено + "|" + МСГ.Отправитель + "|");

}


если (ключ != нуль)
{
ув.Флеш();
ув.Распоряжаться();
ув.Рядом();
}


#endregion

}
поймать(исключение бывший)
{
Журнал(исх.Сообщение);
}
}



ReadSMS публичных ShortMessageCollection(порт, последовательный порт, строку p_strCommand)
{
// Настройка телефона и чтение сообщений
Shortmessagecollection messages = null;
пробовать
{
#регион выполнить команду


ExecCommand(порт, "AT", 3000, " телефон не подключен");


ExecCommand (port," AT+CMGF=1", 3000, " не удалось установить формат сообщения.");


ExecCommand (port, "AT+CPMS=\" SM\"", 3000, " не удалось выбрать хранилище сообщений.");

// Читать сообщения
string input = ExecCommand(port, p_strCommand, 5000, " не удалось прочитать сообщения.");

#endregion

#распарсить сообщения области
сообщения = ParseMessages(ввод);
#endregion
}
поймать (исключение бывший)
{
бросок экс;
}
if (messages != null)
возвращаемое сообщение;
ещё
возвращать null;
}

public ShortMessageCollection ParseMessages(строковый ввод)
{
Сообщения ShortMessageCollection = новая коллекция ShortMessageCollection();
пробовать
{

Регулярное выражение Р = новое регулярное выражение(@"\+CMGL: (\д+),""(.+)"",""(.+)"",(.*),""(.+)""\р\н(.+)\р\н");


вход = система.Текст.RegularExpressions.Регулярное выражение.Заменить(вход, @"\р\р\н+", "");


Совпадение m = r. совпадение(вход);
в то время как (м. Успех)
{
ShortMessage msg = новый ShortMessage();

глутамат натрия.Индекс = m. группы[1]. Значение;
сообщение.Статус = м.Группы[2].Значение;
сообщение.Отправитель = м.Группы[3].Значение;
глутамат натрия.Алфавит = m. группы[4]. Значение;
глутамат натрия.Sent = m. Groups[5]. Value;
сообщение.Сообщение = м.Группы[6].Значение;
сообщения.Добавить (msg);

м = м.NextMatch();
}

}
поймать (исключение бывший)
{
бросок экс;
}
возвращаемое сообщение;
}


общественного строка-кадр execcommand(последовательный порт-Порт, строку команды, инт responseTimeout, строковое сообщение об ошибке)
{
пробовать
{

порт.DiscardOutBuffer();
порт.DiscardInBuffer();

receiveNow.Сброс();


порт.Запись (команда + " \r");


строковый ввод = ReadResponse(порт, responseTimeout);
если ((вход.Длина == 0) | | ((! вход.&Ампер метода endswith("\г\п> "));&ампер; (!ввода.Метода endswith("\Р\НОК\р\н"))))
throw new ApplicationException("сообщение об успехе не получено.");
обратный вход;
}
поймать (исключение бывший)
{
бросок экс;
}
}

общественного строка ReadResponse(порт, последовательный порт, инт тайм-аут)
{
string buffer = строка.Пустой;
пробовать
{
делать
{
если (receiveNow.WaitOne(тайм-аут, ложь))
{
строка t = port. ReadExisting();
буфер += t;
}
ещё
{

если (буфер.Длина > 0)
throw new ApplicationException ("полученный ответ неполон.");
ещё
throw new ApplicationException ("нет данных, полученных с телефона.");


}
}
в то время как (! буфер.("\Р\НОК\р\н") &ампер метода endswith;&усилителя; !буфер.EndsWith ("\r\n>") && !буфер.Метода endswith("\Р\пошибка\р\н"));
}
поймать (исключение бывший)
{
бросок экс;
}
обратный буфер;
}



public bool CallSendSMS(string PhoneNo, string Message)
{
это типа bool = ложь;
пробовать
{

if (sendMsg(this. port, PhoneNo, Message))
это = правда;
else if (!sendMsg(this. port, PhoneNo, Message))
это = ложь;
вернуть это;

}

поймать (исключение бывший)
{

Журнал(исх.Сообщение);
вернуть это;

}

}


sendMsg общественная bool(порт, последовательный порт, PhoneNo строку, строку сообщения)
{
это типа bool = ложь;
пробовать
{
строка recievedData = ExecCommand(порт, "AT", 2000, " телефон не подключен");


recievedData = ExecCommand (port, "AT+CMGF=1", 2000, " не удалось установить формат сообщения.");

Строковая команда = " AT+CMGS=\"" + PhoneNo + "\"";
recievedData = ExecCommand(порт, команда, 4000, " не удалось принять phoneNo");

команда = сообщение + символ.ConvertFromUtf32 (26) + " \r";
recievedData = ExecCommand(порт, команда, 4000, "не удалось отправить сообщение"); / / уменьшено до 4 секунд


если (recievedData.Метода endswith("\Р\НОК\р\н"))
{
это = правда;
}
еще если (recievedData.содержать ошибки"))
{
это = ложь;
}
ещё
{
это = правда;
}
вернуть это;
}
поймать (исключение бывший)
{
бросок экс;
}

}

1 Ответов

Рейтинг:
0

Richard MacCutchan

Пожалуйста, оставьте свой вопрос на форуме в конце статьи.


RashmitaS

Я уже разместил этот вопрос на форуме статьи. Но ответа нет. Итак, я разместил его здесь.