Seriell Komm. Mega32 in C RS232 /VISCA

#3741256
Lesenswert?

Hallo,

ich habe eine Frage zur vorgehensweise zur seriellen Kommunikation.
Die Initialisierung und Datenübertragung funktioniert soweit.

Ablauf:

Tastaturabfrage (4x4)matrix in der Main Schleife.

Bei einer Tastendruck wird eine Befehlskette(max 16 Zeichen) über die
serielle schnittstelle an
eine PTZ Kamera (SONY) übertragen. Dies geschieht mit 9600 Baud 1 Stopp
Bit.

Soweit funktioniert auch alles.

Nach dem Empfang sendet die Kamera ein "Befehl empfangen" und ein
"Befehl ausgeführt"  String zurück.

Dies muss innerhalb von 20mS  geschehen.

Der Empfang erfolgt per Interrupt.

Jetzt zum Problem.

Manche Tastenbefehle (inquiries) bekommen dann in der Antwort Werte
zurück.

Woher weiss ich zu welchem Tastendruck der Empfangene String gehört?

Eine Idee wäre die seriellen Strings per Timer in einem zb, 30mS
Zeitraster zu senden.




Vielen Dank im Voraus


Gruß

Oliver
Gast #3741329
Lesenswert?

Dein Programm sollte auf die Antwort des Inquiries warten, bevor es ein 
neues abschickt.
Ansonsten liefert die Kamera ja auch die Adresse des jeweiligen 
Eingangspuffers bei der Antwort, wenn sie einen Befehl erfolgreich 
empfangen hat.
#3741980
Lesenswert?

Hallo,

vielen Dank für die Antworten. HAbe das jetzt erst mal in Pseudo code 
geschrieben:
1
Start
2

3
Main()
4

5
<Alles ininialisieren>
6

7

8
volatile int ack = true
9

10
volatile int complete =true:
11

12
volatile int error = false
13

14
volatile char[] ack_string
15
volatile char[] complete_string
16
volatile char[] error_string
17
volatile char[] inquiry_string
18

19

20
while(1)
21

22
{
23
  if( (ack == true) && (complete == true) && (error ==false)
24
  {
25
    Tastaturabfrage;
26
    setzten des Erwarteten ACK String;
27
    setzten des erwarteten Complete String;
28
    Ausgabe VISCA Befehl über UART;
29
    ack = false;
30
    complete = false;
31
    error = false;  
32
  }
33

34
}
35

36

37
Uart Interrupt
38
{
39
  
40
  if( ack == false)
41
  {
42
    If(uart_data == ackstring)
43
    ack= true;
44
    error = false;
45
    return;
46
  }
47

48
  if (ack ==true)
49
  {
50
    if(uart_data == complete_string)
51
    complete = true;
52
    error = false
53
    return;
54
  }
55

56
  // Entweder Error oder Inquiry Command
57

58
  If (uart_data == Error code)
59
  {
60
    error =true;
61
    error_string = uart_data;
62
    return;
63
  }
64
  else
65
  {
66
    inquiry_string = uart_data;
67
  }
68

69
}

Werde es morgen mal probieren da ich zu Hause keinen Zugriff auf die 
Kamera habe.


Gruß

Oliver

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren