0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

STM32G031でMAVLinkのCRCで遊ぶ

Last updated at Posted at 2022-05-19

x 動作確認済み2022/5/20 0:58

X 株式会社センシンロボティクスの記事を非営利、研究調査目的で引用します。

目的
MAVLinkは、今時流行りのドローンの高度や位置のログを送る
プロトコルらしい
持ってないけど
MAVLinkのパケット構造は、簡単だけど
CRCの計算がいまだかって理解できないがソースがあるので適当にぱくって
都合よくマイコンに実装する
なんか、送信、受信でCRC_EXTRAと称する
固定化された暗号キーみたいなが必要になるらしい
ラジコンのマニュアルに00とか124とか書いてある物が必要らしいが
適当に124とする。
読める、読めるぞ(ラピタふう)

dfを除いたヘッダー部分が43558になれば当たりらしい
初期値値は、X25_INIT_CRC 0xffff

32 00 00 ca 01 01 7a e6 00

0x0e,0x04,0x19... が 63626になっていれば、正しいらしい

[EF]13395
[D7]35224

たぶんEFが間違いでD7が正しい?

o_con464.jpg

いろいろ
ほぼ、ドローン自体も需要がないし、やつている人もいないと推定され
アナログサーボ信号をシリアルのバイナリに変換する方が需要(一日で100カウント)が
あるがひまで多少理解できるので作ってみる
ふろ行ってくらーー2022/5/19 21:09
もう、めんどいので(完成)とする2022/5/20 0:59
検索ロボットと外人は、結構いそうな気かするが
ドローンやっている人で100カウントいくんか?
なんか100カウント行きそうなんだけど!!
完全になめぷ

引用元 株式会社センシンロボティクス

STM32G031のプログラム(完成)




//MAVLink_CRC_031_1


#include <Arduino.h>


char c_hex[] = {'0', '1', '2', '3', '4', '5', '6', '7',
                '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };

void p_hex(unsigned char x){

  //ヘキサに値を設定
  // packet move
  char out_buff[8];
  out_buff[0] = '[';
  out_buff[1] = c_hex[(x >> 4) & 0x0f];
  out_buff[2] = c_hex[x & 0x0f];
  out_buff[3] = ']';
  out_buff[4] = 0x00;

  //送信処理
  //send 8 byte
  Serial.print(out_buff);

    
}//printf_hex


void crc_accumulate(unsigned char data, unsigned short *crcAccum)
{
    
    
    p_hex(data);
    
    
    unsigned char tmp;

    tmp = data ^ (unsigned char)(*crcAccum &0xff);
    tmp ^= (tmp<<4);
    *crcAccum = (*crcAccum>>8) ^ (tmp<<8) ^ (tmp <<3) ^ (tmp>>4);

}//crc_accumulate


unsigned short crc_calculate(unsigned char *pBuffer, int length)
{
    unsigned short crcTmp = 0xffff; //X25_INIT_CRC

    for(int ii=0;ii<length;ii++){
        crc_accumulate(pBuffer[ii] , &crcTmp);
    }
    return crcTmp;
}//crc_calculate


void crc_accumulate_buffer(unsigned short *crcAccum, char *pBuffer, int length)
{
  unsigned char *p = (unsigned char*)pBuffer;

  for(int ii=0;ii<length;ii++){
                crc_accumulate(p[ii], crcAccum);
        }
}//crc_accumulate_buffer


//初期化
void setup() {

  delay(3000); //not Delete

  Serial.begin(9600);

  Serial.print("<ST>\r\n");

} //setup


//メインループ
void loop()
{

    unsigned char buff1[] = { 0x32,0x00,0x00,0xca,0x01,0x01,0x7a,0xe6,0x00 };
    
             char buff2[] = {                     0x0e,0x04,0x19,0x0f,0x0f,0x0f,
0x0f,0x0f,0x0f,0x0f,0x0f,0x0c,0x00,0x00,0x0f,0xff,0xff,0xff,0xff,0xff,0x0f,0xff,
0xff,0xff,0xff,0xff,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x0f,0x0f };
    
    
    Serial.print("START\r\n");
    
    
    unsigned short ret = crc_calculate(buff1, 9);
    
    Serial.print("\r\n");
    
    Serial.println(ret);

    
    unsigned short checksum = 43558;
    
    crc_accumulate_buffer(&checksum, buff2, 50);
    
    Serial.print("\r\n");
    
    Serial.println(checksum);
    
    /*
    unsigned short chk=0;
    for(int ii=0;ii<256;ii++){
        
        chk = 63626;
        crc_accumulate((unsigned char)ii,&chk);
        printf("%d\r\n",chk);
    
    }//for
    */
    
    
    unsigned short chk=0;
    chk = 63626;
    crc_accumulate((unsigned char)0xEF,&chk);
    Serial.println(chk);
 
    
    chk = 63626;
    crc_accumulate((unsigned char)0xD7,&chk);
    Serial.println(chk);
 

  //2秒の待ち
  delay(2000);    //debug

} //loop





名前は、まだない その1 43558なので(完成)とする


START
[32][00][00][CA][01][01][7A][E6][00]
43558



#include <stdio.h>



char c_hex[] = {'0', '1', '2', '3', '4', '5', '6', '7',
                '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };

void p_hex(unsigned char x){

  //ヘキサに値を設定
  // packet move
  char out_buff[8];
  out_buff[0] = '[';
  out_buff[1] = c_hex[(x >> 4) & 0x0f];
  out_buff[2] = c_hex[x & 0x0f];
  out_buff[3] = ']';
  out_buff[4] = 0x00;

  //送信処理
  //send 8 byte
  printf(out_buff);

    
}//printf_hex


void crc_accumulate(unsigned char data, unsigned short *crcAccum)
{
    
    
    p_hex(data);
    
    
    unsigned char tmp;

    tmp = data ^ (unsigned char)(*crcAccum &0xff);
    tmp ^= (tmp<<4);
    *crcAccum = (*crcAccum>>8) ^ (tmp<<8) ^ (tmp <<3) ^ (tmp>>4);
    
    //*crcAccum = 0x1234;
}


unsigned short crc_calculate(unsigned char *pBuffer, unsigned short length)
{
    unsigned short crcTmp = 0xffff; //X25_INIT_CRC

    for(int ii=0;ii<length;ii++){
        crc_accumulate(pBuffer[ii] , &crcTmp);
    }
    return crcTmp;
}




int main(void){
    // Your code here!
    
    unsigned char buff1[] = { 0x32,0x00,0x00,0xca,0x01,0x01,0x7a,0xe6,0x00 };
    
    
    printf("START\r\n");
    
    
    unsigned short ret = crc_calculate(buff1, 9);
    
    printf("\r\n");
    
    printf("%d",ret);
    
    
    
}//main


名前は、まだない その2 63626になっているので(完成)



START
[32][00][00][CA][01][01][7A][E6][00]
43558
[0E][04][19][0F][0F][0F][0F][0F][0F][0F][0F][0C][00][00][0F][FF][FF][FF][FF][FF][0F][FF][FF][FF][FF][FF][0F][0F][0F][0F][0F][0F][0F][0F][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][00][00][00][00][0F][0F]
63626
[EF]13395
[D7]35224


#include <stdio.h>



char c_hex[] = {'0', '1', '2', '3', '4', '5', '6', '7',
                '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };

void p_hex(unsigned char x){

  //ヘキサに値を設定
  // packet move
  char out_buff[8];
  out_buff[0] = '[';
  out_buff[1] = c_hex[(x >> 4) & 0x0f];
  out_buff[2] = c_hex[x & 0x0f];
  out_buff[3] = ']';
  out_buff[4] = 0x00;

  //送信処理
  //send 8 byte
  printf(out_buff);

    
}//printf_hex


void crc_accumulate(unsigned char data, unsigned short *crcAccum)
{
    
    
    p_hex(data);
    
    
    unsigned char tmp;

    tmp = data ^ (unsigned char)(*crcAccum &0xff);
    tmp ^= (tmp<<4);
    *crcAccum = (*crcAccum>>8) ^ (tmp<<8) ^ (tmp <<3) ^ (tmp>>4);

}//crc_accumulate


unsigned short crc_calculate(unsigned char *pBuffer, int length)
{
    unsigned short crcTmp = 0xffff; //X25_INIT_CRC

    for(int ii=0;ii<length;ii++){
        crc_accumulate(pBuffer[ii] , &crcTmp);
    }
    return crcTmp;
}//crc_calculate


void crc_accumulate_buffer(unsigned short *crcAccum, char *pBuffer, int length)
{
	unsigned char *p = (unsigned char*)pBuffer;

	for(int ii=0;ii<length;ii++){
                crc_accumulate(p[ii], crcAccum);
        }
}//crc_accumulate_buffer


int main(void){
    // Your code here!
    
    unsigned char buff1[] = { 0x32,0x00,0x00,0xca,0x01,0x01,0x7a,0xe6,0x00 };
    
             char buff2[] = {                     0x0e,0x04,0x19,0x0f,0x0f,0x0f,
0x0f,0x0f,0x0f,0x0f,0x0f,0x0c,0x00,0x00,0x0f,0xff,0xff,0xff,0xff,0xff,0x0f,0xff,
0xff,0xff,0xff,0xff,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x0f,0x0f };

    
    
    printf("START\r\n");
    
    
    unsigned short ret = crc_calculate(buff1, 9);
    
    printf("\r\n");
    
    printf("%d\r\n",ret);
    
    unsigned short checksum = 43558;
    
    crc_accumulate_buffer(&checksum, buff2, 50);
    
    printf("\r\n");
    
    printf("%d\r\n",checksum);
    
    /*
    unsigned short chk=0;
    for(int ii=0;ii<256;ii++){
        
        chk = 63626;
        crc_accumulate((unsigned char)ii,&chk);
        printf("%d\r\n",chk);
    
    }//for
    */
    
    
    unsigned short chk=0;
    chk = 63626;
    crc_accumulate((unsigned char)0xEF,&chk);
    printf("%d\r\n",chk);
 
    
    chk = 63626;
    crc_accumulate((unsigned char)0xD7,&chk);
     printf("%d\r\n",chk);
 
    
    
}//main


0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?