2016-05-02 6 views
0

Ich verwende diesen Code, um Daten über den USB zu erfassen. Der Top-Code stürzt das Programm ab, sobald ein Zeichen empfangen wurde. Die Unterseite funktioniert gut, obwohl ich die Daten nicht speichern kann, wie ich will. Das Top stürzt (Endlosschleife) ab, noch bevor CDC_Receive_FS() aufgerufen wird ... welches nie aufgerufen wird. Die untere ruft CDC_Receive_FS() wie erwartet auf.STM32F0 USB CDC_Init_FS() und CDC_Receive_FS() mit CubeMX

Für das Leben von mir kann ich nicht sehen, was falsch ist mit, wie ich meine Struktur anrufe, die eine Reihe von Puffern hält, die ich durchschlinge.

/* Send Data over USB CDC are stored in this buffer  */ 
uint8_t UserTxBufferFS[APP_TX_DATA_SIZE]; 

#define MAX_COMMANDS_IN_BUFFER 10 //max commands that can be received and saved without overwriting. Each command has a max size of APP_RX_DATA_SIZE 

/* Define size for the receive and transmit buffer over CDC */ 
/* It's up to user to redefine and/or remove those define */ 
#define APP_RX_DATA_SIZE 256 
#define APP_TX_DATA_SIZE 256 
uint8_t UserTxBufferFS[APP_TX_DATA_SIZE]; 

static struct 
    { 
    uint32_t Buffer_Number_Receiving, Buffer_Number_Processing;  //Buffer_Number_Receiving is the current position in buffer to receive incoming data. Buffer_Number_Processing is the index of buffer which is being processed. 
    uint8_t IsCommandDataReceived; // > 0 , data were received. 0 means no data is available 
    uint8_t UserRxBufferFS[MAX_COMMANDS_IN_BUFFER][APP_RX_DATA_SIZE];//it could save <MaxCommandsInBuffer> number of commands 
    uint8_t CommandsLens[MAX_COMMANDS_IN_BUFFER]; //save the len of each command 
} s_RxBuffers; 

static int8_t CDC_Init_FS(void) 
{ 

    hUsbDevice_0 = &hUsbDeviceFS; 
    /* USER CODE BEGIN 3 */ 
    /* Set Application Buffers */ 
    USBD_CDC_SetTxBuffer(hUsbDevice_0, UserTxBufferFS, 0); 
    USBD_CDC_SetRxBuffer(hUsbDevice_0, s_RxBuffers.UserRxBufferFS[s_RxBuffers.Buffer_Number_Receiving]);//Set the buffer to receive incoming data 
    USBD_CDC_ReceivePacket(hUsbDevice_0); 
    return (USBD_OK); 
    /* USER CODE END 3 */ 
} 

Dies gilt nicht:

/* Received Data over USB are stored in this buffer  */ 
uint8_t UserRxBufferFS[APP_RX_DATA_SIZE]; 

/* Send Data over USB CDC are stored in this buffer  */ 
uint8_t UserTxBufferFS[APP_TX_DATA_SIZE]; 

static int8_t CDC_Init_FS(void) 
{ 
    hUsbDevice_0 = &hUsbDeviceFS; 
    /* USER CODE BEGIN 3 */ 
    /* Set Application Buffers */ 
    USBD_CDC_SetTxBuffer(hUsbDevice_0, UserTxBufferFS, 0); 
    USBD_CDC_SetRxBuffer(hUsbDevice_0, UserRxBufferFS); 
    USBD_CDC_ReceivePacket(hUsbDevice_0); 
    return (USBD_OK); 
} 

Loop

Die Linie hier (die Verwendung dieses Puffers) scheint der Täter zu sein:

USBD_CDC_SetRxBuffer(hUsbDevice_0, s_RxBuffers.UserRxBufferFS[s_RxBuffers.Buffer_Number_Receiving]);//Set the buffer to receive incoming data 

Jede Hilfe/insight würde sehr geschätzt werden.

+0

"Crashes"? Was ist das? Fehler? Daten brechen ab? Explosionen? Irgendetwas Spezifisches? –

+0

Ich gab einen Screenshot "Loop". Es endet in der Default_Handler in einer Endlosschleife. – willworknow

+0

Dann finden Sie heraus, welche Ausnahme Sie dorthin führt, indem Sie die Unterbrechungsstatus- und Fehlerregister untersuchen. –

Antwort

0

Ich würde den Rx_Buffer monodimensional machen und die Befehlshistorie separat behandeln.

static struct 
    { 
    uint32_t Buffer_Number_Receiving, Buffer_Number_Processing;  //Buffer_Number_Receiving is the current position in buffer to receive incoming data. Buffer_Number_Processing is the index of buffer which is being processed. 
    uint8_t IsCommandDataReceived; // > 0 , data were received. 0 means no data is available 
    uint8_t UserRxBufferFS[APP_RX_DATA_SIZE]; 
    uint8_t CommandsLens[MAX_COMMANDS_IN_BUFFER]; //save the len of each command 


} s_RxBuffers; 

Abgesehen davon, da man eine Struktur (s_RxBuffers Typ) sind usinc, ich glaube, Sie nicht den Puffer als Zeiger in der richtigen Weise sind vorbei an Ihre Funktion. Ich denke, Sie sollten so etwas tun:

USBD_CDC_SetRxBuffer(hUsbDevice_0, &s_RxBuffers.UserRxBufferFS[0]);//Set the buffer to receive incoming data 
+0

Ich habe auch versucht '(USBD_CDC_SetRxBuffer (hUsbDevice_0, & s_RxBuffers.UserRxBufferFS [s_RxBuffers.Buffer_Number_Receiving] [0];);) das sollte mir die Adresse geben ... es tat, aber das gleiche Problem existiert. Ich habe in einen einfachen Ringspeicher mit einer Dimension für den E-Mail-Puffer geändert. Ich habe keine Probleme mehr ... obwohl ich immer noch nicht verstehe, warum ich keinen mehrdimensionalen Puffer verwenden kann. – willworknow