Forum: Mikrocontroller und Digitale Elektronik Index von Laser Sensor mit receiveBuffer senden (UART) STM32


von Carla ". (teciu)


Lesenswert?

Hallo Zusammen
Ich habe eine kleine Frage und zwar habe ich 6 Lasorsensoren, welche ich 
über 6 Uarts einlese und dann via dem 7ten schicke.
Jeder Laser sendet 4 Byte Daten, wobei bei Byte 1 der Datensatz mit 1 
anfängt. (so erkenne ich den Datenstart)

Nun will ich aber neben den 4 Byte Daten auch noch wissen, von welchen 
Laser diese kommen.

Wie kann ich das umsetzen?

Mein Code bis jetzt:
UART_HandleTypeDef huart1;
UART_HandleTypeDef huart2;
UART_HandleTypeDef huart3;
UART_HandleTypeDef huart4;
UART_HandleTypeDef huart5;
UART_HandleTypeDef huart6;
UART_HandleTypeDef huart7;
UART_HandleTypeDef huart8;

/* USER CODE BEGIN PV */
UART_HandleTypeDef* 
huart[6]={&huart1,&huart2,&huart3,&huart4,&huart5,&huart6};


#define LASER_COUNT 6

uint8_t receiveBuffer1[4];
uint8_t receiveBuffer2[4];
uint8_t receiveBuffer3[4];
uint8_t receiveBuffer4[4];
uint8_t receiveBuffer5[4];
uint8_t receiveBuffer6[4];

uint8_t *receiveBuffer[6]= {&receiveBuffer1[4], &receiveBuffer2[4], 
&receiveBuffer3[4], &receiveBuffer4[4], &receiveBuffer5[4], 
&receiveBuffer6[4]};

uint8_t rxSensor[LASER_COUNT][4];
uint8_t rxSensorIdx[LASER_COUNT];
bool rxSensorDone[LASER_COUNT];
int idx;

/* USER CODE END PV */

/* Private function prototypes 
-----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART1_UART_Init(void);
static void MX_USART2_UART_Init(void);
static void MX_USART3_UART_Init(void);
static void MX_USART4_UART_Init(void);
static void MX_USART5_UART_Init(void);
static void MX_USART6_UART_Init(void);
static void MX_USART7_UART_Init(void);
static void MX_USART8_UART_Init(void);

void RxCpltCallback(UART_HandleTypeDef *huart, uint8_t *receiveBuffer)
{
  for(int i=0;i<=5;i++){
    if(huart==&huart[i]){
      idx=i;
      break;
    }
  };
  if(!rxSensorDone[idx]){
    if(receiveBuffer[idx] == 0x80){
      rxSensorIdx[idx] = 0;
      }


  rxSensor[idx][rxSensorIdx[idx]] = receiveBuffer[idx];
  rxSensorIdx[idx]++;
  if(rxSensorIdx[idx] == 4){
    rxSensorDone[idx]=true;
    rxSensorIdx[idx] = 0;
  }
  }
  HAL_UART_Receive_IT(&huart[idx], &receiveBuffer[idx], 1);
};

void TxCpltCallback(UART_HandleTypeDef *huart, uint8_t 
*receiveBufferCopy)
{
    HAL_UART_Transmit_IT(&huart7, &receiveBuffer[idx], 1);

}


int main(void)
{

  HAL_Init();

  /* Configure the system clock */
  SystemClock_Config();

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  MX_USART2_UART_Init();
  MX_USART3_UART_Init();
  MX_USART4_UART_Init();
  MX_USART5_UART_Init();
  MX_USART6_UART_Init();
  MX_USART7_UART_Init();
  MX_USART8_UART_Init();

  // Start receiving the data via USART

  HAL_UART_Receive_IT(&huart[idx], &receiveBuffer[idx], 1);

  while (1)
  {
    for(idx=0; idx<5; idx++){
      if(rxSensorDone[idx]==true){
        HAL_UART_Transmit_IT(&huart7, &receiveBuffer[idx], 1);
        rxSensorDone[idx]=false;
      }
    };
  }
}


Stimmt dieser Code so bis jetzt in etwa?

Und wie gesagt, ich verstehe nicht wie ich beim Transmit_IT noch den 
Index des Lasers mitgeben kann..


Kann mir da jemand helfen?

Vielen Dank!

von Martin (Gast)


Lesenswert?

Zum Beurteilen liegen sehr wenig Informationen vor.

Carla ". schrieb:
> uint8_t receiveBuffer1[4];
...
> for(idx=0; idx<5; idx++){
>       if(rxSensorDone[idx]==true){
>         HAL_UART_Transmit_IT(&huart7, &receiveBuffer[idx], 1);

Die Länge des receiveBuffer (4 bytes)  passt nicht zum Bereich, den der 
idx durchläuft (addressiert 5 bytes).
Schicken die Laser noch ein Nullbyte zum Abschluss der Meldung? Dann 
muss das berücksichtigt werden.

Carla ". schrieb:
> Und wie gesagt, ich verstehe nicht wie ich beim Transmit_IT noch den
> Index des Lasers mitgeben kann..
Hast Du in der Hand, die Bytes zu beeinflussen, welche die Laser senden? 
Dann einfach ein 5. Byte voranstellen mit der Nummer des 
Lasers/Receive-UARTs.

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.