Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Проблема с COM портом


Автор: sazon 30.3.2009, 14:02
Здрасти...Решил написать чисто для себя программу: есть девайс, который связывается с компом через 232 интерфейс, в ком порт короче, есть описания команд( reset, send_card и т.д) в мануале к этому девайсу и естьжелание написать программку, которая отсылала бы  эти команды в порт и могла считывать то, что прислал в порт этот девайс. сначала я замутил все это тупо с перемычками( замнул прием и передачу), вроде бы все пахало более менее...с девайсом все намного понятно хитрее. передача не идет( количество отправленных байтов 0), а с порта считывается то что я отправлял...причем вроде все настроил под устройство: паритет, скорость. стоповые биты, размер байта. может быть дааная проблема связана с управлением потока: аппаратное, программное ?...просто в делфе не очень понятно как это настраивается( управление потоком)), все коды в инете прктически на си, а там вроде это реализовывается по- иному.
кстати передачу делаю синхронную,  отослал -  принял...заранее благодарен.

Автор: SneG0K 30.3.2009, 14:14
Все коды в инете работают с использованием WinAPI CreateProcess() и честно плевать на каком они языке. По поводу передачи - ты бы код показал и схему девайса, ибо на сколько я знаю, ничего лишнего замыкать не надо.

Автор: sazon 30.3.2009, 14:27
вот прием и передача
Код

function Tcomport.writedata(var comand: string): boolean;
var
     written: DWORD;
begin


  result:= false;
  new(fcomand);
  Fcomand^:= Pchar(comand);
  writefile(FHandle,Fcomand,length(comand),written,0);
  if written = length(comand) then
    result:= true
  else result:= false;
  dispose(Fcomand);
  Fcomand:= nil;

end;

function Tcomport.readdata(var buf : string): boolean;
var tem: dword;
    comstat: Tcomstat;
    num: integer;
    b: ^Pchar;
    temp: dword;
begin
  result:= false;
  ClearCommError(Fhandle,tem,@comstat);
  num:= comstat.cbInQue;

  if num > 0 then
  begin
    result:= true;
    new(b);
    readfile(Fhandle,b,num,temp,0 );
    buf:= b^;
    dispose(b);
    b:= nil;
  end;

end;

Добавлено @ 14:29
заранее извиняюсь за некое убожество кода...замыкал я когда тестил свою прогу без девайса; замыкал 2и 3-ий пин ком порта, смотрел будет ли у меня считанная информация совпадат с отосланной..

M
Rrader
sazon, не забываем пользоваться кнопочкой "Код"

Автор: sazon 30.3.2009, 14:56
и еще ребят, извиняюсь за ламерский такой вопрос...у меня в этом коде такая вещь происходит: если производить троссировку f7 то все происходит норм, передается, принимается...если просто запускаю прогу, то происходит ошибка: первую команду(какой-ть набор символов в виде стринга) он не считывает, второй раз сичтывает то что я порту и послал. но в юуфере приема находятся езе байты первой команды, в третий раз выдает ошибку invalid pointer operation

Автор: SneG0K 30.3.2009, 23:35
У меня с сокетами и с использованием многих API была проблема со string
попробуй вместо string выделять array of char

Автор: Romikgy 31.3.2009, 10:41
sazon, товарисч у вас явная проблема с работой с динамическими данными 
Код

function Tcomport.writedata(var comand: string): boolean;
var
     written: DWORD;
begin
  result:= false;
  
  writefile(FHandle,comand[1],length(comand),written,0);
  if written = length(comand) then
    result:= true
  else result:= false;
 
  
end;



Код

function Tcomport.readdata(var buf : string): boolean;
var tem: dword;
    comstat: Tcomstat;
    num: integer;
    b: ^Pchar;
    temp: dword;
begin
  result:= false;
  ClearCommError(Fhandle,tem,@comstat);
  num:= comstat.cbInQue;
  if num > 0 then
  begin
    result:= true;
    stelength(buf,num);
    readfile(Fhandle,buf[1],num,temp,0 );
    
  end;
end;

Автор: mitka 2.4.2009, 11:50
Народ, извиняюсь за назойливость и благодарю всех за помощь.Возник такой вопрос: по умолчанию какое управление потоком -отсутствует, аппартаное или программное...как я понял - оно отсутствует? или я не прав

Автор: Romikgy 2.4.2009, 23:23
по идее аппаратное по умолчанию

Автор: Virtuals 3.4.2009, 12:12
mitka, 
по умолчанию то которое выставленно в диспетчере устройств  smile , тоесть любое, не стоит на это надеется.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)