Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

_CommGetLineStates() , RS232 DCD line read ,


Rekomendowane odpowiedzi

Opublikowano

Witam. Potrzebuję pomocy przy projekcie szkolnym. Próbuję podłączyć przepływomierz do wody do komputera przez port szeregowy.

 

Elementy jakie posiadam:

Port RS232

Przycisk (emulujący mój przepływomierz) N/O

circuit.gif

Układ połączeń znaleziony na http://www.linuxfocus.org/English/January2001/article186.shtml

Doświadczenie sprawdzające czy mój układ działa: Realterm pokazuje że przycisk jest wychwytywany i kontrolka pali się na zielono. Czyli mogę sczytać ten stan.

UDF z http://www.autoitscript.com/forum/topic/128546-serial-port-com-port-udf/  pomagający w komunikacji z RS232

 

Sposób działania:

 

Sprawdź statusy wszystkich linii input.

1. DCD

2. RXD

3. DSR

Jeśli któraś z nich = 1 to

$zmienna = $zmienna +1

#include 'CommMG.au3'

;Internal for the Serial UDF
Global $sportSetError = ''

;COM Vars
Global $CMPort = 1               ; Port
Global $CmBoBaud = 9600            ; Baud
Global $CmboDataBits =  8        ; Data Bits
Global $CmBoParity = "none"        ; Parity
Global $CmBoStop = 1            ; Stop
Global $setflow = 2                ; Flow

;Start up communication with the device

;$DTRMode 0 = turns on the DTR line when the port is opened and leaves it on
; 1 = enables DTR handshaking
; 2 = disables the DTR line when the device is opened and leaves it disabled.



_CommSetPort($CMPort, $sportSetError, $CmBoBaud, $CmboDataBits, $CmBoParity, $CmBoStop, $setflow)

_CommSetDTR(1) ;that work nice
sleep(1000)
_CommSetDTR(0)
sleep(1000)

_CommGetLineStates()

>Exit code: 0    Time: 2.654

 

/\ tu właśnie jest problem.

 

Wg. UDFa

;===================================================================================
;
; Function Name:  _CommGetLIneStates()
; Description:    Gets the states of 4 signals
; Parameters:     none
; Returns;   on success
;               returns an array with 4 elements giving the state of the lines CTS, DSR, Ring Indicator and DCD
;               in that order. Value True = ON, value False = OFF
;           on failure
;            returns -1 and @ set to 1
;====================================================================================

A dostaje >Exit code: 0  czyli nie jestem w stanie zczytać tych stanów.

Opublikowano

Exit code to nie jest to samo co wartość zwracana przez funkcję.

$wartosc = Funkcja()

Spowoduje że do $wartosc zostanie przypisane to, co zwróci wywołanie Funkcja() - i o tym mówi ten kawałek "Returns", że jak się uda to zwróci tablicę z wynikami a jak nie to zwróci -1. Musisz wynik zapisać do jakiejś zmiennej i coś z nim zrobić(co tam chcesz), bo exit code to coś zupełnie innego.

Opublikowano

Jak pobrać te elementy z tej tablicy?

;===================================================================================
;
; Function Name:  _CommGetLIneStates()
; Description:    Gets the states of 4 signals
; Parameters:     none
; Returns;   on success
;               returns an array with 4 elements giving the state of the lines CTS, DSR, Ring Indicator and DCD
;               in that order. Value True = ON, value False = OFF
;           on failure
;            returns -1 and @ set to 1
;====================================================================================
Func _CommGetLineStates()
    Local $vDllAns
    Local $iL, $aStates[4]

    If Not $fPortOpen Then
        SetError(1)
        Return -1
    EndIf


    $vDllAns = DllCall($hDll, 'int', 'GetLineStates')

    If @ <> 0 Then
        SetError(1)
        Return -1
    EndIf
    mgdebugCW($vDllAns[0] & @CRLF)
    For $iL = 0 To 3
        $aStates[$iL] = BitAND($vDllAns[0], 2 ^ $iL) <> 0
    Next
    Return $aStates

EndFunc   ;==>_CommGetLineStates

$aStates to pewnie ta tablica. Chcę wydobyć 4 element z niej i ma się podobno równać OFF.

Czy to prawda? Mam rację że $aStates to w tym przypadku (tablica) i moje rozwiązanie?

 

Jeszcze jedno: jak określić element pusty, czyli bez żadnego znaku. Np. Chcę w notatniku sprawdzić czy linia którą czytam jest pusta. Albo "chcę żeby ta linia była pusta".

 

Opublikowano

Prawda. Przypisało mi tablicę. Odczytałem ją. Proszę jeszcze o nie zamykanie ponieważ zaraz dopadnie mie jeszcze jeden problem.

Będę sprawdzał co 10 ms tą tablicę w celu odczytania stanów.

Na przepływomierzu będę liczył liczbę zmian stanów.

Załączyłem zdjęcie wyniku mojego eksperymentu.

post-1376455-0-99237700-1429627714_thumb.jpg

Opublikowano

W poniedziałek lecę do sklepu po nową wtyczkę rs232 i będę robił nowy schemat. Teraz już wyciągnę z wtyczki wszystkie porty i będę testował z przyciskiem.

 

Postaram się przy okazji nie uszkodzić mojego portu, więc jeśli ktoś z was czytających to, ma gotowe wartości rezystorów, lub pomysł jak zrobić mój "przepływomierz"- przycisk jestem gotowy rozwarzyć na żywo sugestie.

 

Będę wrzucał wszelkie postępy dotyczące tego projektu. Mam trochę wolne tępo ze względu na to że nad niektórymi sprawozdankami w szkole muszę siedzieć po 5-9h i przeprowadzać długie eksperymenty w domu. 

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...