İyi günler,
Freemodbus kütüphanesini M031 için port ettim. UART ve TIMER için gerekli ayarları da yaptım. Projeyi KEIL de hatasız derliyorum ancak MODBUS POLL programında sürekli TIMEOUT hatası alıyorum. İlk önce TIMER ayarını doğru yapmadım diye düşündüm ancak debug ederken eMBRTUReceive() fonksiyonunun IO hatası döndürdüğünü gördüm. bu IO hatası nedir ve neyi yanlış yapıyorum anlayamadım. Yardımcı olabilecek fikirlere açığım. eMBErrorCode
eMBRTUReceive( UCHAR * pucRcvAddress, UCHAR ** pucFrame, USHORT * pusLength )
{
BOOL xFrameReceived = FALSE;
eMBErrorCode eStatus = MB_ENOERR;
ENTER_CRITICAL_SECTION( );
assert( usRcvBufferPos < MB_SER_PDU_SIZE_MAX );
if( ( usRcvBufferPos >= MB_SER_PDU_SIZE_MIN )
&& ( usMBCRC16( ( UCHAR * ) ucRTUBuf, usRcvBufferPos ) == 0 ) )
{
*pucRcvAddress = ucRTUBuf[MB_SER_PDU_ADDR_OFF];
*pusLength = ( USHORT )( usRcvBufferPos - MB_SER_PDU_PDU_OFF - MB_SER_PDU_SIZE_CRC );
*pucFrame = ( UCHAR * ) & ucRTUBuf[MB_SER_PDU_PDU_OFF];
xFrameReceived = TRUE;
}
else
{
eStatus = MB_EIO;
printf("/n MB_EIO ");
}
EXIT_CRITICAL_SECTION( );
return eStatus;
}
ucRTUBuf'u print etmeye çalışın ve gerçekten göndermek istediğiniz datayı mı içeriyor ona bakabilirsiiz
Hocam önce modlink le çalışabilirsiniz. Sorguları tek tek atıp adım adım debug yaparsınız. Paketi düzgün bir şekilde alıp almadığına emin olursunuz. Ondan sonra doğru bir şekilde cevap hazırlama kısmına geçersiniz. Ardından da hazırlanan cevabı doğru bir şekilde gönderme kısmı üzerinde çalışabilirsin. En son emin olduktan sonra modbus poll ile testlere devam edebilirsin.
robikod'un dediğini denedim. Masterdan gelen veri ile ucRTUBuf uyuşmuyor. Daha önce de freemodbus ile bir kaç proje yapmıştım ama üzerinden epey vakit geçti. UART birimini mi doğru kuramıyorum acaba. CLK_EnableModuleClock(UART1_MODULE);
CLK_SetModuleClock(UART1_MODULE, CLK_CLKSEL1_UART1SEL_HIRC, CLK_CLKDIV0_UART1(1));
SYS->GPA_MFPL = (SYS->GPA_MFPL & ~(SYS_GPA_MFPL_PA2MFP_Msk | SYS_GPA_MFPL_PA3MFP_Msk)) | \
(SYS_GPA_MFPL_PA2MFP_UART1_RXD | SYS_GPA_MFPL_PA3MFP_UART1_TXD);
SYS_ResetModule(UART1_RST);
UART_SetLine_Config(UART1, ulBaudRate, ucDataBits, parity, UART_STOP_BIT_1);
NVIC_SetPriority(UART1_IRQn, 0);
NVIC_EnableIRQ(UART1_IRQn);
freemodbus'ı daha önce kullanmadım. Kendi yazdığım modbus kütüphanesini genelde port ediyorum. Test ederken modlink her zaman ilk olarak daha kullanışlı oluyor. Modbus Poll sürekli sorgu attığından ilk çalıştırırken çok kullanışlı olmuyor. Sonradan uzun testler için daha uygun oluyor.