Herkese iyi akşamlar. STM32de USART ile bir circular buffer yapısı oluşturup haberleşmek istiyorum. Normal callback fonskiyonuyla yapmak istediğimi yapabiliyorum fakat circular buffer yapısında bir veri geldiği zaman işlemci verinin sadece bir byteni alıyor ve kesmenin içinden çıkmıyor. Bütün her şeyi denedim kesmenin içinde kesme bayrağını indirdim. Fakat RX buffer dolu olduğu için kesmenin içinde kalıyor aynı zamanda data registerınıda okumuyor. Çok kafam karıştır yardımınızı bekliyorum. İşlemcim stm32f7 UART8 birimini kullanıyorum.
https://github.com/controllerstech/stm32-uart-ring-buffer/blob/master/Src/UartRingbuffer.c
kütüphaneyi esinlendiğim yer burası mantık olarak aynısı sadece işime yarayanları aldım.
Aynı sorunu bende yaşamıştım ben hal kütüphanesi ile çalışıyorum. Sorunu aslında read komutu gönderirken istemiş olduğumuz uzunluk eğer 1 den yukarı olursa kesmeden çıkmıyor. ben recevice isterken 1 olarak veriyorum size sorun kalmadı.
Hocam işte sorun burda başlıyor. HAL kütüphanelerinde verileri istiyosunuz ve gelcek veriyi uzunluğuyla beraber belirtiyorsunuz. Benim yapmaya çalıştığım bir mesaj düştüğünde direkt USART2->IRQHandlere gidip ordan verileri tek tek okumasını istiyorum.
Bu tarz durumlarda lütfen kodu da paylaşın ki buradaki arkadaşlar kodunuza bakarak nerede hata olabileceğini söylesin.
Hocam yukarıda paylaştım kesme fonksiyonum aynısı
Ben konu ile alakalı aşağıdaki gibi bir mantık ile sorunu çözdüm inşallah işine yarar. Flag kullanarak. Ben register mantığına daha nail olamadım hal'den yavaş yavaş öğrenerek register yazarak yazmaçlara geçeceğim. kod mantığım aşağıda işine yararsa
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
if (huart == &huart2) {
comBufferFlag = _comBufferFlag;
switch (comBufferFlag) {
case deviceStartFlag:
if (RxBuffer[0] == 0xCA) {
ComBuffer[ComBufferSize] = RxBuffer[0];
ComBufferSize++;
_comBufferFlag = deviceAddresFlag;
}
break;
case deviceAddresFlag:
if (RxBuffer[0] == DeviceAddress || RxBuffer[0] == 0x00) {
ComBuffer[ComBufferSize] = RxBuffer[0];
ComBufferSize++;
_comBufferFlag = deviceTransactionFlag;
} else {
BufferClean(ComBuffer, 0);
ComBufferSize = 0;
_comBufferFlag = deviceStartFlag;
}
break;
case deviceTransactionFlag:
ComBuffer[ComBufferSize] = RxBuffer[0];
comTransaction = RxBuffer[0];
ComBufferSize++;
switch (comTransaction) {
case device_Command:
_comBufferFlag = deviceCommandFlag;
break;
case device_UDataReq:
_comBufferFlag = deviceCommandFlag;
break;
case device_Polling:
_comBufferFlag = deviceStopFlag;
break;
case device_ACK:
_comBufferFlag = deviceStopFlag;
break;
case device_EOT:
_comBufferFlag = deviceStopFlag;
break;
}
break;
case deviceCommandFlag:
ComBuffer[ComBufferSize] = RxBuffer[0];
comCommandType = RxBuffer[0];
ComBufferSize++;
if (comTransaction == device_Command)
_comBufferFlag = deviceStopFlag;
else
_comBufferFlag = deviceDataLength;
break;
case deviceDataLength:
ComBuffer[ComBufferSize] = RxBuffer[0];
comDataSize = RxBuffer[0];
ComBufferSize++;
_comBufferFlag = deviceData;
break;
case deviceData:
ComBuffer[ComBufferSize] = RxBuffer[0];
ComBufferSize++;
comDataSize--;
if (comDataSize == 0)
_comBufferFlag = deviceStopFlag;
break;
case deviceStopFlag:
ComBuffer[ComBufferSize] = RxBuffer[0];
comDataSize = RxBuffer[0];
ComBufferSize++;
isCommunicationBuff = 1;
ComBufferSize = 0;
Communication_Main_Worker();
_comBufferFlag = deviceStartFlag;
break;
}
HAL_UART_Receive_IT(&huart2, RxBuffer, 1);
}
}
@mcaltindal hocam burda recieve_it fonskiyonunu whileden önce mi çağırıyorsunuz yoksa whileın içinde mi
while'den önce çağırıyorum. ondan sonra her HAL_UART_RxCpltCallback fonksiyonuna girdiğinde sonuna tekrar tetik yapıyorum ki sürekli okuma modunda kalıyor.
Anladım hocam teşekkür ederim. Ama yapmak istediğim bu değildi konu hala güncel