Onaylı Üye Muhammed Selim Erkühük 11 Oluşturuldu: 26 Ekim, 2020 Onaylı Üye Share Oluşturuldu: 26 Ekim, 2020 Normal şartlar altında soru sormayı pek sevmem. Günlerden beri MODBUS'ın kendi sitesinde yayınladığı bir fonksiyon ile uğraşıyorum. Anladığım kadarı ile fonksiyon dışarıdan bir dizi ve dizinin boyutunu alarak çalışıyor. Birazcık modifiye ederek, fonksiyona tamsayı bir değer göndererek çalıştırmayı başardım.Fakat benim dizinin CRC'sini hesaplamam gerekiyor. Fonksiyonu kullanırken nerede hata yaptığımı anlamış değilim. MODBUS protokolü ile uğraştığımdan,sürekli CRC hesaplamam gerekiyor. Fonksiyonu ve fonksiyonun geçtiği dökümanı aşağı bırakıyorum.Programı bir gömülü sistemde çalıştırmam gerekiyor.Kodumun en başına fonksiyonu kullanacağımı aşağıdaki komut ile bildiriyorum. unsigned short CRC16( unsigned short puchMsg[], unsigned short usDataLen); Ardından CRC_16 fonksiyonu için dizi ve değişkenleri tanımlıyorum. uint8_t Adress=0x11; uint8_t Function_Code=0x03; uint8_t Start_Address_High_Byte= 0x00; uint8_t Start_Address_Low_Byte=0x00; uint8_t Number_Register_High_Byte= 0x00; uint8_t Number_Register_Low_Byte= 0x03; uint8_t Crc_High=0x5B; uint8_t Crc_Low=0x07; uint8_t CRC_dizi[6]={Adress,Function_Code,Start_Address_High_Byte,Start_Address_Low_Byte,Number_Register_High_Byte,Number_Register_Low_Byte}; Fonksiyonuda şu şekilde kullanıyorum. Crc_Recieve= CRC16(CRC_dizi,sizeof(CRC_dizi)); Hata ayıklama modunda baktığımda hesaplamak istediğim değerlerin fonksiyona iletilmediğini gözlemliyorum. Not:Kod bilgisayar ortamında hafıza hatası verdirtiyor.Denemeleri STM32 kartımda yapıyorum. İlgili dökümanın son sayfasından fonksiyona ulaşabilirsiniz. unsigned short CRC16 ( puchMsg, usDataLen ) /* The function returns the CRC as a unsigned short type */ unsigned char *puchMsg ; /* message to calculate CRC upon */ unsigned short usDataLen ; /* quantity of bytes in message */ { unsigned char uchCRCHi = 0xFF ; /* high byte of CRC initialized */ unsigned char uchCRCLo = 0xFF ; /* low byte of CRC initialized */ unsigned uIndex ; /* will index into CRC lookup table */ while (usDataLen--) /* pass through message buffer */ { uIndex = uchCRCLo ^ *puchMsg++ ; /* calculate the CRC */ uchCRCLo = uchCRCHi ^ auchCRCHi[uIndex] ; uchCRCHi = auchCRCLo[uIndex] ; } return (uchCRCHi << 8 | uchCRCLo) ; } static unsigned char auchCRCHi[] = { 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 } ; Low-Order Byte Table /* Table of CRC values for low–order byte */ static char auchCRCLo[] = { 0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3, 0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A, 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26, 0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F, 0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5, 0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C, 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C, 0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83, 0x41, 0x81, 0x80, 0x40 }; 1 Alıntı İletiye bağlantı Sitelerde Paylaş
şenol eker 50 15 Kasım, 2020 gönderildi Share 15 Kasım, 2020 gönderildi Benim gözüm burada bir yere takıldı: Örneğin: unsigned short CRC16 ( puchMsg, usDataLen ) burada ne { ile bir fonksiyon başlatılmış, ne de sonuna ; konarak bir deklarasyon yapılmış. Yani ; ve { karakterinde eksikler mi var ya da yanlışlıklar? Yahut, bu benim bildiğim C'den farklı bir dil mi? 1 Alıntı İletiye bağlantı Sitelerde Paylaş
Onaylı Üye Muhammed Selim Erkühük 11 23 Kasım, 2020 gönderildi Yazar Onaylı Üye Share 23 Kasım, 2020 gönderildi şenol eker, 11/15/2020 - 11:43 PM yazdı: Benim gözüm burada bir yere takıldı: Örneğin: unsigned short CRC16 ( puchMsg, usDataLen ) burada ne { ile bir fonksiyon başlatılmış, ne de sonuna ; konarak bir deklarasyon yapılmış. Yani ; ve { karakterinde eksikler mi var ya da yanlışlıklar? Yahut, bu benim bildiğim C'den farklı bir dil mi? Bu kod bu şekilde derlendiğinde hata veriyordu. Kodu MODBUS'ın kendi sitesindeki dökümandan kopyalamıştım. Haklısınız, atlamışım,bu fonksiyon bu şekilde çalışmıyor. Derleyici hata veriyor. Bazı düzenlemelerin ardında çalıştırabilmiştim. Fakat doğru sonucu hesaplamıyordu. Bende daha fazla uğraşmayıp, şu linkteki MODBUS CRC kodunu kullanmıştım.Bah settiğiniz kısma gelecek olursa, ben burya düzenlenmemiş halini yüklemişim. Orjinal kodun linkini veriyorum. Bağlantısını verdiğim dökümanın sonundan kodu inceleyebilirsiniz. Kodu düzenleyip istediğim gibi çalıştıramayınca ilk bağlantıdaki açık kaynaklı CRC programını kullandım. Sorunu çözememiş olsam da etrafından dolaştım. 1 Alıntı İletiye bağlantı Sitelerde Paylaş
şenol eker 50 24 Kasım, 2020 gönderildi Share 24 Kasım, 2020 gönderildi Linkini verdiğiniz dokümanın "6.2 Appendix B - LRC/CRC Generation" bölümünde gayet güzel anlatılmış aslında. Baştaki "colon" ve sondaki "CR" haricinde tüm baytları 8 bitlik bir değişkende topluyoruz. Elde ettiğimiz değeri hexadecimal olarak (2 byte) CR'den hemen önce koyuyoruz. Alıntı İletiye bağlantı Sitelerde Paylaş
şenol eker 50 24 Kasım, 2020 gönderildi Share 24 Kasım, 2020 gönderildi unsigned short CRC16 ( unsigned char *puchMsg, unsigned short usDataLen ) /* The function returns the CRC as a unsigned short type */ { unsigned char uchCRCHi = 0xFF ; /* high byte of CRC initialized */ unsigned char uchCRCLo = 0xFF ; /* low byte of CRC initialized */ unsigned uIndex ; /* will index into CRC lookup table */ while (usDataLen--) /* pass through message buffer */ { uIndex = uchCRCLo ^ *puchMsg++ ; /* calculate the CRC */ uchCRCLo = uchCRCHi ^ auchCRCHi[uIndex] ; uchCRCHi = auchCRCLo[uIndex] ; } return (uchCRCHi << 8 | uchCRCLo) ; } Belki dokümanı yazan bunu kastetmiştir. Bir dener misin? Alıntı İletiye bağlantı Sitelerde Paylaş
Önerilen İletiler
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.