Forum: Compiler & IDEs USB String senden/empfangen


von Patrick (Gast)


Lesenswert?

Hi,
ich arbeite momentan an einem kleinen Projekt und stehe momentan vor
folgendem Problem:

Zuerst:
Ich verwende den Controller AT32UC3C1512C. Software am PC wäre
hierfür AtmelStudio 6.1, sowie Visual Studio 2013.

Mein Ziel:
Ich will per USB daten zwischen uC und der PC-Software schicken.
Dem uC will ich einen String zuschicken(aus Visual Studio). In diesem 
String befindet sich ein "status" und die anschließend zu verarbeiteten 
"daten".

Hier kurz ein Einblick in die main-Funktion des uC:
wobei LPT_D/LTD_C/LPT_S per #define festgelegt wurden.
1
//status = recvDATA[0]
2
//data = recvDATA[1]
3
switch(recvDATA[0]){
4
5
case LPT_D: 
6
7
   if(recvDATA[1] & 0x80){
8
        gpio_set_pin_high(D7);  
9
   }
10
   else{
11
        gpio_set_pin_low(D7);
12
   }            
13
   if(recvDATA[1] & 0x40){
14
        gpio_set_pin_high(D6);
15
   }
16
   else{
17
        gpio_set_pin_low(D6);
18
   }            
19
      
20
    //usw.
21
   break;
22
case LPT_C:  
23
 
24
  if(recvDATA[1] & 0x08){
25
          gpio_set_pin_high(C3);
26
  }
27
  else{ gpio_set_pin_low(C3); }
28
  //usw
29
  break;
30
31
case LPT_S:
32
  sendDATA = gpio_get_pin_value(S3)*128;
33
  sendDATA += gpio_get_pin_value(S3)*64;
34
  //usw
35
  sendUSBdata(sendDATA);
36
  break;
37
}
wie man sieht, ist es für mich wichtig, das man die erhaltenen Daten im 
uC einzeln zuweisen kann (recvDATA[0], recvDATA[1]).

Problem:
Ich habe leider keine Ahnung, wie ich gesendete Strings auslesen kann 
und scheinbar auch keine, um welche zu senden. Der uC wird als COM4-Port 
erkannt und ansich werden daten gesendet, nur sind diese komplett 
daneben. Wenn ich zum Test eine "10" vom uC zum PC schicken will, kommt 
am PC random Zahlen raus, die weit von der eigentlichen Zahl abweichen.

Funktion zum senden: uC -> PC
1
void sendUSBdata(Byte *dat){
2
    //Wenn sendebereit
3
    if(udi_cdc_is_tx_ready()){
4
    //sende dat
5
    udi_cdc_putc(*dat);
Da sendDATA eigentlich nur eine int Zahl ist, habe ich das ganze auch 
mit int anstatt Byte versucht, was denoch nicht richtig war.
Habe auch zum Test mal folgendes probiert gehabt:
1
void sendUSBdata(Byte *dat){
2
    //Wenn sendebereit
3
    if(udi_cdc_is_tx_ready()){
4
    sprintf(str, "|%d|", dat);
5
    //sende dat
6
    udi_cdc_putc(str);
und in VisualStudio dann nach den Strichen gesucht und ausgegeben - 
funktionierte auch nicht wie gedacht.

Funktion zum empfangen: PC -> uC
1
int recvUSBdata(){
2
 char *token;
3
 char str[100];
4
 int i;
5
6
//checks if a character has been received on the CDC line. 
7
if(udi_cdc_is_rx_ready()){
8
   str = udi_cdc_getc();
9
   token = strtok (str, "|");  //unterteile string in einzelne tokens zwischen | |
10
  
11
   while (token != NULL, i++){
12
       recv_DATA[i] = token;    // i=0 ->status; i=1 ->data;
13
       token = strtok (NULL, "|");
14
   }
15
 return recv_DATA;
16
}
Das war so meien Grundidee, das ich den ankommenden String in Tokens 
aufteile und so die einzelnen Werte bekomme. In VisualStudio habe ich 
dementsprechend auch sprintf(str,"|%d|%d|", status,data) gesendet.
Problem dabei war es, dass udi_cdc_getc(); scheinbar nur int ausgibt.
Gibt es hierfür eine Funktion, die die gesendeten Daten als String 
ausgibt?

Ich hoffe ich könnt mein Problem einigermaßen verstehen und mir evtl. 
Tipps geben. Ich steck auch gerade gedanklich in diesem Schema fest und 
bekomme es gerade nicht hin umzudenken. Vielleicht geht es ja auch viel 
einfacher.

von Εrnst B. (ernst)


Lesenswert?

Teile und Hersche.

Geht deine Serieller-Port-Emulation-über USB? Ja? Kann dein UC Text 
schicken ("Hello World!\n"), und der PC (Hyperterminal, Putty, etc am 
COM4) empfangen?

Ja? => Vergiss für deine Fehlersuche alles was mit USB zu tun hat. Du 
hast eine Serielle Leitung.

Nein? => Vergiss für deine Fehlersuche alles was mit deinen Daten, 
sprintfs, strtoks usw zu tun hat. Erst mal die Kommunikation generell 
hinkriegen.

von Patrick (Gast)


Lesenswert?

Hallo Ernst, danke für deine Antwort.
Es hat sich herausgestellt, das es an der Übertragung selbst liegt. Ich 
kann zb ein ("Hello World!\n") überhaupt nicht senden, allerdings kann 
ich einzelne Charakter senden:
1
if (udi_cdc_is_tx_ready) udi_cdc_putc('H');
An der Empfangsseite bekomme ich dann 20mal ein H ausgegeben, da ich 
scheinbar jedesmal 20 Bytes empfange.

Ich kenn mich mit der uC-Programmierung leider nicht aus und so simpel 
wie ich dachte, scheint es nicht zu funktionieren.

Meine Main-Funktion zum test senden:
1
int main(void)
2
{
3
  irq_initialize_vectors();
4
  cpu_irq_enable();
5
6
  // Initialize the sleep manager
7
  sleepmgr_init();
8
9
  sysclk_init();
10
  board_init();
11
  ui_init();
12
  ui_powerdown();
13
14
  // Start USB stack to authorize VBus monitoring
15
  udc_start();
16
  
17
  
18
  // The main loop manages only the power mode
19
  // because the USB management is done by interrupt
20
  while (true) {
21
    
22
    sleepmgr_enter_sleep();
23
                
24
                //einzelnen charakter senden - funktionierte
25
                if (udi_cdc_is_tx_ready) udi_cdc_putc('A');
26
                
27
                //Versuch Hello World!\n zu senden
28
                //kommt nur ein komisches Zeichen an, auch wieder 20mal
29
                char sendTest[]= "Hello World!\n"
30
                udi_cdc_putc(sendTest);
31
        }
32
}
Ich glaube das die Funktion  udi_cdc_putc(), die falsche ist ^^. Sie 
gibt scheinbar nur einzelne values aus. Werde irgendwie mit dem Buffer 
arbeiten müssen um ganze strings zu senden.
Ich werde mich da mal genauer einlesen, wie das richtig funktioniert. 
Über Tipps bin ich jederzeit dankbar.

von Quack (Gast)


Lesenswert?

Ich wuerde sagen, dir fehlen Sprachgrundlagen und Warning liest du auch 
nicht. Dass putc() fuer Strings nicht richtig ist, duerfte dir schon der 
Compiler sagen.

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.