Forum: Mikrocontroller und Digitale Elektronik RFM12USB senden oder empfang Problem


von Benjamin W. (baumwolli)


Lesenswert?

Hallo Freunde des Mikrocontrollers,

ich habe mir letztens eine Ladung RFM12 Module bei Pollin bestellt und 
mir das RFM12USB Module von Das Labor nachgebaut 
(http://www.das-labor.org/wiki/Rfm12usb).
Zusätzlich hab ich noch eine Schaltung gebaut die zum testen erstmal die 
Daten vom Rechner empfangen soll und sie dann wieder zurück schickt.
Es klappt auch alles.

Nur die Daten die mir das Modul zurück schickt sind nicht ok. Ich 
bekomme immer nur 3 Bytes übermittelt.

Treiber des USB2RFM (Inspiriert bei 
http://www.das-labor.org/trac/browser/microcontroller/src-atmel/rfm12/rfm12usb/trunk/host/console)
1
int main(int argc, char* argv[])
2
{
3
  uint_fast16_t i, j;
4
  ssize_t l;
5
  uint8_t buf[512];
6
  int vid, pid, tmp;
7
  char *rfmData;
8
  char uri[512];
9
  FILE *checkSendFile;
10
  
11
  const unsigned char rawVid[2] =  {
12
    USB_CFG_VENDOR_ID
13
  },
14
  rawPid[2] =  {
15
    USB_CFG_DEVICE_ID
16
  };
17
18
  char vendor[] =
19
  { 
20
    USB_CFG_VENDOR_NAME, 0
21
  },
22
  product[] =
23
  {
24
    USB_CFG_DEVICE_NAME, 0
25
  };
26
  
27
  usb_init();
28
  g_type_init();
29
  
30
  /* usb setup */
31
  vid = rawVid[1] * 256 + rawVid[0];
32
  pid = rawPid[1] * 256 + rawPid[0];
33
34
  if (usbOpenDevice (&udhandle, vid, vendor, pid, product) != 0) {
35
    printf ("Can't find USB Device w/ uid %04X, pid %04X\r\n", vid, pid);
36
    console_exit(__LINE__ * -1);
37
    return __LINE__ * -1;
38
  }
39
40
  signal (SIGINT, console_exit);
41
  signal (SIGKILL, console_exit);
42
  signal (SIGHUP, console_exit);
43
44
  tmp=0;
45
  i=0;
46
47
  printf ("Connection established.\r\n");
48
  
49
  if (argc > 1) {
50
    // Senden
51
    uint8_t temp[32];
52
    uint8_t address[4];
53
    uint8_t address_byte = 0;
54
    
55
    // Es wird bereits gesendet
56
    while (checkSendFile = fopen("send", "r")) {
57
      if (fgetc(checkSendFile) == '0') {
58
        fclose(checkSendFile);
59
        break;
60
      }
61
      
62
      fclose(checkSendFile);
63
    }
64
    
65
    checkSendFile = fopen("send", "w");
66
    fprintf(checkSendFile, "%d", 1);
67
    fclose(checkSendFile);
68
    
69
    rfmData = "";
70
    
71
    temp[0] = USB_SENDSTR;
72
    temp[1] = 0x12; // Adresse
73
    temp[2] = 0xEE;
74
    temp[3] = 0xDD;
75
    temp[4] = 0xCC;
76
    
77
    // 10 mal versuchen zu senden
78
    for (j = 0; j < 10; j++) {
79
        usb_control_msg(udhandle,
80
          USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_OUT,
81
          RFMUSB_RQ_RFM12_PUT, USB_TXPACKET, 0, temp, sizeof temp,
82
          5000
83
        );
84
        
85
        // Auf Empfangsbestätigung warten
86
        for (i = 0; i < 255; i++) {
87
          tmp = usb_control_msg (udhandle,
88
            USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_IN,
89
            RFMUSB_RQ_RFM12_GET, 0, 0, buf, sizeof (buf),
90
            5000
91
          );
92
          
93
          // Empfangen
94
          if (tmp > 0) { /* data received from usb bus */  
95
            if (buf[2] == 0) {
96
                        checkSendFile = fopen("send", "w");
97
                        fprintf(checkSendFile, "%d", 0);
98
                        fclose(checkSendFile);
99
100
              g_printf("Empfangsbestaetigung\r\n");
101
              return 1;
102
            }
103
          }
104
    
105
          usleep (1000);
106
        }
107
    }
108
    
109
    checkSendFile = fopen("send", "w");
110
    fprintf(checkSendFile, "%d", 0);
111
    fclose(checkSendFile);
112
        
113
    g_printf("Abbruch\r\n");
114
    return 0;
115
  } else {
116
    // Empfang
117
    char temp[4];
118
    uint8_t receiveReturn[4];
119
    receiveReturn[0] = USB_SENDCHAR;
120
  
121
    while (1) {
122
      // Es wird gesendet
123
      while (checkSendFile = fopen("send", "r")) {
124
        if (fgetc(checkSendFile) == '0') {
125
          fclose(checkSendFile);
126
          break;
127
        }
128
        
129
        fclose(checkSendFile);
130
      }
131
      
132
      tmp = usb_control_msg (udhandle,
133
        USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_IN,
134
        RFMUSB_RQ_RFM12_GET, 0, 0, buf, sizeof (buf),
135
        5000
136
      );
137
138
      if (tmp > 0) { /* data received from usb bus */       
139
        g_printf("#%d: ", buf[1]);
140
        
141
        if (buf[2] != 0) {
142
          // Empfangsbestätigung senden
143
          receiveReturn[1] = buf[1];
144
          receiveReturn[2] = 0xAC;
145
          
146
          usb_control_msg (udhandle,
147
            USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_OUT,
148
            RFMUSB_RQ_RFM12_PUT, USB_TXPACKET, 0, receiveReturn, sizeof receiveReturn,
149
            5000
150
          );
151
          rfmData = "/data/";
152
153
          for (i=3; i<tmp; i++) {
154
            g_printf("%.2x ", buf[i]);
155
            g_snprintf(temp, sizeof temp, "%.2x", buf[i]);
156
            rfmData = g_strconcat(rfmData, temp, NULL);
157
          }
158
          
159
          g_printf("\r\n");
160
          
161
          // URI erstellen und aufrufen
162
          g_snprintf(uri, sizeof uri, "%s%d%s", "http://os.gibson.guinness.lan/homecontrol/rfm/input/from/", buf[1], rfmData);      
163
          request(uri);
164
        } else {
165
          g_printf("Empfangsbestaetigung\r\n");
166
        }
167
      }
168
169
      usleep (10000);
170
    }
171
  }
172
  
173
  return 1;
174
}

Auf der anderen Schaltung läuft folgendes
1
#define WITHOUT_RECEIVE_RETURN 0
2
#define WITH_RECEIVE_RETURN 1
3
4
#define RECEIVED 1
5
6
#define TYPE_RECEIVE_RETURN 0x00
7
#define TYPE_HANDSHAKE 0x01
8
#define TYPE_DATA 0xFF
9
10
uint8_t hc_receive(char with_receive_return)
11
{
12
    rfm12_tick();
13
14
    // Es wird was empfangen
15
    if (rfm12_rx_status() > STATUS_FREE) {
16
        // LED schalten
17
        PORT_WRK_LED |= (1 << PIN_WRK_LED);
18
    }
19
20
    while (rfm12_rx_status() == STATUS_OCCUPIED) {
21
        rfm12_tick();
22
    }
23
24
    // Empfang komplett
25
    if (rfm12_rx_status() == STATUS_COMPLETE) {
26
        PORT_WRK_LED &= ~(1 << PIN_WRK_LED);
27
28
        // Adresse pruefen
29
        if (rfm12_rx_type() == hc_address) {
30
            hc_receive_data = rfm12_rx_buffer();
31
            hc_receive_len = rfm12_rx_len();
32
            rfm12_rx_clear();
33
34
            // Empfang bestaetigen
35
            if (with_receive_return == WITH_RECEIVE_RETURN) {
36
37
                uint8_t receive_return[] = {TYPE_RECEIVE_RETURN};
38
                hc_send(sizeof receive_return, receive_return, WITHOUT_RECEIVE_RETURN);
39
40
                uint8_t receive_return2[hc_receive_len+1];
41
                receive_return2[0] = TYPE_DATA;
42
43
                for (hc_wait = 0; hc_wait < hc_receive_len; hc_wait++) {
44
                    receive_return2[hc_wait+1] = hc_receive_data[hc_wait];
45
                }
46
47
                //rfm12_tick();
48
                hc_send(sizeof receive_return2, receive_return2, WITH_RECEIVE_RETURN);
49
            }
50
51
            return RECEIVED;
52
        }
53
54
        rfm12_rx_clear();
55
    }
56
57
    return 0;
58
}

In dem Szenario kriege ich am Ende aufm Rechner zurück
1
#12: ee dd

Hoffe einer von euch schlägt sich jetzt vorn Kopf und sieht den Fehler 
sofort. :)

Liebe Grüße Benjamin

von Benjamin W. (baumwolli)


Angehängte Dateien:

Lesenswert?

Hier noch alles in Dateiform. :)

Die Firmware auf dem USB Gerät ist die Standard USB12USB Firmware.
Wenn man Treiber.rar in das Host Verzeichnis von RFM12USB entpackt 
sollte es auch gleich lauffähig sein.

Bell.rar ist die Firmware für das 2te Modul.

von Benjamin W. (baumwolli)


Lesenswert?

Fehler gefunden!
Das USB_SENDSTR war falsch. Stattdessen muss natürlich die länge der zu 
übermittelnden Daten übergeben werden.
Und weil der Wert von USB_SENDSTR 2 ist wurden immer nur 2 Byte an Daten 
übertragen.

von Klaus (Gast)


Lesenswert?

Schön wenn wir dir helfen konnten :)

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.