574
Kommentar: layout fix
|
3585
embedd sendoutdata and decode64
|
Gelöschter Text ist auf diese Art markiert. | Hinzugefügter Text ist auf diese Art markiert. |
Zeile 1: | Zeile 1: |
[[TableOfContents]] |
|
Zeile 2: | Zeile 4: |
[[ImageLink(http://gallery.mikrokopter.de/main.php?g2_view=core.DownloadItem&g2_itemId=870,http://gallery.mikrokopter.de/main.php/v/uploads/str_DebugOut.jpg.html)]] |
. The protocol is based on individual serial data frames that are organized as shown in the following table. ||<tablewidth="690px" tableheight="43px" tablestyle="text-align: center;"bgcolor="#cccccc">Start-Byte||<bgcolor="#cccccc">Address-Byte||<bgcolor="#cccccc">ID-Byte||<bgcolor="#cccccc">n Data-Bytes coded||<bgcolor="#cccccc">CRC-Byte1||<bgcolor="#cccccc">CRC-Byte2||<bgcolor="#cccccc">Stop-Byte|| ||<style="text-align: center;">'#' ||<style="text-align: center;">variable ||<style="text-align: center;">'V','D' etc ||<style="text-align: center;">"modified-base64" ||<style="text-align: center;">variable ||<style="text-align: center;">variable ||<style="text-align: center;">'\r' || |
Zeile 5: | Zeile 9: |
. The Commands are listed [:en/SerialCommands:here] | . The Commands based on the dataframes above are listed [:en/SerialCommands:here] |
Zeile 8: | Zeile 12: |
|| ''Slave-Address'' || ''Part'' || || 1 || FC || || 2 || NC || || 3 || MK3MAG || |
||<tablewidth="" tablestyle="text-align: center;"bgcolor="#cccccc">Slave-Address||<bgcolor="#cccccc">Part|| ||<style="text-align: center;"> 1 ||<style="text-align: center;"> FC || ||<style="text-align: center;"> 2 ||<style="text-align: center;"> NC || ||<style="text-align: center;"> 3 ||<style="text-align: center;"> MK3MAG || = Data Format = Have a look into the Functions Decode64 and !SendOutData in uart.c of the FC Firmware to see how the Data is encoded and decoded: {{{#!cplusplus void SendOutData(unsigned char cmd,unsigned char modul, unsigned char *snd, unsigned char len) { unsigned int pt = 0; unsigned char a,b,c; unsigned char ptr = 0; SendeBuffer[pt++] = '#'; // Start-Byte SendeBuffer[pt++] = modul; // Adress SendeBuffer[pt++] = cmd; // Command while(len) { if(len) { a = snd[ptr++]; len--;} else a = 0; if(len) { b = snd[ptr++]; len--;} else b = 0; if(len) { c = snd[ptr++]; len--;} else c = 0; SendeBuffer[pt++] = '=' + (a >> 2); SendeBuffer[pt++] = '=' + (((a & 0x03) << 4) | ((b & 0xf0) >> 4)); SendeBuffer[pt++] = '=' + (((b & 0x0f) << 2) | ((c & 0xc0) >> 6)); SendeBuffer[pt++] = '=' + ( c & 0x3f); } AddCRC(pt); } void Decode64(unsigned char *ptrOut, unsigned char len, unsigned char ptrIn,unsigned char max) { unsigned char a,b,c,d; unsigned char ptr = 0; unsigned char x,y,z; while(len) { a = RxdBuffer[ptrIn++] - '='; b = RxdBuffer[ptrIn++] - '='; c = RxdBuffer[ptrIn++] - '='; d = RxdBuffer[ptrIn++] - '='; if(ptrIn > max - 2) break; // dont process more data than recieved x = (a << 2) | (b >> 4); y = ((b & 0x0f) << 4) | (c >> 2); z = ((c & 0x03) << 6) | d; if(len--) ptrOut[ptr++] = x; else break; if(len--) ptrOut[ptr++] = y; else break; if(len--) ptrOut[ptr++] = z; else break; } } }}} . /!\ ToDo: describe data-format = Checksum = {{{#!cplusplus unsigned int tmpCRC = 0; for(int i = 0; i < DataBufferLength;i++) { tmpCRC += DataBuffer[i]; } tmpCRC %= 4096; CRC1 = '=' + tmpCRC / 64; CRC2 = '=' + tmpCRC % 64; }}} . /!\ ToDo: describe checksum calculation verbaly = Implementations = Sometimes its a lot more easy to look at code rather than reather than to look at Specifications/Documentation: * uart.c in the Flight-Ctrl Firmware ( C ) * MKCommunicator.java from ["DUBwise"] ( Java / J2ME ) * mktool.cpp @ ["QMKGroundStation"] ( C++ ) * !GroundStation ( !LabView ) |
Zeile 14: | Zeile 89: |
Protocol
- The protocol is based on individual serial data frames that are organized as shown in the following table.
Start-Byte
Address-Byte
ID-Byte
n Data-Bytes coded
CRC-Byte1
CRC-Byte2
Stop-Byte
'#'
variable
'V','D' etc
"modified-base64"
variable
variable
'\r'
Commands
The Commands based on the dataframes above are listed [:en/SerialCommands:here]
Slave Adresses
Since Navi 0.12h FC 0.71f Mag 0.19 there are constant SlaveAdresses:
Slave-Address
Part
1
FC
2
NC
3
MK3MAG
Data Format
Have a look into the Functions Decode64 and SendOutData in uart.c of the FC Firmware to see how the Data is encoded and decoded:
1 void SendOutData(unsigned char cmd,unsigned char modul, unsigned char *snd, unsigned char len) 2 { 3 unsigned int pt = 0; 4 unsigned char a,b,c; 5 unsigned char ptr = 0; 6 7 SendeBuffer[pt++] = '#'; // Start-Byte 8 SendeBuffer[pt++] = modul; // Adress 9 SendeBuffer[pt++] = cmd; // Command 10 11 while(len) 12 { 13 if(len) { a = snd[ptr++]; len--;} else a = 0; 14 if(len) { b = snd[ptr++]; len--;} else b = 0; 15 if(len) { c = snd[ptr++]; len--;} else c = 0; 16 SendeBuffer[pt++] = '=' + (a >> 2); 17 SendeBuffer[pt++] = '=' + (((a & 0x03) << 4) | ((b & 0xf0) >> 4)); 18 SendeBuffer[pt++] = '=' + (((b & 0x0f) << 2) | ((c & 0xc0) >> 6)); 19 SendeBuffer[pt++] = '=' + ( c & 0x3f); 20 } 21 AddCRC(pt); 22 } 23 24 void Decode64(unsigned char *ptrOut, unsigned char len, unsigned char ptrIn,unsigned char max) 25 { 26 unsigned char a,b,c,d; 27 unsigned char ptr = 0; 28 unsigned char x,y,z; 29 while(len) 30 { 31 a = RxdBuffer[ptrIn++] - '='; 32 b = RxdBuffer[ptrIn++] - '='; 33 c = RxdBuffer[ptrIn++] - '='; 34 d = RxdBuffer[ptrIn++] - '='; 35 if(ptrIn > max - 2) break; // dont process more data than recieved 36 37 x = (a << 2) | (b >> 4); 38 y = ((b & 0x0f) << 4) | (c >> 2); 39 z = ((c & 0x03) << 6) | d; 40 41 if(len--) ptrOut[ptr++] = x; else break; 42 if(len--) ptrOut[ptr++] = y; else break; 43 if(len--) ptrOut[ptr++] = z; else break; 44 } 45 46 }
ToDo: describe data-format
Checksum
ToDo: describe checksum calculation verbaly
Implementations
- Sometimes its a lot more easy to look at code rather than reather than to look at Specifications/Documentation:
- uart.c in the Flight-Ctrl Firmware ( C )
- MKCommunicator.java from ["DUBwise"] ( Java / J2ME )
- mktool.cpp @ ["QMKGroundStation"] ( C++ )
GroundStation ( LabView )
Links