"Прием ответа неполон" при отправке и получении сообщения с использованием 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.содержать ошибки"))
{
это = ложь;
}
ещё
{
это = правда;
}
вернуть это;
}
поймать (исключение бывший)
{
бросок экс;
}
}