Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[C++] czujnik ruchu pod RS232

16 Lis 2009 14:57 2781 8
  • Poziom 11  
    Witam. Z programowania nie jestem zbyt dobry dlatego prosze o rady.
    Podlaczylem do portu COM2 czujnik ruchu (podpiete pod piny 2 i 3). Chcialby napisac podejrzewam bardzo prosty program na poczatek taki: jesli czujnik wykryje ruch tzn jakikolwiek sygnal pojdzie po kablu RS232 do portu COM2 program mialby dawac komunikat np. "Wykryto ruch".
    Czy ktos moglby mnie naprowadzic jak to zrobic? Kupilem ksiazke RS232. Praktyczne programowanie aczkolwiek tam wszystko wyglada na bardzo skomplikowane.

    Na poczatek na pewno trzeba port skonfigurowac i go otworzyc (fragment kodu znaleziony na elektrodzie):

    Code:
    #include <windows.h> 
    
    #include <stdio.h>

    int main(int argc, char** argv)
    {
        HANDLE hCom;      //uchwyt portu
        DCB dcb;         //konfiguracja portu
        BOOL fSuccess;      //flaga pomocnicza
       BYTE RS_buf;      //bufor danej
       DWORD RS_ile;      //ilosc bitow wyslanych
       
       //otwarcie portu COM2 z prawami RW
        hCom = CreateFile( TEXT("COM2"), GENERIC_READ | GENERIC_WRITE,
            0,    // exclusive access
            NULL, // default security attributes
            OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
       
        if (hCom == INVALID_HANDLE_VALUE)
        {
            printf("CreateFile failed with error %d.\n", GetLastError());
            return 1;
        }

       //pobranie aktualnych ustawien portu
        fSuccess = GetCommState(hCom, &dcb);
        if (!fSuccess)
        {
          printf ("GetCommState failed with error %d.\n", GetLastError());
          return 2;
        }
       
       //ustawienie naszej konfiguracji
       dcb.BaudRate = CBR_19200;     // predkosc transmisji
       dcb.ByteSize = 8;             // ilosc bitow danych
       dcb.Parity = NOPARITY;        // brak bitu parzystosci
       dcb.StopBits = TWOSTOPBITS;    // dwa bity stopu

       fSuccess = SetCommState(hCom, &dcb);

       if (!fSuccess)
       {
          printf ("SetCommState failed with error %d.\n", GetLastError());
          return 3;
       }




    Co dalej, aby program dzialal dla moich potrzeb?!
  • Poziom 28  
    Z ciekawości czystej zadam pytanie co to za czujnik i czemu podłączasz go pod piny 2,3 portu (DB9 czy DB25)? A na marginesie, w przyszłości do wpisywania kodów programu używaj znaczników
    Code:
    .
  • Poziom 11  
    Ahh, przepraszam za blad! Najprostrza czujka ruchu PIR NC (normalnie zamknieta), firma Pyronix Magnum Ultra. RS232 DB9, podpinam pod piny 2 i 3 poniewaz konsultowalem sie z osoba ktora podlaczala czujnik ruchu pod komputer i zrobila to poprzez wlasnie piny 2 i 3 (RxD TxD). Aczkolwiek mozliwe ze dla celow mojej pracy moge podlaczyc inaczej, mimo wszystko podlaczenie do 2 i 3 powoduje ze w programie freeware TimeAlarm moja czujka uruchamia alarm.
  • Poziom 16  
    Generalnie to czujniki ruchu można podpiąć ale nie pod TDX i RDX (2 i 3 pin) ale pod DTR i RTS i wówczas można ustawić zdarzenie on DTR enalbe.

    W razie czego możemy porozmawiać na gg:709952
  • Poziom 24  
    Witam,
    podejrzewam że rozwiązanie podłączenia czujki po pinu 2 i 3 ma na celu stworzenie pętli loop-back, czyli wysyłamy non stop np. jakiś znak i oczekujemy na niego jeśli nie przyjdzie znaczy czujka rozłączyła obwód co oznacza że wykryła ruch.
  • Poziom 16  
    Zgadzam się, można zrobić pętlę RX-TX...tylko niestety nie ma możliwości realizacji przerwania OnRXChar NOT...dla odwrotnego stanu - czujka normalnie otwarta mozna tak zrobić...W tej sytuacji pozostaje jedynie odczyt i wysyłka na timerze...trochę mało eleganckie, ale zadziała
  • Poziom 11  
    Czujki ruchu NO chyba jest trudno dostac! Wiec pozostane przy NC przynajmniej narazie. Na czym mial by polegac "odczyt i wysyłka na timerze"? Tak na prawde dla mnie najwazniejszy jest odczyt, poniewaz raczej wysylac do czujki ruchu nie ma mozliwosci, jedynie bede odczytywac czy czujka wykryla ruch.
  • Poziom 24  
    Witam,
    tu nie chodzi o jakiś konkretny odczyt/zapis danych do „czujki”, zadaniem czujki w takiej konstrukcji jest połączenie linii transmisyjnych protu COM pin 2 i 3. Wysyłane przez ciebie znaki z programu wracają do ciebie czyli loop-back.
  • Poziom 11  
    Witam ponownie.
    Zmienilem polaczenie zlacza RS232. Teraz mam wyprowadzone piny CTS, RTS i DTR. Znalazlem w necie komponent o nazwie cport, razem z nim w paczce byl bodajrze przykladowy program COMDEMO.exe . Gdy czujnik wykrywa ruch linia CTS zmienia swoj stan z 1 na 0 (i wraca do poprzedniego stanu). Wlasnie takie cos byloby moim "zbawieniem". Jaką funkcją w c++ mozna monitowac stan lini np CTS.......jesli nie c++ to w VISUAL BASIC. Prosze o pomoc!


    Witam ponownie! Znalazlem rozwiazanie w VB 2008. Dziala wszystko tak jak chcialem

    Code:

    Public Class Form1



        Public Sub SerialPort1_PinChanged(ByVal sender As Object, ByVal e As System.IO.Ports.SerialPinChangedEventArgs) Handles SerialPort1.PinChanged

            If (SerialPort1.CtsHolding) Then
                l2.Text = "CTS zostal zmieniony"
                SerialPort2.Open()
            End If

        End Sub


        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = False

        End Sub




        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            SerialPort1.Open()
            l1.Text = "Port otwarty"
           
        End Sub

        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            SerialPort1.Close()
            l1.Text = "Port zamkniety"
            If SerialPort2.IsOpen Then
                SerialPort2.Close()
            End If
        End Sub

    End Class




    Teraz robie dalsza czesc pracy tj. wyslanie polecenia AT do telefonu!
    Pozdrawiam


    ok, juz wszystko dziala....Gdy czujnik ruchu wykrywa ruch telefon komorkowy wysyla smsa do innego telefonu :) wystarczyla instrukcja:
    Code:

    SerialPort2.Write("at+cmss=1")
    SerialPort2.Write(Chr(13))



    Dzieki za pomoc. Temat do zamkniecia ;)