This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

Sending a CSV File over ble Gatt connection

Hi,

I need to send data from a CSV file on the nordic board(Via fatfs library). I have presently gotten a Gatt service up and running.

I have a mobile application which, can see the gatt service and write to the characteristics. From a specific write command from the mobile device I want the nordic board to send the CSV file over.

I can presently read a single line of the CSV file formatted like this: (Time stamp, data1, data 2, data3, data 4, data 5).

What I need to implement is:

  • Reading the whole file but, one or multiple lines at a time due to the size of the CSV
  • Changing the read pointer of the SD card (So I know where to continue to read from)
  • Send this data to the characteristic
  • Read this characteristic data.

My code is based upon :  https://github.com/bjornspockeli/custom_ble_service_example

My CSV file size depends on the length of time I have been storing data from. It could be upto around 1-2mbytes. I beleive I need to set up some kind of notification service. Where I read a line(or several) of the SD card, set the GATT characteristic value to this. Then change the SD card pointer. Wait till the data is received by the mobile application. Then repeat until the file is read full.y

Note I am using SDK 16 NRF52840-dk PCA 10056 S140.

This post is similar and mentions using two characteristics one from commication from the mobile app and, one for receiving the data.

https://devzone.nordicsemi.com/f/nordic-q-a/53987/nrf52840-file-transfer-via-ble

Parents Reply Children
  • Hi Edvin,

    Cheers for offering to have a look. I've taken my project and removed a bunch of code to make it simpler for you to test still having the same issue. I have just tested it on a NRF52840-dk board with nothing connected to the GPIOs and the issue still persists.

    To get the code to work and show you the bug please do the following steps. Place inside the ble_peripheral folder. Then the includes should not need changing. Also I use Jlink rtt for my terminal.

    Then build and run. To show the bug:

    • Open nrf connect
    • Should see a device with data 0x0003E804.....
    • Press connect
    • On the unknown service request notifications from the second characteristic should have the 3 arrows(UUID with 1402)
    • Then write to the other characteristic 2 values
    • 10(Uint32) this is my start command
    • 60 (uint32) this is my read command. It will then show the data to the nrf connect app with the bug
    • 20(uint32) stop command

    Hopefully you will see the same result thanks,

    gatt_issue.zip

    Below is what I expect you will see from the nrf connect application.:

  • Ok, a couple of general hints:

    Don't include header files the way that you have done. These should only be included in the project settings' preprocessor setting: "Include directories".

    I see that you have added the files nrf_nvic.c and nrf_soc.c with some modified options, including some header files that are not intended for use when you use the softdevice. I couldn't compile the project before removing these.

    Then there was a warning, which you should always check. NB: When you compile a file but you haven't done any changes, SES will ignore the previous warnings for these files. You didn't include app_fifo.h in your main.c (or Setup.h). When I did, I saw that you had the wrong input parameters (none) on app_fifo_flush(); so I removed that call.

    I didn't manage to trigger the notification by your command sets. I just added the SEND_CSV function on a button press (button 4).

    Then I sent one notification, and that would send one packet of 51 bytes.

    I don't know what the issue was, but I did a bit of cleaning in your project.

    Can you try the attached modified project, and see if you get more than 51 bytes if you press button 4 after enabling notifications?

    gatt_issue.zip

    Best regards,

    Edvin

  • Thanks Edvin, I have just tested your code changes and it did output 51 bytes. But, I do not know what the issue was. I will now try re-add my code back in to restore my functionality and test with the changes that you have made.

    When you state I have included my headers wrong. Where was this?

  • I have merged my code back together and I seem to have the same problem it is reading 51 bytes now however. 

    In order to get my SD card line to read the line for the csv I need to read 51 bytes otherwise:

     D1: 1584969092,1881,1843,1862,1862,-0.010000 

    Does not output the right length of data.

    But when I output this via my gatt connection it only takes 30 bytes.

    Why could this be?

  • Thomas said:
    When you state I have included my headers wrong. Where was this?

     It seems you have included the header files like you included your .c files. You must include header files by adding their location to this list:

     

    Thomas said:
    I have merged my code back together and I seem to have the same problem it is reading 51 bytes now however.

     What problem would that be?

     

    Thomas said:

    In order to get my SD card line to read the line for the csv I need to read 51 bytes otherwise:

     D1: 1584969092,1881,1843,1862,1862,-0.010000 

    Does not output the right length of data.

     Ok.

     

    Thomas said:
    But when I output this via my gatt connection it only takes 30 bytes.

     What do you mean by "output this via my gatt"?

Related