Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

[C++] czujnik ruchu pod RS232

talar
-
-
Posty:8
Rejestracja:10 maja 2005, o 12:29
Lokalizacja:Bydgoszcz
Kontaktowanie:
[C++] czujnik ruchu pod RS232

Postautor: talar » 16 lis 2009, o 15:04

Witam. Z programowania nie jestem zbyt dobry uczylem sie jedynie na poziomie bardzo podstawowym C/C++ dlatego prosze o rady.
Podlaczylem do portu COM2 czujnik ruchu - Z czujnika sa tylko dwa wyjscia sygnalowe (NC) podpialem je do pinow 2 i 3, dobrze to podpialem?
Chcialby napisac do tego 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):

Kod: Zaznacz cały

#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?!

Awatar użytkownika
pajaczek
Moderator
Moderator
Posty:2653
Rejestracja:24 sty 2005, o 00:39
Lokalizacja:Winny gród

Postautor: pajaczek » 16 lis 2009, o 17:49

Po pierwsze, fajnie by było gdybyś jednak kontynuował poprzedni wątek gdy dotyczy bezpośrednio tego samego. (Prawdopodobnie później i tak te tematy scalę - dla porządku).

Po drugie, już Ci ktoś o ile pamiętam napisał, że spinanie Rx i Tx nie jest dobrym pomysłem (choć w sumie piszesz o COM więc domyślam się że chodzi Ci o Blaszaka, a więc za buforem. Tak więc uszkodzenia linii nawet przy zwarciach nie powinno być.

Po trzecie, również wspomniane, znacznie łatwiejsze wykrywanie jest sygnałów sterujących, zwłaszcza w takim przypadku.

talar
-
-
Posty:8
Rejestracja:10 maja 2005, o 12:29
Lokalizacja:Bydgoszcz
Kontaktowanie:

Postautor: talar » 16 lis 2009, o 18:01

Ok. Chcialem przenies temat tu bo teraz to juz bardziej softwarowa praca! Zrobilem drugi kabelek polaczony do pinow RTS i DTR, z czujnika sa tylko dwa wyprowadzenia sygnalowe.
Jesli chodzi o program, jakies wskazowki??

Awatar użytkownika
almatea
-
-
Posty:240
Rejestracja:12 gru 2003, o 17:02
Lokalizacja:Brzeszcze
Kontaktowanie:

Postautor: almatea » 19 lis 2009, o 07:01

A program szybko możesz napisać sobie w Visual Basicu, wykrywając zdarzenie na liniach wejściowych.

Pzdr

talar
-
-
Posty:8
Rejestracja:10 maja 2005, o 12:29
Lokalizacja:Bydgoszcz
Kontaktowanie:

Postautor: talar » 19 lis 2009, o 13:51

OO, nareszcie jakas konkretna odpowiedz! Z Visual Basic nie mialem doczynienia aczkolwiek jesli tam latwo moge to zrobic to sie naucze. Sa jakies gotowe przyklady dotyczace RS232 zwiazane z moim zagadnieniem?


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". Jaka funkcja w c++ mozna monitowac stan lini np CTS.......jesli nie c++ to w VISUAL BASIC. Prosze o pomoc!

Awatar użytkownika
almatea
-
-
Posty:240
Rejestracja:12 gru 2003, o 17:02
Lokalizacja:Brzeszcze
Kontaktowanie:

Postautor: almatea » 20 lis 2009, o 23:54

Ściągnij sobie Visual Basic 2008 Express. Tam znajdziesz wszystko co potrzebne do obsługi portu szeregowego. Kontrolka Serial Port. Visual Basic 2008 Express jest narzędziem darmowym i do tego komercyjnym! Załatwisz temat w kilkanaście minut.

Pzdr

talar
-
-
Posty:8
Rejestracja:10 maja 2005, o 12:29
Lokalizacja:Bydgoszcz
Kontaktowanie:

Postautor: talar » 22 lis 2009, o 23:55

Zrobilem jak podpowiedziales. Zainstalowalem darmowego Visual Basica Express 2008. To moje pierwsze kroki. Stworzylem prosty program wlasnie na bazie SerialPort, port ladnie mi otwiera i zamyka ale wykrywanie "ruchu" niestety nie :( chcialem to zrobic metoda CtsHolding, powinno dzialac ale nie dziala :/ dodam tez ze zainstalowalem darmowy program monitujacy port szeregowy.....w nim gdy czujnik ruchu wykryje ruch cos tam sie pojawia, tzn ze sygnal do COMa dochodzi.....jedyny wniosek -> napisany program przeze mnie jest niepoprwny Moglby ktos zerknac i zasugerowac co trzeba zmienic?

Kod: Zaznacz cały

Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 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" Select Case SerialPort1.CtsHolding Case SerialPort1.CtsHolding ' Change in the CTS line. If SerialPort1.CtsHolding = True Then l2.Text = "Ruch" Else l2.Text = "" End If End Select 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" End Sub End Class

Awatar użytkownika
almatea
-
-
Posty:240
Rejestracja:12 gru 2003, o 17:02
Lokalizacja:Brzeszcze
Kontaktowanie:

Postautor: almatea » 23 lis 2009, o 22:15

Wszystkie zdarzenia generujesz z przycisku :)

Pomyśl.
Jeśli nie znajdziesz rozwiązania, pomogę.

P.S. Podpowiedź - oprogramuj zdarzenie na linii wejściowej :)

talar
-
-
Posty:8
Rejestracja:10 maja 2005, o 12:29
Lokalizacja:Bydgoszcz
Kontaktowanie:

Postautor: talar » 23 lis 2009, o 23:50

Witam ponownie! No coz chcialbym sie pochwalic iz znalazlem rozwiazanie ;)

Kod: Zaznacz cały

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



niby kilka linijek kodu a sie tyle z tym meczylem ;)
Teraz zostalo mi tylko wyslanie na drugi port COM instrukcji AT i moja praca zrobiona :D
dzieki za pomoc goraco pozdrawiam! Jesli bede mial problemy z czyms znow o sobie przypomne na forum :)



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

Kod: Zaznacz cały

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

Dzieki za pomoc. Temat do zamkniecia ;)

Wróć do „Projektowanie PCB, programy EDA, CAD, narzędziowe”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 37 gości