Отправлено.
» Работа с GSM телефоном
Получил. Спасибо большое ,буду разбираться. Посмотрим что получится из всего этого.
775: отправь мне тоже пожалуста.
Не могу разобраться с русским в примере. Не отсылает на русском и все тут.
spoliator, отправь плиз прогу 775`a. моя почта level2003@list.ru
Отправил. Лови. Если получится с русским разобраться напиши.
Подскажите как правильно сформировать текстовую строку для отправки ?
Пересылает хрень какую то...
Пересылает хрень какую то...
spoliator
Цитата:
Цитата:
Подскажите как правильно сформировать текстовую строку для отправки ?char s[] = "правильная текстовая строка\n"
Спасибо.
spoliator, отправь плиз прогу 775`a. моя почта KhSlv@yandex.ru
KhSlv
Отправлена. Попробуй может чего получится....
Отправлена. Попробуй может чего получится....
и мне, пожалуйста, вышли.
ashuba @ yandex.ru
ashuba @ yandex.ru
tolyusha
Отправлено
Добавлено:
Народ ! Пишите в ПМ ! Иначе Nep нас изнахрючит. И вообще то лучше обращайтесь к владельцу исходника.
Или на Рапиду залью ?
Исходник не отправляет СМС на русском но как пример очень даже нормально.
http://www.torry.net/pages.php?id=205
SMSModule
Link with GSM Module via Serial Port, IrDA, BT
Send and receive messages
Send long messages
Support UCS2/HEX.
Советую этот компонент.
Отправлено
Добавлено:
Народ ! Пишите в ПМ ! Иначе Nep нас изнахрючит. И вообще то лучше обращайтесь к владельцу исходника.
Или на Рапиду залью ?
Исходник не отправляет СМС на русском но как пример очень даже нормально.
http://www.torry.net/pages.php?id=205
SMSModule
Link with GSM Module via Serial Port, IrDA, BT
Send and receive messages
Send long messages
Support UCS2/HEX.
Советую этот компонент.
Ну что кто нибудь чего нибудь сделал ?
Цитата:
Ну что кто нибудь чего нибудь сделал ?
написал кодирование/расскодирование в pdu для русских сообщений UCS2, сейчас заканчиваю тоже самое при 7 битном кодирование для латиницы....
to all: какую библиотеку для com-порта посоветуете использовать?
spoliator, у самого какие результаты....? Говорил SMSModule рулит. Может расскажешь, что да как там..... и что использовал для работы с com-портом.
Цитата:
В качестве "компонента" использовать класс Synaser.
to OdesitVadim:
хорошая компонента, тока очень часть вылетают ошибки.... вот допустим кусок кода...
----------------------------------------------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
const cmd: array[0..2] of string = ('AT+CGMI',
'AT+CGMM',
'AT+CGMR');
var
ser:TBlockSerial;
i: integer;
rec_str: string;
begin
ser:=TBlockSerial.Create;
ser.RaiseExcept:=True;
try
ser.Connect('COM5');
ser.Config(4800, 8, 'N', 0, false, false);
for i:=0 to 2 do begin
rec_str := ser.ATCommand(cmd[i]);
if Pos('OK', rec_str) > 0 then
memo1.lines.Add(rec_str);
end;
finally
ser.free;
end;
end;
--------------------------------------------------------------------------
пишешь вместо 'AT+CGMI' -> AT+CGMI1 и пошли ошибки.
В чем проблема может быть?????????
level2003
Цитата:
Цитата:
пишешь вместо 'AT+CGMI' -> AT+CGMI1 и пошли ошибки. В чем проблема может быть?????????Кавычки забыл
Вот еще кусок кода. Все равно вылетают ошибки! На этот раз при переводе в PDU-режим(Error.1). Телефон его поддерживает(проверял в гипертерминале). Вот такая ошибка: 'Communication error 9997: Timeout during operation'. В чем может быть проблема? Может у кого есть хороший пример на эту компоненту и русская документация? Буду благодарен.
----------------------------------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
const READ_SMS = 'AT+CMGR=';
const DELETE_SMS = 'AT+CMGD=';
const PDU_MODE_CONVERT = 'AT+CMGF=0';
const SMS_COUNT_MEMMORY = 20;
var
ser:TBlockSerial;
i: integer;
rec_str: string;
begin
ser:=TBlockSerial.Create;
ser.RaiseExcept:=True;
try
ser.Connect('COM5');
ser.Config(9600, 8, 'N', 0, false, false);
ser.AtTimeout := 5000;
// ----- переводим чтение смс в PDU-режим --------------------------------------
rec_str := ser.ATCommand(PDU_MODE_CONVERT);
if (ser.LastError <> 0) or (not ser.ATResult) then begin
Application.MessageBox('Error.1','Error.1');
Exit;
end;
// ----- считываем смс с памяти телефона ---------------------------------------
for i:=1 to SMS_COUNT_MEMMORY do begin
rec_str := ser.ATCommand(READ_SMS + IntToStr(i));
if (ser.LastError <> 0) or (not ser.ATResult) then begin
Application.MessageBox('Error.2','Error.2');
Exit;
end;
if (Pos('+CMGR', rec_str) > 0) and (Pos('OK', rec_str) > 0) then begin
memo1.lines.Add(rec_str);
rec_str := ser.ATCommand(DELETE_SMS + IntToStr(i));
if (ser.LastError <> 0) or (not ser.ATResult) then begin
Application.MessageBox('Error.3','Error.3');
Exit;
end;
end;
if (Pos('+CMS ERROR', rec_str) > 0) and (Pos('OK', rec_str) > 0) then
break;
end;
//------------------------------------------------------------------------------
finally
ser.free;
end;
end;
ЗЫ: кавычки я там не зыбыл. Но все равно спасиб за ответ.
Добавлено:
У меня щас крышу сорвет!!! С утра ошибки были где попало... щас запустил, все нормуль.. похоже дело в тайаутах. Подскажите как исправить... и пример с доками плиз... ну очень нада.
Добавлено:
еще вот такая ошибка вылетает: 'Communication error 9999: Receive framing error'. исключительные ситуации блин...
Добавлено:
Помогите, ато я вас замучаю ))
Добавлено:
написал ser.AtTimeout := 5000; но от ошбки таймаута полностью не избавился... и Receive framing error вылетает иногда.... может компонента глючная!!!
----------------------------------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
const READ_SMS = 'AT+CMGR=';
const DELETE_SMS = 'AT+CMGD=';
const PDU_MODE_CONVERT = 'AT+CMGF=0';
const SMS_COUNT_MEMMORY = 20;
var
ser:TBlockSerial;
i: integer;
rec_str: string;
begin
ser:=TBlockSerial.Create;
ser.RaiseExcept:=True;
try
ser.Connect('COM5');
ser.Config(9600, 8, 'N', 0, false, false);
ser.AtTimeout := 5000;
// ----- переводим чтение смс в PDU-режим --------------------------------------
rec_str := ser.ATCommand(PDU_MODE_CONVERT);
if (ser.LastError <> 0) or (not ser.ATResult) then begin
Application.MessageBox('Error.1','Error.1');
Exit;
end;
// ----- считываем смс с памяти телефона ---------------------------------------
for i:=1 to SMS_COUNT_MEMMORY do begin
rec_str := ser.ATCommand(READ_SMS + IntToStr(i));
if (ser.LastError <> 0) or (not ser.ATResult) then begin
Application.MessageBox('Error.2','Error.2');
Exit;
end;
if (Pos('+CMGR', rec_str) > 0) and (Pos('OK', rec_str) > 0) then begin
memo1.lines.Add(rec_str);
rec_str := ser.ATCommand(DELETE_SMS + IntToStr(i));
if (ser.LastError <> 0) or (not ser.ATResult) then begin
Application.MessageBox('Error.3','Error.3');
Exit;
end;
end;
if (Pos('+CMS ERROR', rec_str) > 0) and (Pos('OK', rec_str) > 0) then
break;
end;
//------------------------------------------------------------------------------
finally
ser.free;
end;
end;
ЗЫ: кавычки я там не зыбыл. Но все равно спасиб за ответ.
Добавлено:
У меня щас крышу сорвет!!! С утра ошибки были где попало... щас запустил, все нормуль.. похоже дело в тайаутах. Подскажите как исправить... и пример с доками плиз... ну очень нада.
Добавлено:
еще вот такая ошибка вылетает: 'Communication error 9999: Receive framing error'. исключительные ситуации блин...
Добавлено:
Помогите, ато я вас замучаю ))
Добавлено:
написал ser.AtTimeout := 5000; но от ошбки таймаута полностью не избавился... и Receive framing error вылетает иногда.... может компонента глючная!!!
level2003Телефон хардварно как подключен? ИК? USB? Или обычный ком-порт? Попробуй в конфиге последний параметр поставить true. Если обычный компорт, то может не помочь, потому что компортовые кабели для телефонов недоделки.
Добавлено:
Позже гляну на этот synaser и мож ещо чего подскажу.
Добавлено:
Позже гляну на этот synaser и мож ещо чего подскажу.
Через USB. Сейчас попробую в true поставить. Мне впринципе без разницы какой com-компонент использовать(пробовал TComPort, но что-то у меня там тоже не срослось)... если другой окажется лучше, могу и его использовать!
Добавлено:
в шнур для телефона у меня еще встроен переключатель для питания, может он оказывает какое-то воздействие.
Добавлено:
в шнур для телефона у меня еще встроен переключатель для питания, может он оказывает какое-то воздействие.
FireZone, не помогает. Все равно вылетают частенько ошибки.
1. На этом месте Application.MessageBox('Error.1','Error.1');
2. 'Communication error 9999: Receive framing error'
3. и реже таймаут
1. На этом месте Application.MessageBox('Error.1','Error.1');
2. 'Communication error 9999: Receive framing error'
3. и реже таймаут
level2003
framing error означает, что контроллер ком-порта не смог распознать байт в принятом пакете битов. Такое бывает при несоответствии настроек девайсов, плохом контакте в разъёмах, неисправности контроллера, повреждении кабеля. В твоём случае половина возможных неисправностей откидывается, поскольку ком-порт виртуальный.
Попробуй скорость поменять, например, на 115200. Данные-то с порта хоть какие-нибудь идут? Что попадает в rec_str?
framing error означает, что контроллер ком-порта не смог распознать байт в принятом пакете битов. Такое бывает при несоответствии настроек девайсов, плохом контакте в разъёмах, неисправности контроллера, повреждении кабеля. В твоём случае половина возможных неисправностей откидывается, поскольку ком-порт виртуальный.
Попробуй скорость поменять, например, на 115200. Данные-то с порта хоть какие-нибудь идут? Что попадает в rec_str?
Да я как только не менял скорость. Если с гипертерминала, то все нормуль. А вот кода прогу эту запускаю... пошло-поехало. В rec_str(receive_str) попадают данные принятые с ком-порта.
P.S.: А ты сам такую прогу не пробовал писать? Если да, то что использовал?
P.S.: А ты сам такую прогу не пробовал писать? Если да, то что использовал?
level2003
Цитата:
Добавлено:
У тебя в коде много лишнего. Например, проверка LastError не нужна вовсе, поскольку если оно не ноль, то возбуждается исключение. А последнее условие вообще лишено смысла:
Цитата:
Код: unit serdesc;
interface
uses
sysutils, synaser;
type
TAdvBlockSerial = class(TBlockSerial)
protected
FCmsCode: Integer;
public
property CMSCode: Integer read FCmsCode;
function ATCommand(value: string): string; override;
end;
implementation
function TAdvBlockSerial.ATCommand(value: string): string;
var
s: string;
ConvSave: Boolean;
begin
result := '';
FAtResult := False;
FCmsCode := 0;
ConvSave := FConvertLineEnd;
try
FConvertLineEnd := True;
SendString(value + #$0D);
repeat
s := RecvString(FAtTimeout);
if s <> Value then
result := result + s + CRLF;
if s = 'OK' then
begin
FAtResult := True;
break;
end;
if s = 'ERROR' then
break;
if Pos('+CMS ERROR:', s) = 1 then begin
Delete(s, 1, 11);
FCMSCode := StrToInt(Trim(s));
break
end
until FLastError <> sOK;
finally
FConvertLineEnd := Convsave;
end;
end;
end.
Цитата:
Если да, то что использовал?win32 API, проблем не знал. Попробовал я щас synaser. Проблема в том, что метод ATCommand весьма негибкий, посмотри его исходник. Таймаутами он реагирует на любые строки, которые не кончаются на 'OK'<CRLF> или 'ERROR'<CRLF>. А ведь телефон кроме этих кодов может еще и +CMS ERROR: <code><CRLF> выдавать. А такая ошибка возникает у тебя, когда ты запрашиваешь с телефона несущесвующую СМС. Рекомендую объявить наследника от TBlockSerial и переопределить в нём метод ATCommand своим более гибким, который сможет распознавать +CMS ERROR и +CME ERROR и даже сохранять код ошибки.
Добавлено:
У тебя в коде много лишнего. Например, проверка LastError не нужна вовсе, поскольку если оно не ноль, то возбуждается исключение. А последнее условие вообще лишено смысла:
Цитата:
if (Pos('+CMS ERROR', rec_str) > 0) and (Pos('OK', rec_str) > 0) then break;. А вообще, ты уверен, что в каждой читаемой ячейке есть сообщение? По-моему, лучше получать список сообщений командой AT+CMGL, а потом по номерам ячеек из списка удалять сообщения. Накидал наследника от TBlockSerial [more]
Код: unit serdesc;
interface
uses
sysutils, synaser;
type
TAdvBlockSerial = class(TBlockSerial)
protected
FCmsCode: Integer;
public
property CMSCode: Integer read FCmsCode;
function ATCommand(value: string): string; override;
end;
implementation
function TAdvBlockSerial.ATCommand(value: string): string;
var
s: string;
ConvSave: Boolean;
begin
result := '';
FAtResult := False;
FCmsCode := 0;
ConvSave := FConvertLineEnd;
try
FConvertLineEnd := True;
SendString(value + #$0D);
repeat
s := RecvString(FAtTimeout);
if s <> Value then
result := result + s + CRLF;
if s = 'OK' then
begin
FAtResult := True;
break;
end;
if s = 'ERROR' then
break;
if Pos('+CMS ERROR:', s) = 1 then begin
Delete(s, 1, 11);
FCMSCode := StrToInt(Trim(s));
break
end
until FLastError <> sOK;
finally
FConvertLineEnd := Convsave;
end;
end;
end.
Есть проблема : неполучается получить отчет о доставке
Поле PDU заполняю так.
0 - RP (Reply Path, не используем, ставим ноль)
0 - UDHI (означает, что тело сообщения содержит заголовок)
1 - SRR (Status report request, не запрашиваем отчет о доставке)
10 - VPF (Validity Period Format, ставим всегда эти два бита в состояние 10)
0 - RD (Reject Duplicates, много писать, читаем доку :). Ставим ноль и не напрягаемся)
01 - MTI (Message Type Indicator, 01 - это SMS-SUBMIT, т.е., исходящее сообщение)
СМС доходит, все читается (Кстати если даже SRR = 0).
at+cmgl=4 Выдает только 1 старую СМСку. Что я делаю не так или что нужно настроить
СМС отправляю в ПДУ формате
Поле PDU заполняю так.
0 - RP (Reply Path, не используем, ставим ноль)
0 - UDHI (означает, что тело сообщения содержит заголовок)
1 - SRR (Status report request, не запрашиваем отчет о доставке)
10 - VPF (Validity Period Format, ставим всегда эти два бита в состояние 10)
0 - RD (Reject Duplicates, много писать, читаем доку :). Ставим ноль и не напрягаемся)
01 - MTI (Message Type Indicator, 01 - это SMS-SUBMIT, т.е., исходящее сообщение)
СМС доходит, все читается (Кстати если даже SRR = 0).
at+cmgl=4 Выдает только 1 старую СМСку. Что я делаю не так или что нужно настроить
СМС отправляю в ПДУ формате
andrew_sh
Цитата:
Цитата:
at+cmgl=4 Выдает только 1 старую СМСку. Что я делаю не так или что нужно настроитьВходящие сообщения могут сохраняться либо в память SIM, либо в память телефона. Команда AT+CMGL выдаёт сообщения либо из той, либо из другой памяти. Переключиться на желаемую память можно командой AT+CPMS. На предыдущей странице есть пример.
Народ, помогите пожалуйста.
Никак не получается послать СМС.
Пробовал вышеописанные методы, не выходит, пишет ERROR.
Задача сводится к тому, чтобы послать смс в любом формате - текстовом, или PDU с модема Siemens MC35i. Весь инет перекопал, везде пишется хорошо, но на практике никак. Может я делаю что-то не то?
Не могли бы вы работающий пример привести? Буду очень благодарен.
Вот один из вариантов который не получается:
at+cmgf?
+CMGF: 0
OK
at+csmp?
+CSMP: 81,167,0,8
OK
at+cmgs="+79099922718",<cr>05000301020204E04E04
(ctrl+z)
ERROR
, или вот еще...
at+cmgf?
+CMGF: 0
OK
at+cmgf=1
OK
at+cmgs="+79099922718",129
> Test
(ctrl+z)
ERROR
Никак не получается послать СМС.
Пробовал вышеописанные методы, не выходит, пишет ERROR.
Задача сводится к тому, чтобы послать смс в любом формате - текстовом, или PDU с модема Siemens MC35i. Весь инет перекопал, везде пишется хорошо, но на практике никак. Может я делаю что-то не то?
Не могли бы вы работающий пример привести? Буду очень благодарен.
Вот один из вариантов который не получается:
at+cmgf?
+CMGF: 0
OK
at+csmp?
+CSMP: 81,167,0,8
OK
at+cmgs="+79099922718",<cr>05000301020204E04E04
(ctrl+z)
ERROR
, или вот еще...
at+cmgf?
+CMGF: 0
OK
at+cmgf=1
OK
at+cmgs="+79099922718",129
> Test
(ctrl+z)
ERROR
Доброго всем времени суток! Есть вопрос, на который так и ненашел ответа. Может поможете...
Телефон Samsung X100
При запросе AT+CSCS=?, выдает +CSCS: ("GSM") OK.
При запросе AT+CSCS?, выдает +CSCS: "GSM" OK.
Это получается что "UCS2" нету на X100?
Телефон Samsung X100
При запросе AT+CSCS=?, выдает +CSCS: ("GSM") OK.
При запросе AT+CSCS?, выдает +CSCS: "GSM" OK.
Это получается что "UCS2" нету на X100?
NightSpawn
Слать русские смс? Не помню точно, но по-моему в его терминале тело смс можно писать прямо по-русски, возможно, выставив кое-какие параметры текстового режима. Если найду свои старые исходники, то напишу точно. Вообще, x100 сильно ограничен в терминальных возможностях:
он не поддерживает PDUmode. А поскольку он еще и hex не поддерживает, то отправить с терминала склеенную смс в его единственно доступном textmode становится невозможным.
Слать русские смс? Не помню точно, но по-моему в его терминале тело смс можно писать прямо по-русски, возможно, выставив кое-какие параметры текстового режима. Если найду свои старые исходники, то напишу точно. Вообще, x100 сильно ограничен в терминальных возможностях:
он не поддерживает PDUmode. А поскольку он еще и hex не поддерживает, то отправить с терминала склеенную смс в его единственно доступном textmode становится невозможным.
Предыдущая тема: Как удалять проекты в Builder 6.0?
Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.