Тонкости работы с COM портом

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

Re: Тонкости работы с COM портом

Сообщение dionic » 22.07.2009 13:45:09

Здравствуйте народ, это снова я. Вопросик такой не подскажете. Как работать с устройствами на COM порту вроде разобрался. А вот если устройство подключено например к GSM -модему ,который постоянно весит в сети. Я знаю ip модема, каким образом мне посылать данные на модем, чтобы они до устройства доходили? Помогите плиз...
dionic
новенький
 
Сообщения: 90
Зарегистрирован: 17.06.2009 21:00:08

Re: Тонкости работы с COM портом

Сообщение Mr.Smart » 22.07.2009 14:31:12

Вопрос непонятен!
Что за модем? Как пдключён и куда? Какой протокол будете использовать (CSD,GPRS)?
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Тонкости работы с COM портом

Сообщение dionic » 22.07.2009 14:47:08

Простите за неполноту данных по вопросу. Имеется например счетчик э/э, у которого есть свой протокол взаимодействия. Этот счетчик подключен к GSM-модему (не очень понимаю как влияет вид модема на то, как опрашивать устройство (счетчик э/э)), который постоянно весит в сети со статичным ip адресом. Необходимо с внешнего компа, также подключенного к интернету естественно посылать на этот счетчик команды и получать с него после этого данные (ответ на команды). При работе просто подключенного к com порту все ясно, посылаешь в буфер com порта последовательность байт согласно протоколу счетчика, потом читаешь , что ответил счетчик. А при работе через модем не совсем понятно куда и как посылать. Протокол GPRS.
dionic
новенький
 
Сообщения: 90
Зарегистрирован: 17.06.2009 21:00:08

Re: Тонкости работы с COM портом

Сообщение Mr.Smart » 22.07.2009 15:06:54

Как инициализируется подключение по 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).
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Тонкости работы с COM портом

Сообщение dionic » 22.07.2009 15:16:52

Mr Smart спасибо большое за участие =). Какой раз уже выручаете. Все понял, примерно. У меня как раз первый вариант, который вы описали. Т.е получается мне нужно: 1. создать подключение к ip адресу модема по порту. 2 .передавать и получать данные с помощью сокетов.

Еще раз огромное спасибо, будем работать и изучать :D
dionic
новенький
 
Сообщения: 90
Зарегистрирован: 17.06.2009 21:00:08

Re: Тонкости работы с COM портом

Сообщение dionic » 10.08.2009 09:10:47

Народ кто разбирается в работе с железом помогите плиз...

Протестировал сокеты и библиотеку 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;
dionic
новенький
 
Сообщения: 90
Зарегистрирован: 17.06.2009 21:00:08

Re: Тонкости работы с COM портом

Сообщение Attid » 12.08.2009 13:32:05

спрашивается а при чем тут компорт ?
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2585
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Re: Тонкости работы с COM портом

Сообщение Yurakl » 20.01.2010 10:20:26

Доброе утро. Подскажите, пожалуйста. У меня проблема по работе с com портом в линуксе. Пишу в lazarus. Где может быть ошибка?

Код: Выделить всё
    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
Yurakl
новенький
 
Сообщения: 62
Зарегистрирован: 20.01.2010 08:59:53

Re: Тонкости работы с COM портом

Сообщение Mr.Smart » 20.01.2010 12:17:30

А вы уверены, что данные поступают на com порт?
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Тонкости работы с COM портом

Сообщение Yurakl » 20.01.2010 12:21:47

Mr.Smart писал(а):А вы уверены, что данные поступают на com порт?

Да, данные на него идут

настройки вроде все правильно выставлены, насколько я понимаю.
Может что-то еще надо добавить или убрать?
Yurakl
новенький
 
Сообщения: 62
Зарегистрирован: 20.01.2010 08:59:53

Re: Тонкости работы с COM портом

Сообщение serg_iv » 20.01.2010 18:16:38

У меня проблема по работе с com портом в линуксе. Пишу в lazarus. Где может быть ошибка?

Я без синасера работу с ком портом так и не осилил.
Это предложение кстати.
serg_iv
постоялец
 
Сообщения: 276
Зарегистрирован: 15.10.2005 18:45:46
Откуда: Миасс

Re: Тонкости работы с COM портом

Сообщение Yurakl » 21.01.2010 12:58:08

serg_iv
Можешь поделиться опытом, как это осуществить???
Буду премного благодарен
Yurakl
новенький
 
Сообщения: 62
Зарегистрирован: 20.01.2010 08:59:53

Re: Тонкости работы с COM портом

Сообщение serg_iv » 21.01.2010 17:49:13

serg_iv
Можешь поделиться опытом, как это осуществить???
Буду премного благодарен

Ссылка на синасер находится в разделе ссылки на главной (работа с сетью synapse), тебе оттуда нужен SynaSer:
http://synapse.ararat.cz/doku.php/download
скачивай, подключай модуль в свои исходники и удачи.
Пример кстати в документации есть, да и на форуме были.
serg_iv
постоялец
 
Сообщения: 276
Зарегистрирован: 15.10.2005 18:45:46
Откуда: Миасс

Re: Тонкости работы с COM портом

Сообщение Yurakl » 22.01.2010 11:58:41

спасибо, будем разбираться...
Yurakl
новенький
 
Сообщения: 62
Зарегистрирован: 20.01.2010 08:59:53

Re: Тонкости работы с COM портом

Сообщение Yurakl » 01.02.2010 14:54:03

Решил с синасером работать. Что-то не получается до конца разобраться. Помогите понять ошибку

Код: Выделить всё
    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
Yurakl
новенький
 
Сообщения: 62
Зарегистрирован: 20.01.2010 08:59:53

Пред.След.

Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5

Рейтинг@Mail.ru