Forum: Compiler & IDEs Seriell Komm. Mega32 in C RS232 /VISCA


von Oliver F. (ollif)


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

von STK500-Besitzer (Gast)


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.

von Oliver S. (oliverso)


Lesenswert?

Wenn die Kommunikation immer auf der Reihenfolge "Sende Befehl - 
Empfange Antwort" basiert, wo ist da das Problem? Die empfangene Antwort 
gehört zum vorher gesendete Befehl, und bevor die Antwort nicht 
empfangen wurde, wird auch kein neuer Befehl gesendet.

Oliver

von Oliver F. (ollif)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.