Тонкости работы с COM портом
Модератор: Модераторы
Здравствуйте народ, это снова я. Вопросик такой не подскажете. Как работать с устройствами на COM порту вроде разобрался. А вот если устройство подключено например к GSM -модему ,который постоянно весит в сети. Я знаю ip модема, каким образом мне посылать данные на модем, чтобы они до устройства доходили? Помогите плиз...
Вопрос непонятен!
Что за модем? Как пдключён и куда? Какой протокол будете использовать (CSD,GPRS)?
Что за модем? Как пдключён и куда? Какой протокол будете использовать (CSD,GPRS)?
Простите за неполноту данных по вопросу. Имеется например счетчик э/э, у которого есть свой протокол взаимодействия. Этот счетчик подключен к GSM-модему (не очень понимаю как влияет вид модема на то, как опрашивать устройство (счетчик э/э)), который постоянно весит в сети со статичным ip адресом. Необходимо с внешнего компа, также подключенного к интернету естественно посылать на этот счетчик команды и получать с него после этого данные (ответ на команды). При работе просто подключенного к com порту все ясно, посылаешь в буфер com порта последовательность байт согласно протоколу счетчика, потом читаешь , что ответил счетчик. А при работе через модем не совсем понятно куда и как посылать. Протокол GPRS.
Как инициализируется подключение по GPRS со стороны счётчика?
Если это специализированное утройство типа PGC которое эмулирует модем в режиме CSD через протокол GPRS вам необходимо знать IP порт и тип используемого IP протокола (UDP или TCP/IP).
В данном случае как я понимаю со стороны компьютера у вас имеется интерент подключение. Сохдаёте удалённое подключение (TCP/IP или UDP) с ip адресом модема по порту и передаёте данные по обычному протоколу счётчика. (Почитайте о Сокетах и посмотрите компоненты Synapse)
Но если у вас со стороны счётчика установлен обычный терминал (модем) типа siemens MC-55 или TC-65 или какой либо sonyericson, то необходимо сначало заставить модем подключиться к GPRS и настроить внутренний IP стек. А ваш счётчик тупое устройство, которое работает по интерфейсу RS485 и соответственно про инициализацию модема и подключение к GPRS ничего незнает! Хотя в случае использования терминалов типа TC-65 и подобных им со встроенной виртуальной машиной Java можно реализовать все выше перечисленные действия в самом модеме. (Что и было реализовано в нашей конторе на терминале TC-65).
Если это специализированное утройство типа PGC которое эмулирует модем в режиме CSD через протокол GPRS вам необходимо знать IP порт и тип используемого IP протокола (UDP или TCP/IP).
В данном случае как я понимаю со стороны компьютера у вас имеется интерент подключение. Сохдаёте удалённое подключение (TCP/IP или UDP) с ip адресом модема по порту и передаёте данные по обычному протоколу счётчика. (Почитайте о Сокетах и посмотрите компоненты Synapse)
Но если у вас со стороны счётчика установлен обычный терминал (модем) типа siemens MC-55 или TC-65 или какой либо sonyericson, то необходимо сначало заставить модем подключиться к GPRS и настроить внутренний IP стек. А ваш счётчик тупое устройство, которое работает по интерфейсу RS485 и соответственно про инициализацию модема и подключение к GPRS ничего незнает! Хотя в случае использования терминалов типа TC-65 и подобных им со встроенной виртуальной машиной Java можно реализовать все выше перечисленные действия в самом модеме. (Что и было реализовано в нашей конторе на терминале TC-65).
Mr Smart спасибо большое за участие =). Какой раз уже выручаете. Все понял, примерно. У меня как раз первый вариант, который вы описали. Т.е получается мне нужно: 1. создать подключение к ip адресу модема по порту. 2 .передавать и получать данные с помощью сокетов.
Еще раз огромное спасибо, будем работать и изучать
Еще раз огромное спасибо, будем работать и изучать
Народ кто разбирается в работе с железом помогите плиз...
Протестировал сокеты и библиотеку synapse на передачу данных между различными компьютерами (как в локальной сети, так и в разных сетях). Написал сервер и клиента всё чудесно обменивается данными.
Дошло дело до связи с коммуникатором. Имеется следующее устройство коммуникатор GSM С-1.01 завода им. Фрунзе, который может работать как в режиме GPRS, так и в режиме CDS. Коммуникатор может как сам стучатся на определенный ip и порт удаленного компьютера , так и слушать определенный порт , на который может коннектится удаленный комп.
Вопрос собственно вот в чем, я запускаю написанный мной TCP сервер, который прослушивает определенный порт, указываю коммуникатору порт и ip сервера и жду, но подсоединения не происходит (сервер написал как с помощью обычных сокетов, так и с помощью библиотеки synapse). Если на этот сервер подключаться с помощью моего клиента, то все в порядке. В чем может быть причина? Еще интересный момент, если запустить стороннее приложение TCP-сервер , прослушивающее определенный порт, на который коннектится коммуникатор, то оно обнаруживает подключение. В связи с этим могу предположить, что проблемы в мной написанном сервере. Вот код сервера (на библиотеке synapse):
Протестировал сокеты и библиотеку synapse на передачу данных между различными компьютерами (как в локальной сети, так и в разных сетях). Написал сервер и клиента всё чудесно обменивается данными.
Дошло дело до связи с коммуникатором. Имеется следующее устройство коммуникатор GSM С-1.01 завода им. Фрунзе, который может работать как в режиме GPRS, так и в режиме CDS. Коммуникатор может как сам стучатся на определенный ip и порт удаленного компьютера , так и слушать определенный порт , на который может коннектится удаленный комп.
Вопрос собственно вот в чем, я запускаю написанный мной TCP сервер, который прослушивает определенный порт, указываю коммуникатору порт и ip сервера и жду, но подсоединения не происходит (сервер написал как с помощью обычных сокетов, так и с помощью библиотеки synapse). Если на этот сервер подключаться с помощью моего клиента, то все в порядке. В чем может быть причина? Еще интересный момент, если запустить стороннее приложение TCP-сервер , прослушивающее определенный порт, на который коннектится коммуникатор, то оно обнаруживает подключение. В связи с этим могу предположить, что проблемы в мной написанном сервере. Вот код сервера (на библиотеке synapse):
Код: Выделить всё
TcpSrv = class(TThread)
private
FTcpSrv: TTCPBlockSocket;
public
constructor Create;
destructor Destroy; override;
procedure Execute; override;
end;
TcpSrvThrd = class(TThread)
private
FTcpSrv: TTCPBlockSocket;
CSock: TSocket;
FTcpIn, FTcpOut, FMess, FDevIp: string;
FDevId: Integer;
FTcpRecvLst, FTcpSendLst: TStringList;
public
constructor Create (HSock:TSocket);
//procedure SyncMode(Mode: string);
//procedure UpdateWhm;
procedure GetDevId;
//procedure LogAdd;
procedure Execute; override;
end;
var
Form1: TForm1;
Len,I,J,k:Integer;
MyServ:TcpSrv;
ConnectCl:TcpSrvThrd;
{ TcpSrv }
constructor TcpSrv.Create;
begin
inherited create(false);
FTcpSrv := TTCPBlockSocket.create;
FreeOnTerminate := True;
end;
destructor TcpSrv.Destroy;
begin
FTcpSrv.Free;
end;
// главнй поток сервера
procedure TcpSrv.Execute;
var
ClientSock: TSocket;
begin
with FTcpSrv do
begin
CreateSocket;
SetLinger(True,10);
Bind('83.220.243.247','3300'); // ip сервера и порт
Listen;
repeat
if Terminated then Break;
if CanRead(100) then
begin
ClientSock := Accept;
if LastError = 0 then ConnectCl:=TcpSrvThrd.Create(ClientSock);
end;
until False;
end;
end;
{ TcpSrvThrd }
constructor TcpSrvThrd.Create(HSock: TSocket);
begin
inherited create(false);
CSock := HSock;
FreeOnTerminate := True;
FTcpRecvLst := TStringList.Create;
FTcpSendLst := TStringList.Create;
FDevId := 0;
FDevIp := '';
end;
// если подключился клиент
procedure TcpSrvThrd.Execute;
var buf:array[0..2] of byte;
begin
inherited;
FTcpSrv := TTCPBlockSocket.Create;
//FTcpSrv.ConvertLineEnd := True;
//------------------------------------------------
try
FTcpSrv.Socket := CSock;
FTcpSrv.GetSins;
FDevIp := FTcpSrv.GetRemoteSinIP;
form1.Label2.Caption:=FDevIp;
repeat
if Terminated then Break;
FTcpIn := FTcpSrv.RecvString(500);
if FTcpIn <> '' then
begin
form1.Memo1.Lines.Add(FTcpIn);
end;
until false;
finally
FTcpSrv.CloseSocket;
FTcpSrv.Free;
end;
end;
Доброе утро. Подскажите, пожалуйста. У меня проблема по работе с com портом в линуксе. Пишу в lazarus. Где может быть ошибка?
выводит, что i=0
Код: Выделить всё
comdsc:=fpopen('/dev/ttyS1', O_NonBlock, O_RdWr or O_NOCTTY or O_NDELAY);
fpfcntl(comdsc, F_SETFL, O_NONBLOCK);
tcgetattr(comdsc, tio);
tio.c_cflag := {tio.c_cflag}B115200{B9600} or CS8 or CLOCAL or CREAD or HUPCL;
tio.c_lflag := 0;
tio.c_oflag := OPOST;
tio.c_iflag := IXOFF;
tio.c_cc[VMIN] := 0;
tio.c_cc[VTIME] := 10;
tio.c_cc[VSTOP] := 1;
tcsetattr(comdsc, TCSANOW, tio);
fpFD_ZERO(rwset);
fpFD_ZERO(errorsetfpopen);
fpFD_SET(comdsc, rwset);
fpFD_SET(comdsc, errorset);
writeln('comdsc='+inttostr(comdsc));
fpwrite(comdsc, buf[0], 256);
fpselect(comdsc+1, nil, @rwset, @errorset, 3000);
fpFD_ZERO(rwset);
fpFD_ZERO(errorset);
fpFD_SET(comdsc, rwset);
fpFD_SET(comdsc, errorset);
i:=fpread(comdsc, buf[0], 256);
выводит, что i=0
А вы уверены, что данные поступают на com порт?
Mr.Smart писал(а):А вы уверены, что данные поступают на com порт?
Да, данные на него идут
настройки вроде все правильно выставлены, насколько я понимаю.
Может что-то еще надо добавить или убрать?
У меня проблема по работе с com портом в линуксе. Пишу в lazarus. Где может быть ошибка?
Я без синасера работу с ком портом так и не осилил.
Это предложение кстати.
serg_iv
Можешь поделиться опытом, как это осуществить???
Буду премного благодарен
Можешь поделиться опытом, как это осуществить???
Буду премного благодарен
serg_iv
Можешь поделиться опытом, как это осуществить???
Буду премного благодарен
Ссылка на синасер находится в разделе ссылки на главной (работа с сетью synapse), тебе оттуда нужен SynaSer:
http://synapse.ararat.cz/doku.php/download
скачивай, подключай модуль в свои исходники и удачи.
Пример кстати в документации есть, да и на форуме были.
спасибо, будем разбираться...
Решил с синасером работать. Что-то не получается до конца разобраться. Помогите понять ошибку
Он выводит а=0
Код: Выделить всё
ser:=TBlockserial.Create;
ser.RaiseExcept:=false;
ser.Connect('/dev/ttyS1');
ser.Config(115200,8,'N',0,false,false);
ser.SendInteger((data[1] shl 0)or(data[2] shl 8)or(data[3] shl 16)or(data[4] shl 24));
ser.SendByte(13);
ser.RecvInteger(4);
a:=ser.RecvByte(1);
writeln(a);
ser.Free;
Он выводит а=0
