USART KESME SORUNU

Başlatan flowchartx, 26 Eylül 2022, 19:38:34

flowchartx

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.

mcaltindal

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ı.

flowchartx

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.

Kırambor

Bu tarz durumlarda lütfen kodu da paylaşın ki buradaki arkadaşlar kodunuza bakarak nerede hata olabileceğini söylesin.

flowchartx

Hocam yukarıda paylaştım kesme fonksiyonum aynısı

mcaltindal

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);
    }
}

flowchartx

@mcaltindal hocam burda recieve_it fonskiyonunu whileden önce mi çağırıyorsunuz yoksa whileın içinde mi

mcaltindal

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.

flowchartx

Anladım hocam teşekkür ederim. Ama yapmak istediğim bu değildi konu hala güncel