115 lines
2.9 KiB
C
115 lines
2.9 KiB
C
//##Interrupt receive per character
|
|
uint8_t WholeRxBuffer[256];
|
|
uint8_t RX[1];
|
|
uint8_t ptr = 0;
|
|
|
|
//setup
|
|
HAL_UART_Receive_IT(&huart3, RX, 1);
|
|
|
|
//callback
|
|
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){
|
|
WholeRxBuffer[ptr] = RX[0];
|
|
ptr++;
|
|
HAL_UART_Receive_IT(&huart3, RX, 1);
|
|
}
|
|
|
|
//##DMA receive
|
|
|
|
//je potreba povolit DMA na uart RX
|
|
#include "Alink.h"
|
|
|
|
uint8_t readBuffer[RX_BUFFER];
|
|
uint8_t RX[RX_BUFFER];
|
|
|
|
//inicializace uartu - interface,buffer,velikost zpravy
|
|
HAL_UART_Receive_DMA(&huart1,readBuffer,sizeof(readBuffer));
|
|
|
|
//vysilani zpravy
|
|
HAL_UART_Transmit(&huart1, (uint8_t *)&"\nThe cake is a lie", 18, 0xFFFF);
|
|
|
|
//presouvani dat z prijimaciho bufferu do cteciho bufferu (prijimaci buffer se ctenim maze)
|
|
for(int i = 0; i<sizeof(readBuffer); i++){
|
|
RX[i] = readBuffer[i];
|
|
readBuffer[i] = 0;
|
|
}
|
|
|
|
//cteni dat z cteciho bufferu a reseni zprav
|
|
for(int u = 0; u<sizeof(RX); u++){
|
|
u += listVar(u);
|
|
}
|
|
|
|
//funkce pro reseni prichozich zprav
|
|
uint8_t listVar(uint8_t index){
|
|
uint8_t msgLen = 0;
|
|
uint8_t senderAddr = 0;
|
|
uint8_t cmd = 0;
|
|
uint8_t crc = 0;
|
|
|
|
if(RX[index] == 0xA5){
|
|
if(RX[index+1] == ADDRESS){
|
|
msgLen = RX[index+2];
|
|
senderAddr = RX[index+3];
|
|
cmd = RX[index+4];
|
|
crc = RX[index+msgLen-1];
|
|
if(msgLen > 6){
|
|
uint8_t data[msgLen-6];
|
|
for(int i = 0; i<sizeof(data); i++){
|
|
data[i] = RX[index+5+i];
|
|
}
|
|
//zpracovani dat v Alinku
|
|
uint8_t inputArray[msgLen];
|
|
inputArray[0] = 0xA5;
|
|
inputArray[1] = ADDRESS;
|
|
inputArray[2] = msgLen;
|
|
inputArray[3] = senderAddr;
|
|
inputArray[4] = cmd;
|
|
inputArray[msgLen-1] = crc;
|
|
for(int i = 0; i<sizeof(data); i++){
|
|
inputArray[5+i] = data[i];
|
|
}
|
|
RxParseMSG(&huart1, inputArray);
|
|
}
|
|
else{
|
|
//zpracovani dat v Alinku
|
|
uint8_t inputArray[msgLen];
|
|
inputArray[0] = 0xA5;
|
|
inputArray[1] = ADDRESS;
|
|
inputArray[2] = msgLen;
|
|
inputArray[3] = senderAddr;
|
|
inputArray[4] = cmd;
|
|
inputArray[5] = crc;
|
|
RxParseMSG(&huart1, inputArray);
|
|
}
|
|
}
|
|
if(msgLen != 0){
|
|
return msgLen-1;
|
|
}
|
|
else{
|
|
return 0;
|
|
}
|
|
}
|
|
else{
|
|
return 0;
|
|
}
|
|
}
|
|
//int to str conversion
|
|
void dbg(unsigned long n){//16.7
|
|
char operator = '+';
|
|
if(n > 4294967296/2){
|
|
n = 4294967296 - n;
|
|
operator = '-';
|
|
}
|
|
char tmp[11];
|
|
int i = sizeof(tmp);
|
|
for(int j = 0; j<i-1; j++){
|
|
tmp[j] = '0';
|
|
}
|
|
|
|
do
|
|
{
|
|
tmp[--i] = '0' + n % 10;
|
|
n /= 10;
|
|
} while (n);
|
|
HAL_UART_Transmit(&huart7, (uint8_t *)&operator, 1, 0xFFFF);
|
|
HAL_UART_Transmit(&huart7, (uint8_t *)&tmp, sizeof(tmp), 0xFFFF);
|
|
} |