Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Чтение и запись в СОМ порт [D6, Win2k]


Страницы:   1 2 3

andrey__ ©   (2004-07-27 14:39:00) 

Нашёл ссылку:
D:\Internet\delphi\Мастера DELPHI  Работа с COM-портами под Windows_ (документация, исходники, скачать).htm

вроде всё понятно но пример не работает. В чем дело?


andrey__   (2004-08-05 10:52:00) [1]

Все нашел, в чем дело разъем (заглушка, которую я поставил на СОМ1)который мне дали, оказался поломан.

>Reindeer Moss Eater ©   (03.08.04 16:29) [40]

>А почему ТЫ должен прочитать то, что ТЫ записал в порт?
>Причем и читаешь и пишешь ты в один и тот же порт.
>Я бы еще понял нуль-модемный кабель и запись в com1 с чтением >из com2.

Если ты начал читать эту тему с начала, то понял бы что я вожусь с конкретным примером andrey__   (27.07.04 14:41) [1]который использует заглушку на порт и записывает и считывает данные с одного порта.
Если на COM1 установить перемычку между сигналами TxD и RxD, то переменная buf_in, после выполнения ReadFile, будет содержать ту же информацию, что и buf_out. Других пояснений пример не требует, все уже было подробно рассмотрено раньше. Хотя твой вариант тоже работает но у меня один СОМ порт.

>PS не надо тупо и настойчиво алёкать. Не надо приводить здесь >свои бредовые примеры.
А ты "крутой" только на клавиатуре?


DeepProg   (2004-08-04 00:45:00) [2]

А с чем, собственно, поговорить пытаетесь?
С модемом аль еще чем?


Reindeer Moss Eater   (2004-08-03 16:29:00) [3]

Почему я не могу считать с порта то что записал? Кто знает прошу подсказать.

А почему ТЫ должен прочитать то, что ТЫ записал в порт?
Причем и читаешь и пишешь ты в один и тот же порт.
Я бы еще понял нуль-модемный кабель и запись в com1 с чтением из com2.

PS не надо тупо и настойчиво алёкать. Не надо приводить здесь свои бредовые примеры.
Надо читать и разбирать примеры из документаци.
Прощай.


andrey__   (2004-08-03 16:24:00) [4]

ало!


andrey__   (2004-08-03 11:29:00) [5]

Давайте так. Я написал примерчик см. ниже. Поместите на форму кнопку и Label и скопируете пример в обработчик кнопки.

строка  fl:=WriteFile(port,buf_out,strlen(buf_out),bc,nil);
выполняетсянормально: fl=true, bc=11 как и понимаю запись в порт произошла.

А вот строка  fl:=ReadFile(port,buf_in,strlen(buf_out),bc,nil);
после ее выполнения: fl=true bc=0т.е. ничего не считал.
Почему я не могу считать с порта то что записал? Кто знает прошу подсказать.

procedure TForm1.Button1Click(Sender: TObject);
var
  dcb:tDCB;
  ct:COMMTIMEOUTS;
  port:tHANDLE;
  bc:DWORD;

  buf_out:Pchar;
  buf_in:Pchar;
  fl:LongBool;
begin

  buf_out:=StrNew('Test string');

  dcb.DCBlength:=sizeof(tDCB);
  BuildCommDCB('baud=9600 parity=N data=8 stop=1',dcb);
  //dcb.fNull:=TRUE;

  ct.ReadIntervalTimeout:=10;
  ct.ReadTotalTimeoutMultiplier:=100;
  ct.ReadTotalTimeoutConstant:=100;
  ct.WriteTotalTimeoutMultiplier:=10;
  ct.WriteTotalTimeoutConstant:=10;

  port:=CreateFile('COM1',GENERIC_READ or GENERIC_WRITE,0,nil,OPEN_EXISTING,0,0);

  SetCommState(port,dcb);
  SetCommTimeouts(port,ct);
  PurgeComm(port,PURGE_TXCLEAR or PURGE_RXCLEAR);
  SetupComm(port,256,256);

  buf_in:=HeapAlloc(GetProcessHeap(),0,strlen(buf_out)+1);
  fl:=WriteFile(port,buf_out,strlen(buf_out),bc,nil);
  if not fl then
     beep;

  fl:=ReadFile(port,buf_in,strlen(buf_out),bc,nil);
  if not fl then
     beep;

  Label1.Caption:=string(buf_in);

  HeapFree(GetProcessHeap(),0,buf_in);
  CloseHandle(port);

end;


Reindeer Moss Eater   (2004-08-02 14:15:00) [6]

Возьми ссылку из поста 13 и щупай наздоровье.
Там пример тоже элементарный, но рабочий.


andrey__   (2004-08-02 13:51:00) [7]

Я хотел прощупать механизмы работы с СОМ портами (так как текущая задача предполагает это), но у меня не работает даже элементарный пример:
andrey__   (27.07.04 14:41) [1]


Reindeer Moss Eater   (2004-08-02 13:19:00) [8]

Я что-то нить беседы терять начал.
Ты же асинхронную запись в порт отлаживаешь, а не чтение
Зачем тебе WaitCommEvent вообще?


andrey__   (2004-08-02 11:39:00) [9]

Как я понял, переменная TransMask не инициализирует маску события, а служит для того чтобы в неё записывался результат - маска того события, которое произошло.

 TransMask:=0;
 WaitCommEvent(CommHandle,TransMask,@Ovr); //ждем
 if (TransMask and EV_RXFLAG)=EV_RXFLAG then //проверяем нужное событие


само событие задаётся :
 SetCommMask(CommHandle,EV_RXFLAG);


Reindeer Moss Eater   (2004-08-02 10:39:00) [10]

Вот чем:
SetCommMask(CommHandle,EV_RXFLAG);


А вот это кто писал?
TransMask:= 0;
fl:= WaitCommEvent(CommHandle,TransMask,@Ovr); //ждем


andrey__   (2004-08-02 10:35:00) [11]

ало.


andrey__   (2004-07-30 17:08:00) [12]

>Reindeer Moss Eater ©   (30.07.04 16:47) [30]
>А ты посмотри чем ты маску проинициализировал
 Вот чем:
 SetCommMask(CommHandle,EV_RXFLAG);


Reindeer Moss Eater   (2004-07-30 16:47:00) [13]

Дело в том что я не паподаю на строку
А ты посмотри чем ты маску проинициализировал


andrey__   (2004-07-30 16:15:00) [14]

То что я понял:

procedure TForm1.FormCreate(Sender: TObject);
begin
   Ovr.hEvent := CreateEventA(nil, False, False,'SendEvent');
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
   CloseHandle(Ovr.hEvent);
end;


procedure ReadComm;
var
 Resive:array [0..255] of char;
 fl :LongBool;
 n, ErrorCode: Cardinal;
begin
 while true do
 begin
  TransMask:=0;
  fl:= WaitCommEvent(CommHandle,TransMask,@Ovr); //ждем

  if not fl then
  begin  //1
    ErrorCode := GetLastError;
    if ErrorCode = ERROR_IO_PENDING then
     if WaitForSingleObject(Ovr.hEvent, 5000) <> WAIT_OBJECT_0 then
     begin  //11
        ErrorCode := GetLastError;
     end  //11
     else
     begin  //12
       if (TransMask and EV_RXFLAG)=EV_RXFLAG then //проверяем нужное событие
       begin  //121
         ClearCommError(CommHandle,Errs,@Stat);//сбрасываем флаг
         Kols := Stat.cbInQue;
         ReadFile(CommHandle,Resive,Kols,Kols,@Ovr);//читаем
         Form1.Panel1.Caption:=string(Resive);
       end;  //121
     end;  //12

  end;  //1

 end;//while
end;


Дело в том что я не паподаю на строку
if (TransMask and EV_RXFLAG)=EV_RXFLAG then//проверяем нужное событие


Reindeer Moss Eater   (2004-07-30 15:47:00) [15]

Третью строчку поста 21 проситай вниметельно.
Особенно вторую её половину.


andrey__   (2004-07-30 15:19:00) [16]

WaitCommEvent(CommHandle,TransMask,@Ovr);
постоянно выдаёт False, я TransMask равняется - 0;
Как мне тогда впоймать нужное событие?


anton.   (2004-07-30 11:00:00) [17]

нашел вот такой пример
wOverlapped.hEvent := CreateEventA(nil, False, False,‘SendEvent‘);

IsSended := WriteFile(hComm, Buff, SizeOf(Buff), ByteNum, @wOverlapped);
if not IsSended then begin
ErrorCode := GetLastError;
if ErrorCode = ERROR_IO_PENDING then begin
if WaitForSingleObject(wOverlapped.hEvent, TimeOut) <> WAIT_OBJECT_0 then begin
ErrorCode := GetLastError;
CloseHandle(wOverlapped.hEvent);


Reindeer Moss Eater   (2004-07-30 10:53:00) [18]

Это имелось в виду?  

Это, но не только это.

Перед GetOverLappedResult надо дождаться пока просигналит евент


anton.   (2004-07-30 10:40:00) [19]

Мне нужно что бы хоть что то появилось на панели прием :-)


andrey__   (2004-07-30 10:25:00) [20]

Это имелось в виду?  

 WriteFile(CommHandle,Transmit,KolByte,KolByte,@Ovr);

 if GetLastError = Error_IO_PENDING then
   if not GetOverlappedResult(CommHandle,Ovr,n,true)then
        ShowMessage(SysErrorMessage(GetLastError))
   else


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо