Форум: "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.04 c