Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2004.09.26;
Скачать: [xml.tar.bz2];

Вниз

ком-порт   Найти похожие ветки 

 
Петр   (2004-08-06 07:46) [0]

Доброе время суток многоуважаемые прогеры
Кто понимает подскажите:

Имею такой результат:
15 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 54 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 time6_00 15 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 54 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 05 00 00 00 00 00 00 00 00 00 time6_00 55 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 48 00 00 00 00 00 00 00 00 00 00 15 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 54 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00
Откуда берутся нули? Передается 55, через задержку АА, еще через задержку ВВ (почему так не принимается)

Исходный текст
CommHandle := CreateFile(pchar(form1.ComboBox1.Text),
                          GENERIC_READ,
                          0,
                          0,
                          OPEN_EXISTING,
                          FILE_FLAG_OVERLAPPED or file_attribute_normal,
                          0);

  SetCommMask(CommHandle,ev_rxchar);
 
 GetCommState(CommHandle,DCB);
  DCB.BaudRate:=form1.SpinEdit1.Value;
  DCB.Parity:=NOPARITY;
  DCB.ByteSize:=8;
  DCB.StopBits:=OneStopBit;
  DCB.EvtChar:=#$55;   //задание символа для флага

  SetCommState(CommHandle,DCB);

  getcommtimeouts(commhandle,tout);
  tout.ReadIntervalTimeout:=time_out;
  tout.ReadTotalTimeoutMultiplier:=0;
  tout.ReadTotalTimeoutConstant:=0;//time_out;
  setcommtimeouts(commhandle,tout);
  CommThread := CreateThread(nil,0,@ReadComm,nil,0,ThreadID);

 ….

purgecomm(commhandle,PURGE_RXCLEAR and PURGE_TXCLEAR);
while true do
  begin
  bs:=0; kols:=0; buffer:=0;
   waitcommevent(commhandle,bs,0);
   if (bs and ev_rxchar)=ev_rxchar then
      begin
      clearcommerror(commhandle,errs,@stat);
      if readfile(commhandle,buffer,buffer_size,kols,@ovr)  then
         begin
         if (buffer_size=kols) then form1.Memo1.Text:=form1.Memo1.Text+" "+inttohex(buffer,2)
         else form1.Memo1.Text:=form1.Memo1.Text+" time_"+inttostr(getlasterror)
         end
      else form1.Memo1.Text:=form1.Memo1.Text+" e_"+inttostr(getlasterror);
      end;
  end;
end;


 
Digitman ©   (2004-08-06 09:21) [1]

непонятно, каким образом ты сочетаешь созданный тобой трэд и OVERLAPPED-режим


 
DeepProg   (2004-08-06 20:43) [2]

Digitman
Он сочетает их вот так
http://www.delphimaster.ru/articles/comport2/port.zip
Это уже эталон...
Петр
Моежт нули появляются от того, что ReadComm зациклена и во время твоих задержек считывает пустой буфер?


 
Петр   (2004-08-07 15:35) [3]

DeepProg тогда kols должно == 0, но оно == buffer_size,а если передатчик отключить то kols == 0 и нулей нет


 
DeepProg   (2004-08-08 13:08) [4]

> тогда kols должно == 0

Насколько мне известно(см. [21] в http://delphimaster.net/view/4-1090924744/) - не обязательно.
Может еще так?
Если buffer_size=SizeOf(Buffer) и обмен идет по 1 байту(1-write, 1-read), то буфер на момент чтения, действительно, содержит 0.

C каким устройством ты пытаешься обмениваться данными?

Еще хотел бы отметить, что ты не ждешь завершения наложенной опреации, которая происходит в режиме Overlapped, вероятно, поэтому Digitman и спросил о сочетании потока и наложенного режима.
Кстати зачем ты устанавливаешь EvtChar, если ты им не
пользуешься? - У тебя маска EV_RXCHAR - это значит "любой символ в буфере", а если ты ждешь определенный, т.е. EvtChar, то надо EV_RXFLAG...


 
Петр   (2004-08-09 09:10) [5]

В примере работа синхронная, тож kols должно == 0, а при асинхронной колво считаных байт беру из getoverlappedresult (все как положено:  not readfile, getlasterror=error_io_pending, waitsingleobject) и разве если ничего не считал то их колво != 0 ?  

> Если buffer_size=SizeOf(Buffer) и обмен идет по 1 байту(1-write,
> 1-read), то буфер на момент чтения, действительно, содержит
> 0.


Так и есть, а почему?

> C каким устройством ты пытаешься обмениваться данными?

Устройство самодельное, на основе АТ89

А EvtChar в дальнейшем понадобится, к тому же если его не задать разве там не будет какого то значения?


 
DeepProg   (2004-08-09 21:10) [6]

Микроконтроллер АТ89...пас

> почему?

IMHO проблема не в твоем коде, а в особенности устройства - оно у тебя случаем в буфер 0 не записывает после окончания передачи?
Может проблема в тайм-аутах. А может оно заполняет остаток очереди нулями...
Это домыслы. Извини, но боюсь что ничем конкретным помочь не смогу - поразмышлять и работать МНТ - вполне осуществимо и без меня.
Опыта не хватает...
Что же до EvtChar

> если его не задать разве там не будет какого то значения?

будет - 0.


 
Петр   (2004-08-11 08:44) [7]

DeepProg  

> Микроконтроллер АТ89...пас

Я тоже пас
Тебе удачи с твоим вольтметром
Bye-bye


 
Digitman ©   (2004-08-11 09:06) [8]


> DeepProg   (06.08.04 20:43) [2]
> http://www.delphimaster.ru/articles/comport2/port.zip
> Это уже эталон


никаких "эталонов" нет и быть не может
тем более в некоторых местных статьях..
из-за пары подобных "эталонов" (например, в статьях от Н.Кариха) мыкает горе не один программер и уже не первый год


 
DeepProg   (2004-08-11 19:50) [9]

Петр

> Тебе удачи с твоим вольтметром

Проблему с самодостаточностью программы решить удалось - нужно сбрасывать CTS. Со скоростью помыкаюсь еще, но сомневаюсь, что заставлю его болтать быстрее. ThanX
Тебе же до паса еще рано.
Попробуй пойти на наглость - потряси конкретно "опытных", может кто поделиться таинством. Судя по Яndex железяка популярная, вполне вероятно, что кто-то с ней постоянно возится.

Будет полезно посмотерть через PortMon на работу какой-нибудь чужой разработки для этой или родственной железяки, вдруг удастся что-нибудь поймать.  

Digitman
Трудно уловить иронию в цитируемой фразе. Но она там была. Может стоило добавить в конце "блин" :)


 
Петр   (2004-08-11 21:15) [10]

DeepProg


> посмотерть через PortMon на работу какой-нибудь чужой разработки
>


Скинь please, если имеется

Digitman


> никаких "эталонов" нет и быть не может


Откуда тогда инфу черпать?

Подскажите что нибудь о моей задаче, коли знаете.


 
Петр   (2004-08-13 08:37) [11]

УРА!!!!!!
Все работает.

Ошибка была устройстве - шел инверсный код.

Всем большое спасибо, пока



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2004.09.26;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.035 c
1-1094705405
Илайдж
2004-09-09 08:50
2004.09.26
Экспорт в Excel


3-1093674094
Астроном
2004-08-28 10:21
2004.09.26
AutoIncrement


1-1095142853
Miralex
2004-09-14 10:20
2004.09.26
Потоки.


1-1094924371
Antonmm
2004-09-11 21:39
2004.09.26
Количество файлов в папке


4-1092898162
Sergiant
2004-08-19 10:49
2004.09.26
Обои





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский