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
}
while (z >lenght);
Anlayamadım Cemre bey fark nerede acaba?
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.
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.
Defalarca karsilastirdim ama fark göremedim. Sadece değişken isimleri farkli. Çözerseniz nedenini merak ettim. Elde ettiğiniz değerler nasıldır ?
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
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.