Återigen stort tack för era svar!
Jag låg och tänkte på allt det innan mitt förra inlägg när jag gick och la mig igår.. De svar efter mitt meddelande visar det också ganska klart, jag kan inte de rätta begreppen/namnen på allt och det gör så jag förvirrar er med vad det är jag försöker göra - Det är givetvis inte min mening!
sodjan
Tack för beskrivningen! En representation alltså, inte format! Nej det är ju faktiskt rätt, det syns ju inte på kommunikationen, det är ju bara ettor och nollor, eller hög och låg signal i olika kombinationer. Men då kan jag säga att jag skickar och tar emot datan representerat av Hex?
Ska försöka hålla mig tillbaka och ta sak för sak, inte hoppa fram och babbla om AES delen i projektet. I brist på bättre har jag skrivit en mottagningsrutin som denna;
Kod: Markera allt
ISR(USART_RXC_vect)
{
unsigned char data;
/* Read the received data */
data = UDR;
/* Calculate buffer index */
USART_RxHead = ( USART_RxHead + 1 ) & USART_RX_BUFFER_MASK;
if ( USART_RxHead == USART_RxTail )
{
/* ERROR! Receive buffer overflow */
}
USART_RxBuf[USART_RxHead] = data; /* Store received data in buffer */
}
Denna rutin tar emot data och lägger in varje "byte" som kommer in i en;
Kod: Markera allt
unsigned char USART_RxBuf[USART_RX_BUFFER_SIZE];
Buffer size definieras av följande för närvarande;
#define USART_RX_BUFFER_SIZE 32
Det är så jag tar emot data i dagsläget, byte för byte läggs de in i en "array" som jag gärna vill kalla det och när "USART_RxHead" kommer upp till ett visst värde, säg 7 så går en if rutin igång i huvudloopen i main. Där kollar jag av ifall byte för byte är korrekt för att avgöra vad som ska göras på mottagarsidan.
Kod: Markera allt
int main(void)
{
while(1)
{
if ( USART_RxHead >= 7 )
{
if (( USART_RxBuf[1] == 0xA5 ) && ( USART_RxBuf[2] == 0xA5 ) && ( USART_RxBuf[3] == 0xA5 ))
{
if (( USART_RxBuf[4] == 0x66 ) && ( USART_RxBuf[5] == 0x66 ) && ( USART_RxBuf[6] == 0x66 ) && ( USART_RxBuf[7] == 0x66 ))
{
PORTB &= ~(1 << PINB0);
}
if (( USART_RxBuf[4] == 0x99 ) && ( USART_RxBuf[5] == 0x99 ) && ( USART_RxBuf[6] == 0x99 ) && ( USART_RxBuf[7] == 0x99 ))
{
PORTB |= (1 << PINB0);
}
if (( USART_RxBuf[4] == 0x66 ) && ( USART_RxBuf[5] == 0x66 ) && ( USART_RxBuf[6] == 0x88 ) && ( USART_RxBuf[7] == 0x88 ))
{
PORTB &= ~(1 << PINB1);
}
if (( USART_RxBuf[4] == 0x99 ) && ( USART_RxBuf[5] == 0x99 ) && ( USART_RxBuf[6] == 0x77 ) && ( USART_RxBuf[7] == 0x77 ))
{
PORTB |= (1 << PINB1);
}
}
RESETRX();
}
}
}
RESETRX(); nollställer bara buffert längden till 0 så att mottagningen kan börja om.
Sändningen av "data" går till genom följande kod i exempelvis main; ( antar ett paket som följande; 0x01 0x55 0xAA 0xBB 0xFF 0x32 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x04)
Kod: Markera allt
USART_SEND_BYTE(0x01);
USART_SEND_BYTE(0x55);
USART_SEND_BYTE(0xAA);
USART_SEND_BYTE(0xBB);
USART_SEND_BYTE(0xFF);
USART_SEND_BYTE(0x32);
USART_SEND_BYTE(0x00);
USART_SEND_BYTE(0x00);
USART_SEND_BYTE(0x00);
USART_SEND_BYTE(0x00);
USART_SEND_BYTE(0x00);
USART_SEND_BYTE(0x00);
USART_SEND_BYTE(0x00);
USART_SEND_BYTE(0x00);
USART_SEND_BYTE(0x04);
Själva sändfunktionen;
Kod: Markera allt
void USART_SEND_BYTE(char data)
{
// Wait if a byte is being transmitted
loop_until_bit_is_set(UCSRA, UDRE);
// Send the given data
UDR = data;
}
Detta, utan problem, kan skicka vad jag än skickar in i funktionen. Mottagningsdelen som jag skrev om ovan, kan utan problem, ta emot vad jag än skickar. Här har jag inga problem med just 0 / 0x00. Jag förmodar att jag här har ett paketsystem som är längdbestämt, som flera av er har skrivit att det är något jag borde ha för ändamålet?
Har jag rätt om det? Oavsett så fungerar detta ypperligt för det "protokoll" som jag skrivit för mitt kommunikationssystem.
Givetvis ska det till en CRC/checksumma i slutet också, för att säkerställa att det jag mottagit är det som faktiskt skickades.
sodjan
Med "header" menar jag dock en egen header, inte headern i AES. Att koda hela AES paketet, efter att ha förstått din beskrivning som du skrev ovan, så skulle en hex kodning av AES paketet vara.. overkill!

Så det blir det verkligen inte
Som i paketexemplet ovan så är 0x01 0x55 0xAA själva "headern". Vad 0x01 och 0x55 står för har jag inte beslutat mig för, men just 0xAA är ju adressen för mottagaren. Så att jag kan ha flera mottagare, när jag kör på ett RS485 baserat nätverk. Givetvis inte på UART eller ett RS232 baserat nät
Nerre
Givetvis är en sträng uppdelad byte för byte, men du måste medge att det är en skillnad mellan följande två - när det gäller att läsa av dem;
Kod: Markera allt
charstring = "0155AABB"
chararray[1] = "01"
chararray[2] = "55"
chararray[3] = "AA"
chararray[4] = "BB"
Läsa av dem i form av, läsa av "byte" för byte. Åtminstone enligt vad jag kan och vet förstås
opatagio
Precis, det är väl så som du beskriver som jag beskrivit ovan på ett ungefär. Fast jag skippar just "<storlek på packet>" delen. Min tanke är att sändfunktionen inte behöver denna information, den loopar bara igenom till sista tecken som den fått inskickat i sig. Mottagaren har redan ett fast inprogrammerat värde för längden på varje paket. Själva "paketet" i sin helhet när jag sedan inkluderar AES krypteringen också borde väl kunna fungera med något liknande;
paket_design.jpg
Header har jag inte riktigt beslutat mig för vad de två byte'n står för, address är ju självklart mottagarens adress och CRC är ju inga konstigheter, möjligen att det blir två bytes.. Data däremot, här ska det finnas ett huvudkommando, subkommando och eventuell annan data som inställningar, eller som i svaren kanske en temperatur eller status för något.
Att ha det som den paketdesignen med header, adress och och crc utanför krypteringen, det kan väl inte vara några konstigheter eller "säkerhetsmässigt" dåligt? Visst, det visar paketets uppbyggnad på ett sätt, men det krypterade i "data" delen som verkligen berättar vad som ska göras, det kan ju ingen se och därmed kan de inte använda den informationen på något sätt. Vidare så kommer jag köra en sorts "rolling code" så om någon fångar ett paket eller flera för den delens skull, så kommer de inte kunna återuppspela det paketet och samma sak ska hända.
Det är ju bara de enheter som har "nyckeln" som kan avkoda AES datan och därmed veta vad som ska göras och om ett paket är korrekt med tanke på "rolling code" informationen.
Vidare tillbaka till det du skrev opatagio om ACK och NACK. Det är något som jag kommer använda i det ursprungliga kommunikationssystemet, men för just det aktuella projektet där jag använder en 433mhz länk så kommer jag inte använda mig av det då det är envägs-kommunikation. Men absolut, det är redan inräknat
Timeout har jag inte programmerat in däremot, det är dock något jag ska göra så inte processorn stannar i ett felaktigt läge, den måste ju kunna själv-hela sig så att säga
Häftigt med ditt projekt! Nu vet jag ju inte vad du har för system om det är en AVR/PIC eller mer avancerat, men hur räknar du upp till över 5 miljoner? räcker en 32-bitars int för det kanske? Har du någon mer information om det projektet? Skulle vara kul att läsa mer om
Nu tror jag att jag svarat på allt, började redan vid 10 på förmiddagen, sen var jag iväg någon timme och har fortsatt nu igen

Är det något jag missat så får ni hojta till
Det med att avsluta med en 0 / 0x00 verkar fungera sisådär nu idag.. titta på följande..
Kod: Markera allt
Paket
41 42 43 44 40 31 32 33
AES kodat till
6c 69 78 c0 0f f8 20 1f d6 cb 04 7e d8 b9 f1 af
När AESkey ligger under AESdataENC som följande;
Kod: Markera allt
uint8_t AESdataENC[] = { 0x41, 0x42, 0x43, 0x44,
0x40, 0x31, 0x32, 0x33, 0x00 };
// AES KEY - 4BFA1ABBC98751836D2A98DC98C1BEB5
uint8_t AESkey[] = { 0x4B, 0xFA, 0x1A, 0xBB,
0xC9, 0x87, 0x51, 0x83,
0x6D, 0x2A, 0x98, 0xDC,
0x98, 0xC1, 0xBE, 0xB5, 0x00 };
Om jag däremot flyttar upp AESkey[] ovanför AESdataENC[] så får jag ändå fel.
Kod: Markera allt
Paket
41 42 43 44 40 31 32 33
AES kodat till
f3 0b c4 86 7c 48 25 47 11 12 ea 10 c8 0e 4e 34 83 6d 2a 98 dc 98 c1 be b5
Kod: Markera allt
// AES KEY - 4BFA1ABBC98751836D2A98DC98C1BEB5
uint8_t AESkey[] = { 0x4B, 0xFA, 0x1A, 0xBB,
0xC9, 0x87, 0x51, 0x83,
0x6D, 0x2A, 0x98, 0xDC,
0x98, 0xC1, 0xBE, 0xB5, 0x00 };
uint8_t AESdataENC[] = { 0x41, 0x42, 0x43, 0x44,
0x40, 0x31, 0x32, 0x33, 0x00 };
I båda fallen så avkodas de AES kodade paketen av till samma originalpaket. Det man kan se, när AESkey ligger över AESdataENC, är att de sista 9 teckenparen i det AES kodade paketet är detsamma som de nia sista teckenparen i AESkey.. Det kan väl då inte vara bra?
Så fortfarande blandas två variabler ihop, i slutändan får jag ju ut samma paket som jag från början kodar, men längden skiljer sig ju avsevärt..
Som ni kan se så är ju både AESkey[] och AESdataENC[] "avslutade" med 0x00. Ändå går variablerna ihop.. på något sätt?
Vad kan vara fel?