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
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.