MechMac
24.03.2011, 20:14
Hallo,
ich möchte an ein anderes Gerät via µC etwas senden. Was ich senden muss weiß ich. Ich weiß auch was ich bei erfolg als Antwort bekomme.
Mein Problem ist wahrscheinlich etwas Grundlegendes.
Ich verwende einen ATMega 644.
Zum Testen sende ich die Daten an den PC.
Dort wartet ein Datenlogger, der alles aufzeichnet.
Um mein Problem etwas zu verdeutlichen muss ich etwas umschreiben.
Ich habe eine Digi-Kamera welche sich von einem PC via RS232 fernsteuern lässt.
Die Software auf dem PC sendet Befehle, die Kamera erhält diese und antwortet.
Diese Kommunikation konnte ich mit dem Datenlogger mitschneiden.
Daher weiß ich was übertragen werden muss.
Hier zunächst ein Auszug als Beispiel:
Request: 20.03.2011 21:05:14.07964
00 .
Answer: 20.03.2011 21:05:15.62664 (+0.5469 seconds)
FF FF 15 ÿÿ.
Links als HEX rechts als Char bzw. String
Mein Versuch für`s erste also: Mit dem µC das 0x00 zu an den PC zu senden.
Allein das klappt schon nicht. Es kommt nicht an.
Ein Auszug meines Testprogramms:
#define UART_BAUD_RATE 19200L
#define UART_BAUD_CALC(UART_BAUD_RATE,F_CPU) ((F_CPU)/((UART_BAUD_RATE)*16L)-1L)
void USART_putc(uint8_t byte)
{
while(bit_is_clear(UCSR0A,UDRE0)); //warten auf Datenregister empty
UDR0=byte;
}
void USART_puts(char *s)
/* print string on USART (no auto linefeed) */
{
while (*s!=0)
{
USART_putc(*s);
s++;
}
}
Ich habe sowohl USART_puts als auch USART_putc probiert.
Das eine sendet Char, das andere sendet Bytes.
Das sah aus wie folgt:
USART_puts(0x00);
und
USART_putc(0x00);
Bei beidem hat der Datenlogger nicht wie erwartet:
Request:
00
angezeigt, sondern gar nichts.
Dann wollte ich mal etwas längeres senden:
//1B 53 06 00 00 11 02 00 00 00 13 00
USART_puts(0x1B);
USART_puts(0x53);
USART_puts(0x06);
USART_puts(0x00);
USART_puts(0x00);
USART_puts(0x11);
USART_puts(0x02);
USART_puts(0x00);
USART_puts(0x00);
USART_puts(0x00);
USART_puts(0x13);
USART_puts(0x00);
Ich habe es auch hier mit USART_puts und USART_putc probiert.
Der Logger hat zwar etwas angezeigt, aber eben nicht das was ich gesendet habe.
Wer jetzt denkt das die schnittstelle nicht funktioniert, dem ist nicht so.
Wenn ich das hier mache:
USART_puts("Hello");
klappt es.
Soviel zur "Vorgeschichte".
Ich habe da also einen gewaltigen Denkfehler drin.
Bleiben wir bei den genannten Beispielen.
Was muss ich nun tun um das hier:
00
oder das hier
1B 53 06 00 00 11 02 00 00 00 13 00
zu senden?
Wer kann mich darüber etwas aufklären?
Gruß, Andreas
ich möchte an ein anderes Gerät via µC etwas senden. Was ich senden muss weiß ich. Ich weiß auch was ich bei erfolg als Antwort bekomme.
Mein Problem ist wahrscheinlich etwas Grundlegendes.
Ich verwende einen ATMega 644.
Zum Testen sende ich die Daten an den PC.
Dort wartet ein Datenlogger, der alles aufzeichnet.
Um mein Problem etwas zu verdeutlichen muss ich etwas umschreiben.
Ich habe eine Digi-Kamera welche sich von einem PC via RS232 fernsteuern lässt.
Die Software auf dem PC sendet Befehle, die Kamera erhält diese und antwortet.
Diese Kommunikation konnte ich mit dem Datenlogger mitschneiden.
Daher weiß ich was übertragen werden muss.
Hier zunächst ein Auszug als Beispiel:
Request: 20.03.2011 21:05:14.07964
00 .
Answer: 20.03.2011 21:05:15.62664 (+0.5469 seconds)
FF FF 15 ÿÿ.
Links als HEX rechts als Char bzw. String
Mein Versuch für`s erste also: Mit dem µC das 0x00 zu an den PC zu senden.
Allein das klappt schon nicht. Es kommt nicht an.
Ein Auszug meines Testprogramms:
#define UART_BAUD_RATE 19200L
#define UART_BAUD_CALC(UART_BAUD_RATE,F_CPU) ((F_CPU)/((UART_BAUD_RATE)*16L)-1L)
void USART_putc(uint8_t byte)
{
while(bit_is_clear(UCSR0A,UDRE0)); //warten auf Datenregister empty
UDR0=byte;
}
void USART_puts(char *s)
/* print string on USART (no auto linefeed) */
{
while (*s!=0)
{
USART_putc(*s);
s++;
}
}
Ich habe sowohl USART_puts als auch USART_putc probiert.
Das eine sendet Char, das andere sendet Bytes.
Das sah aus wie folgt:
USART_puts(0x00);
und
USART_putc(0x00);
Bei beidem hat der Datenlogger nicht wie erwartet:
Request:
00
angezeigt, sondern gar nichts.
Dann wollte ich mal etwas längeres senden:
//1B 53 06 00 00 11 02 00 00 00 13 00
USART_puts(0x1B);
USART_puts(0x53);
USART_puts(0x06);
USART_puts(0x00);
USART_puts(0x00);
USART_puts(0x11);
USART_puts(0x02);
USART_puts(0x00);
USART_puts(0x00);
USART_puts(0x00);
USART_puts(0x13);
USART_puts(0x00);
Ich habe es auch hier mit USART_puts und USART_putc probiert.
Der Logger hat zwar etwas angezeigt, aber eben nicht das was ich gesendet habe.
Wer jetzt denkt das die schnittstelle nicht funktioniert, dem ist nicht so.
Wenn ich das hier mache:
USART_puts("Hello");
klappt es.
Soviel zur "Vorgeschichte".
Ich habe da also einen gewaltigen Denkfehler drin.
Bleiben wir bei den genannten Beispielen.
Was muss ich nun tun um das hier:
00
oder das hier
1B 53 06 00 00 11 02 00 00 00 13 00
zu senden?
Wer kann mich darüber etwas aufklären?
Gruß, Andreas