Seriell Komm. Mega32 in C RS232 /VISCA

OP #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.
OP #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

Eine eigene Frage? Dieser Thread ist über 12 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.