Post Go back to editing

simple example on using UART interrupt to receive buffer from serial

Category: Software
Product Number: ADSP-BF592

Hi,

i would appreciate help in writing a simple test code to read data from UART in interrupt mode.

I am a newbe here.

I started with CharECHO_UART example and i was able to connect a terminal emulator (using a USB-DB9 cable). Then using Tera Term i sent a file

to my board and in DMA mode i was able to read all bytes i received.

Then i try something like:

static ADI_UART_HANDLE hDevice;

static void UARTCallback(void* pHandle, uint32_t u32Arg, void* pArg) {


printf("UART CALLBACK!!!!\n");
ADI_UART_HANDLE pDevice = (ADI_UART_HANDLE)pHandle;
ADI_UART_EVENT event = (ADI_UART_EVENT)u32Arg;
uint16_t *data = (uint16_t*)pArg;

printf("complete buffer:%s\n", ReceiveBuffer);

/*

here's the problem: my ReceiveBuffer contains only the last char sent from Termina Emulator

*/

}

int32_t main(void) {

// open UART in bidirectional interrupt mode mode

adi_uart_Open(UART_DEVICE_NUM, ADI_UART_DIR_BIDIRECTION, gUARTMemory_interrupt, ADI_UART_BIDIR_INT_MEMORY_SIZE, &hDevice);

adi_uart_SetBaudRate(hDevice, 115200u);

adi_uart_SetConfiguration(hDevice, ADI_UART_NO_PARITY, ADI_UART_ONE_STOPBIT, ADI_UART_WORDLEN_8BITS);

adi_uart_RegisterCallback(hDevice, UARTCallback, (void*)0);

adi_uart_SubmitRxBuffer(hDevice, ReceiveBuffer, 2);

adi_uart_EnableRx(hDevice, true);

while (true){

// do nothing

}

}

The problem is i only get the last character sent from terminal. I need to catch all chars sent from terminal

Each message sent from terminal may have different length so i need to process each received byte individually

I searched a lot and was not able to find a basic example that help me to build a simple program that read from UART in interrupt mode

Parents
  • Hi,

    We have sample code as per your requirement for BF707. Please refer FAQ from below path.

     [FAQ] : How to pass group of characters via UART 

    Please modify your code by using this as a reference. 

    You can refer detailed description of APIs from the below Help path
    CrossCore® Embedded Studio 2.x.x > System Run-Time Documentation > System Services and Device Drivers > ADSP-BF592 API Reference > Modules

    As well as you can refer driver implementation from the below installation path
    C:\Analog Devices\CrossCore Embedded Studio 2.x.x\Blackfin\lib\src\drivers\source\uart

    Hope this helps.

    Best regards,
    Santhakumari.K

  • Hi,

    thank you for your reply but i was not able to solve.

    The example shows how to write on UART from DSP. I need to read incoming bytes from UART and, in my case, i cannot assume that incoming data has a fixed length.

    In some way i should be "listening" for any incoming byte and process manually to understand if the message is complete.

    Maybe i am wrong, but i was thinking that an interrupt may be raised for any incoming byte (or any other mechanism)

    I spent some day on reading both documentation and drivers implementation with no luck

    Thanks

  • Little progress. I was able to to use UART in interrupt mode polling in a loop

    with adi_uart_IsRxBufferAvailable(hDevice, &bufferAvailable);

    now happens that a printf seems to write on serial output

    instead of writing into console

Reply Children
No Data