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