Die ersten zwei Bytes des Sendepuffers, die von STM32 an die Motorsteuerung gesendet werden, werden falsch übertragen

Ich möchte die STM32F407VET6- Karte verwenden , um Befehle an die Roboteq-Motorsteuerung MDC2230 zu senden , und ich bin ein Neuling in eingebetteten Systemen.

Zuerst habe ich mein Projekt über STM32CubeMX erstellt und RX und TX miteinander verbunden. Der Loopback funktionierte korrekt.

Außerdem kann ich über einen RS232-zu-USB-Konverter eine Kommunikation zwischen meinem PC und der Steuerung herstellen . Wenn ich über CuteCom den Befehl „Get Left Motor Speed“ sende, (Es ist: "?$03 1") reagiert der Motorcontroller erfolgreich ohne Verzerrung auf den PC.

Und auch STM32 kommuniziert über dieses Konverterkabel mit dem PC, sendet und empfängt Daten korrekt: Ich kann die Ausgänge von STM32 sehen CuteComund Befehle an STM32 senden.

Endlich habe ich den Controller mit dem Mikrocontroller verbunden. Hier ist die Verbindung:

+--------------+        +-------------------+      +-------------------+
| "STM32"   TX |------->| R1OUT        R1IN |<-----| DATA OUT (Pin 2)  |
| "USART2"  RX |<-------| T1IN        T1OUT |----->| DATA IN (Pin 3)   |
|          GND |--------| GND           GND |------| GND               |
|         3.3V |--------| 3V-5.5V "MAX3232" |      | "Roboteq MDC2230" |
+--------------+        +-------------------+      +-------------------+

Aber im Fall von STM32 zu Roboteq Controller; STM32 sendet die ersten beiden Bytes des Puffers falsch. Es muss sein:

( 3f 24 30 33 20 31 0d ) "?$03 1\r" ,aber CuteCom(*) zeigt:

( bf 27 30 33 20 31 0d ) "¿'03 1\r"und manchmal(**):

( bf 27 38 33 20 31 0d ) "¿'83 1\r"

Hier sind einige Teile des Codes, die in anderen Fällen funktionieren, aber nicht in der obigen Verbindung:

...

#define MAX_COMMAND_STR_SIZE 32
uint8_t tx_buff[MAX_COMMAND_STR_SIZE]; 
uint8_t rx_buff[MAX_COMMAND_STR_SIZE];
memset(tx_buff, 0x00, MAX_COMMAND_STR_SIZE * sizeof(uint8_t));
memset(rx_buff, 0x5F, MAX_COMMAND_STR_SIZE * sizeof(uint8_t));

...

sprintf((char*)tx_buff, "?$03 1\r");
while ( 1 )
    {
        dummyInit(&huart2);
        HAL_DMA_Init(&hdma_usart2_tx); // FIXME: Is needed?
        HAL_DMA_Init(&hdma_usart2_rx); // FIXME: Is needed?
        HAL_UART_Transmit_DMA ( &huart2, tx_buff, strlen((char*)tx_buff) );
        HAL_Delay ( 10 );
        HAL_UART_Receive_DMA ( &huart2, rx_buff, MAX_COMMAND_STR_SIZE );

        if ( DEBUG ) printf("tx_buff: %s\n", tx_buff);
        if ( DEBUG ) printf("rx_buff: %s\n", rx_buff);
        if ( DEBUG ) printf ( "DR: %"PRIu32"\n", huart2.Instance->DR );
        if ( DEBUG ) printf ( "ERR: %"PRIu32"\n\n", huart2.ErrorCode );
        //printf("Returned --> %d \n\n", getSpeedL(FALSE));
}

...

void dummyInit(UART_HandleTypeDef *_huart) // FIXME: if any other way exists, replace with this
{
    __HAL_UART_DISABLE(_huart);

    CLEAR_BIT(_huart->Instance->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN));
    CLEAR_BIT(_huart->Instance->CR3, (USART_CR3_SCEN | USART_CR3_HDSEL | USART_CR3_IREN));

    __HAL_UART_FLUSH_DRREGISTER(_huart);

    /* Enable the peripheral */
    __HAL_UART_ENABLE(_huart);

    /* Initialize the UART state */
    _huart->ErrorCode = HAL_UART_ERROR_NONE;
    __HAL_UART_RESET_HANDLE_STATE (_huart);
    _huart->gState = HAL_UART_STATE_READY;
    _huart->RxState = HAL_UART_STATE_READY;
    _huart->RxXferCount = 0;
    _huart->TxXferCount = 0;
} 

(*) Ich verwende eine faule Methode, um die Kommunikation zwischen der PIN T1OUTvon max3232 und Roboteq zu lesen DATA IN. Mein RS232-zu-USB-Konverter ist an meinen PC angeschlossen, und auf der RS232-Seite befindet sich ein MF-Überbrückungskabel. Ich berühre nur T1OUT von MAX232.

(**) Und CuteCom zeigt die Ausgabe mit Rauschen an.

Was sind die falschen Teile meines Ansatzes? Ich weiß, mein erster Fehler ist, ein Softwareingenieur zu sein, kein Elektroingenieur.

Antworten (2)

Es scheint, als hätten Sie in Ihrem STM32 eine Art 7/8-Bit-Format-Verwechslung. Der Unterschied zwischen den erwarteten und unerwarteten Daten besteht darin, dass das MS-Bit gesetzt ist. Zum Beispiel 0x03 vs 0x83 in: ( bf 27 30 33 20 31 0d ) "¿'83 1\r"

Ihr Nachrichtenformat scheint nur 7-Bit-ASCII-Werte zu erfordern. Studieren Sie die UART-Spezifikationen für den STM32, um festzustellen, ob es einen Unterschied zwischen 7-Bit- und 8-Bit-Datenbetrieb oder -Setup gibt. Versuchen Sie auch, alle Bytewerte mit 0x7F zu ANDen, kurz bevor Sie sie in das Xmit-Datenregister des UART laden.

Danke für eine Antwort. Ich habe versucht, zu wechseln UART_WORDLENGTH_8B, UART_WORDLENGTH_9Baber es hat nicht funktioniert. Das Problem ist auf eine falsche Verbindung zurückzuführen.

Ich habe echte Verbindungen zwischen MAX3232 und Roboteq MDC2230 (!) geschrieben, aber falsche Verbindungen zwischen STM32 und MAX3232 in Frage geschrieben. Also nur falsche Pins zwischen MAX3232 und Roboteq angeschlossen! Im realen Fall wurde T1OUT mit DATA OUT verbunden (Pin2). Wahre Verbindung ist:

+--------------+        +-------------------+      +-------------------+
| "STM32"   RX |<-------| R1OUT        R1IN |<-----| DATA OUT (Pin 2)  |
| "USART2"  TX |------->| T1IN        T1OUT |----->| DATA IN (Pin 3)   |
|          GND |--------| GND           GND |------| GND               |
|         3.3V |--------| 3V-5.5V "MAX3232" |      | "Roboteq MDC2230" |
+--------------+        +-------------------+      +-------------------+

Fragen zu stellen war gut für mich gewesen. Aber für die Community denke ich, dass es unnötig war. Sorry liebe Community, mein schlechtes :P