RS232 a Windows
MK
info
Středa Březen 17 14:28:20 CET 2004
> Dobry den,
>
> myslim, ze uz se tady podobna vec resila v souvislosti s RS485. Ale
> nemohu to v archivu najit.
>
> Potrebuji po dokonceni vysilani po RS232 z Win prehodit stav jednoho
> vodice (DTR) pro prepnuti na prijem. Bohuzel zarizeni zacne vysilat
> velmi zahy po prijeti prikazu. Zatim jsem to ladil cekaci smyckou po
> zjisteni vyprazdneni vysilaciho bufferu. Jakz takz to chodi, ale na
> jinem pocitaci bych to musel ladit znovu? Neni nejake reseni, jak
> zjistit, ze data byla jiz odvysilana?
jde to, ale je nutne obejit API woken. Lze testovat primo UART, zda jiz
vyslal posledni Byte. Mam to v Delphi odladene na 95/98/ME/NT - tam se to
necha v celku v pohode zjistit. Na 2000/XP je to jiz slozitejsi, ale da se.
Prikladam cast kodu pro inicializaci komunikace, zde je pro prepinani smeru
pouzit signal RTS. Ostatni pripadne soukrome.
S pozdravem
MK
http://bazar.mcu.cz
http://www.mcu.cz
if FRS485Mode then begin { povoleni RS485 modu}
if Win32Platform = VER_PLATFORM_WIN32_NT then begin
{Pod NT, pouze nastavime Rts_toggle_flag}
GetCommState(FHandle, FDCB);
FDCB.Flags:= FDCB.Flags or dcb_RTS_CONTROL_TOGGLE;
SetCommState(FHandle,FDCB);
end
else begin
{Nedokumentovana funkce - vraci bazovou adresu COM Portu v edx}
EscapeCommFunction(FHandle, 10); // naplni do LocalCommPortAddr
bazovou adresu portu
asm
mov LocalCommPortAddr, dx
end;
FComPortAddr:= LocalCommPortAddr;
if FTCommThread<> nil then FTCommThread.FComPortAddr:=
LocalCommPortAddr;
end;
end
else begin {zakazani RS485 modu}
if Win32Platform = VER_PLATFORM_WIN32_NT then begin
{Pod NT, pouze schodime Rts_toggle_flag}
GetCommState(FHandle, FDCB);
FDCB.Flags:= FDCB.Flags and not dcb_RTSBit1;
SetCommState(FHandle,FDCB);
end;
end;
SetCommState(FHandle, FDCB);
end;
Další informace o konferenci Hw-list