Каков наилучший способ синхронизации последовательной связи между двумя микроконтроллерами с помощью UART? - PullRequest
0 голосов
/ 21 октября 2019

Предположим, у нас есть два микроконтроллера, UART module был инициализирован для работы в качестве передатчика и приемника (полный дуплексный обмен данными) для них обоих.

Перед суперциклом один из них отправляет определенный байт, и в суперцикле несколько раз первый микро и второй получает, а иногда второй отправляет и первый получает и так далее.

Итак, как можно кодировать что-то подобное? void uart_sendByte(uint8 data) и uint8 uart_receiveByte() работают в технике pollong.

Как я могу контролировать связь, чтобы получать правильные данные в нужное время и отправлять правильные данные в нужное время?

1 Ответ

0 голосов
/ 21 октября 2019

Заголовочный файл для драйвера UART для микроконтроллера AVR Atmega16

#ifndef UART_H_
#define UART_H_

#include "std_types.h"
#include "common_macros.h"
#include "micro_config.h"

/**************************************************************************************************/
/*                                     Preprocessor Macros                                        */
/**************************************************************************************************/
#define UART_BAUDRATE 9600

/**************************************************************************************************/
/*                                Public Functions Prototypes                                     */
/**************************************************************************************************/
void UART_init(void);
void UART_sendByte(uint8 data) ;
uint8 UART_receiveByte(void) ;
void UART_sendString(const uint8 *str ) ;
void UART_receiveString( uint8 *str ) ;

#endif 

Код драйвера UART

#include "uart.h"
#define BAUDRATE_PRESCALE (((F_CPU/(8UL*UART_BAUDRATE))) - 1)

/**************************************************************************************************
   [ Function Name ] : UART_init
   [ Description   ] : This function is responsible for initializing UART module .
   [ Args          ] : void
   [ Returns       ] : void
**************************************************************************************************/
void UART_init(void)
{
    /* Double Transmission Speed                                                     */
    UCSRA = (1<<U2X) ;
    /* Enable Receiver and Transmitter                                               */
    UCSRB = (1<<RXEN) | (1<<TXEN) ;
    /* URSEL   : Must be one when writing UCSRC                                      */
    /* UCSZ0:1 : Set 8-Bits Data Mode                                                */
    UCSRC = (1<<URSEL)|(1<<UCSZ0)|(UCSZ1) ;
    /* First 8 bits from the BAUDRATE_PRESCALE inside UBRRL and last 4 bits in UBRRH */
    UBRRH = BAUDRATE_PRESCALE >> 8 ;
    UBRRL = BAUDRATE_PRESCALE ;
}

/**************************************************************************************************
   [ Function Name ] : UART_sendByte
   [ Description   ] : This function is responsible for Transmitting a 1-Byte of data
   [ Args          ] : uint8 : byte of data to be send
   [ Returns       ] : void
**************************************************************************************************/
void UART_sendByte(uint8 data)
{
    UDR = data ;                      /* Put Data in Data Register           */
    while(BIT_IS_CLEAR(UCSRA , TXC)); /* wait until transmission is complete */
    SET_BIT(UCSRA , TXC) ;          /* clear flag again                    */
}
/**************************************************************************************************
   [ Function Name ] : UART_receiveByte
   [ Description   ] : This function is responsible for Receiving 1-Byte of data
   [ Args          ] : uint8 data
   [ Returns       ] : uint8 : content of UART Data Register
**************************************************************************************************/
uint8 UART_receiveByte(void)
{
    while(BIT_IS_CLEAR(UCSRA , RXC)); /* wait until receiving is complete */
    return UDR ;                      /* return contents of data register */
}
/**************************************************************************************************
   [ Function Name ] : UART_sendString
   [ Description   ] : This function is responsible for Transmiting a String
   [ Args          ] : const uint8* : a pointer to constant character arry - string - to be send
   [ Returns       ] : void
**************************************************************************************************/
void UART_sendString(const uint8 *str )
{
    uint8 i = 0 ;
    while(str[i] !='\0')
    {
        UART_sendByte(str[i]) ;
        i++ ;
    }
}
/**************************************************************************************************
   [ Function Name ] : UART_receiveString
   [ Description   ] : This function is responsible for Receiving a String
   [ Args          ] : uint8* : a pointer to  character arry - string - to hold received string
   [ Returns       ] : void
**************************************************************************************************/
void UART_receiveString(uint8 *str )
{
    uint8 i = 0 ;
    str[i] = UART_receiveByte() ;
    while(str[i] !='#')
    {
        i++ ;
        str[i] = UART_receiveByte() ;
    }
    str[i] = '\0' ;
}
...