arduino crc

Başlatan uardal, 25 Temmuz 2017, 15:11:59

uardal

Merhaba

Aşağıda pic için protonda kullandığım bir crc kodu var ve bunu arduino için çevirmeye çalıştım fakat doğru değerleri alamadım. Konuyla ilgili arkadaşlar yardımcı olabilirlerse çok sevinirim.
proton kod 'u
crc__16:
 crc = $FFFF  'seed value as per modbus
 i = 0
 j = 0
 Repeat
    crc = crc ^ buffer[i]  
    Repeat
    If crc.0 = 1 Then
      	crc = $A001^ (crc >> 1) 'xor to polynomial 0xA001 as per modbus rtu protocol
          Else
            crc = crc >> 1
        EndIf
     Inc j
    Until j > 7
  Inc i
 Until i > length
       								

crc16[0] = crc Mod 256  'CRC16 low byte
crc16[1] = crc / 256  'CRC16 high byte
 Return


Arduino kod'u
void crc__16(){
 crc = 0xFFFF ; //seed value as per modbus
 z = 0;
 j = 0;
 do
 {
    crc = crc ^ bufferc[z] ; 
   do
   {
  bool k=0;
  k=bitRead(crc,0);
    if (k == 1){ 
        crc = 0xA001  ^ (crc >> 1); //xor to polynomial 0xA001 as per modbus rtu protocol
    }
          else
          {
            crc = crc >> 1;
   
    }
     j++;
   }while (j > 7);
  z++;
}while (z >lenght);
                      

crc16[0] = crc % 256;  //CRC16 low byte
crc16[1] = crc / 256 ; //CRC16 high byte
}

Cemre.


uardal

Anlayamadım Cemre bey fark nerede acaba?

Cemre.

#3
Hocam kusura bakmayın, mesaj yarım gitmiş, internet kötüydü.

while (z<lenght); doğrusu küçüktür olmalı sanıyorum. Başka hata varsa da ben fark edemedim.

CRC_Status_Typedef MODBUS_CRC_Calculate(uint8_t *pData, uint8_t Length, uint8_t *pCRC)
{
	uint8_t i;
	uint16_t Calc_CRC = 0xFFFF;
	
	if (Length < 1)
	{
		return CRC_Error;
	}
	
	while (Length--)
	{
		Calc_CRC ^= (uint16_t) (*pData++);
		for (i = 0; i < 8; i++)
		{
			if (Calc_CRC & 0x01)
			{
				Calc_CRC = (Calc_CRC >> 1) ^ (0xA001);
			}
			else
			{
				Calc_CRC = (Calc_CRC >> 1);
			}
		}
	}
	
	*pCRC = (uint8_t) (Calc_CRC & 0x00FF);
	pCRC++;
	*pCRC = (uint8_t) ((Calc_CRC & 0xFF00) >> 8);
	return CRC_OK;
}


Benim kullandığım ve çalışan kod.

uardal

Ustteki proton kodunda > kullanilmis ve calisiyor bende ondan cevirdim. Pic ve ardino haberlesecegi icin ayni sonucu almam gerekiyor. Yarin sizin kodlarida inceleyip bir bakayim. Tesekkur ederim.

ByTEK

Defalarca karsilastirdim ama fark göremedim. Sadece değişken isimleri farkli. Çözerseniz nedenini merak ettim. Elde ettiğiniz değerler nasıldır ?




uardal

Sercan bey girdi değerlerini değiştirmeme rağmen hep benzer rakamlar alıyorum.  Cemre beyin kod unu deneyeceğim ama arduinoda çokta iyi sayılmam, en baştaki satırı nasıl tanımlicam anlayamadım. derlerken hata veriyor.

CRC_Status_Typedef MODBUS_CRC_Calculate(uint8_t *pData, uint8_t Length, uint8_t *pCRC)

hata mesajı:

exit status 1
'CRC_Status_Typedef' does not name a type


Cemre.

Alıntı yapılan: uardal - 26 Temmuz 2017, 12:43:06
Sercan bey girdi değerlerini değiştirmeme rağmen hep benzer rakamlar alıyorum.  Cemre beyin kod unu deneyeceğim ama arduinoda çokta iyi sayılmam, en baştaki satırı nasıl tanımlicam anlayamadım. derlerken hata veriyor.

CRC_Status_Typedef MODBUS_CRC_Calculate(uint8_t *pData, uint8_t Length, uint8_t *pCRC)

hata mesajı:

exit status 1
'CRC_Status_Typedef' does not name a type

> işareti UNTIL ile kullanılmış. Siz do while döngüsüne > yazarsanız döngüye sadece bir kez girer ve biter.