<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://devzone.nordicsemi.com/cfs-file/__key/system/syndication/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>fds issues</title><link>https://devzone.nordicsemi.com/f/nordic-q-a/52692/fds-issues</link><description>Hello, 
 I&amp;#39;m using a nrf51422_xxac_s110 chip, with the 12.3 SDK. My code is based on the ble_peripheral\ble_app_uart example in the 12.3 SDK. I&amp;#39;m hoping you can provide some insights, and/or some relevant coding examples to review. 
 I added two characteristics</description><dc:language>en-US</dc:language><generator>Telligent Community 13</generator><lastBuildDate>Thu, 03 Oct 2019 08:20:19 GMT</lastBuildDate><atom:link rel="self" type="application/rss+xml" href="https://devzone.nordicsemi.com/f/nordic-q-a/52692/fds-issues" /><item><title>RE: fds issues</title><link>https://devzone.nordicsemi.com/thread/213120?ContentTypeID=1</link><pubDate>Thu, 03 Oct 2019 08:20:19 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:ebb4e599-0bf2-4fdb-868b-681b5a2efbde</guid><dc:creator>Einar Thorsrud</dc:creator><description>&lt;p&gt;Hi,&lt;/p&gt;
&lt;p&gt;There are a few issues with your code, but I do not see why you get corrupt data, but I am missing some context since I don&amp;#39;t see all your relevant code. Some thoughts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Using&amp;nbsp;device_name_pointer as you write should be OK, but there is clearly some issue and I cannot see everything (since it is not included in your code snippet).
&lt;ul&gt;
&lt;li&gt;One significant problem is that you should not set&amp;nbsp;device_name_pointer to point to the FDS data in flash like you do in your&amp;nbsp;fds_read2(), since it is not guaranteed to stay intact after you call&amp;nbsp;fds_record_close().&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;As mentionned, I don&amp;#39;t see if you wait for FDS operations to complete before e.g. resetting. That should not lead to corruption, though.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let me just mention&amp;nbsp;a few other issues which are not directly related to this issue:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You use always use&amp;nbsp;fds_record_write(), which means that is you change name more than once you will add new records with new names, without removing the old. However, you do not have any method of choosing the right name, so it will probably not be what you would like (and you will fill up the flash if you change name may times). So you should use&amp;nbsp;fds_record_update() to only keep the last name.&lt;/li&gt;
&lt;li&gt;You define&amp;nbsp;FILE_ID2 and&amp;nbsp;REC_KEY2 repeatedly. This is a bad idea and will generate a warning, but it works since you use the same value. If you change it at some point, it will not work.&lt;/li&gt;
&lt;li&gt;No indention in your code makes it difficult to read. That may only be an issue in the code you posted here, but please remember that in the future, as better readability makes it easier to understand what is going for us looking at it.&lt;/li&gt;
&lt;/ul&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: fds issues</title><link>https://devzone.nordicsemi.com/thread/212888?ContentTypeID=1</link><pubDate>Tue, 01 Oct 2019 21:47:57 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:48c653bc-d3ee-4702-9ea5-cfe8dfc55e1d</guid><dc:creator>Dak</dc:creator><description>&lt;p&gt;By the way the gap_params() function takes the device_name_pointer, to update the device name code architecture, which is eventually used by the advertising functionality.&amp;nbsp; In the original sdk 12.3, this was a #define value.&amp;nbsp; All I did was change what gap_params() looks at&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: fds issues</title><link>https://devzone.nordicsemi.com/thread/212887?ContentTypeID=1</link><pubDate>Tue, 01 Oct 2019 21:42:10 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:47d156de-8638-458e-aec9-6b3cea5ba6c9</guid><dc:creator>Dak</dc:creator><description>&lt;p&gt;The first function in the code snippet is the on_write event handler.&amp;nbsp; The last else if branch in this function handles the set_device_name characteristic - which is what I&amp;#39;m using to change the device name. The call to set_device_name_handler, has local vars for arguments that point to the data entered via the app.&amp;nbsp; The set_device_name_handler() function, which is in the code snippet , takes this data and copies it into the global array device_name_global that device_name_pointer points to.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;device_name_pointer and device_name_global are the global vars that hold the device name data when it is read from fds, or as its written to fds.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;char device_name_global[32] ;&lt;br /&gt;char *device_name_pointer = device_name_global;&lt;/p&gt;
&lt;p&gt;I&amp;#39;ve tried using the global&amp;#39;s directly in on_write instead of using local vars, and it didn&amp;#39;t make a difference.&lt;/p&gt;
&lt;p&gt;Regarding your next point,&amp;nbsp; fds_read2, fds_write2, and fds_find_and_delete2 all access the same file and record values.&amp;nbsp; I posted my main() code snippet earlier in this ticket - after fds_init() runs, I read the device_name from fds - read_device_name(), and just before I start advertising I make a call to fds_find_and_delete2(), which should clear the file and record data in fds.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;As far as waiting till I get an FDS indication that the write has been performed, can you tell me the best way to do this?&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Thanks&lt;/p&gt;
&lt;p&gt;Dak&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: fds issues</title><link>https://devzone.nordicsemi.com/thread/212883?ContentTypeID=1</link><pubDate>Tue, 01 Oct 2019 20:56:32 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:09c5f19c-2de1-40a8-aa96-d28db1833156</guid><dc:creator>Dak</dc:creator><description>&lt;p&gt;ok I will paste the code snippet again below, and answer your questions after that.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="c_cpp"&gt;//*****************************

static void on_write(ble_nus_t * p_nus, ble_evt_t * p_ble_evt)
{
ble_gatts_evt_write_t * p_evt_write = &amp;amp;p_ble_evt-&amp;gt;evt.gatts_evt.params.write;

if ((p_evt_write-&amp;gt;handle == p_nus-&amp;gt;rx_handles.cccd_handle)&amp;amp;&amp;amp;(p_evt_write-&amp;gt;len == 2))
{

if (ble_srv_is_notification_enabled(p_evt_write-&amp;gt;data))
{
p_nus-&amp;gt;is_notification_enabled = true;
}
else
{
p_nus-&amp;gt;is_notification_enabled = false;
}
}
else if((p_evt_write-&amp;gt;handle == p_nus-&amp;gt;tx_handles.value_handle)&amp;amp;&amp;amp;(p_nus-&amp;gt;data_handler != NULL))
{
p_nus-&amp;gt;data_handler(p_nus, p_evt_write-&amp;gt;data, p_evt_write-&amp;gt;len);
}

else if(p_evt_write-&amp;gt;handle == p_nus-&amp;gt;char_handles1.value_handle)
{
uint32_t data_buffer0;

memcpy(&amp;amp;data_buffer0, p_evt_write-&amp;gt;data, sizeof(uint32_t));

p_nus-&amp;gt;set_baudrate_handler(p_nus, data_buffer0);

}

else if(p_evt_write-&amp;gt;handle == p_nus-&amp;gt;char_handles2.value_handle)
{
//uint32_t data_buffer1;
char data_buffer1[32];
char *data_buffer1_pointer = data_buffer1;

memcpy(data_buffer1, p_evt_write-&amp;gt;data, sizeof(data_buffer1));
p_nus-&amp;gt;set_device_name_handler(p_nus, data_buffer1_pointer);
}

}

//************************************

and here is the device name handler function itself:

//*********************************

static void set_device_name_handler(ble_nus_t * p_nus, char* new_device_name)
{
uint32_t err_code;

memset(device_name_global,0,strlen(device_name_global));

strcpy(device_name_global, (const char*)new_device_name);

err_code = fds_write2();
APP_ERROR_CHECK(err_code);

}

//******************************************

And here is the fds_write2() function called from the device handler:

//***************************************

static ret_code_t fds_write2(void)
{

#define FILE_ID2 0x1111
#define REC_KEY2 0x2222

fds_record_t record;
fds_record_desc_t record_desc;
fds_record_chunk_t record_chunk;

record_chunk.p_data = device_name_pointer;

record_chunk.length_words = sizeof(device_name_global);

record.file_id = FILE_ID2;
record.key = REC_KEY2;
record.data.p_chunks = &amp;amp;record_chunk;
record.data.num_chunks = 1;
ret_code_t ret = fds_record_write(&amp;amp;record_desc, &amp;amp;record);


if (ret != FDS_SUCCESS)
{
return ret;
}
return NRF_SUCCESS;
}

//****************************************

Here is the read_device_name() function called in main():

//*****************************************

static void read_device_name(void)
{
uint32_t err_code;

err_code = fds_read2();
APP_ERROR_CHECK(err_code);

}

//**********************************

Here is the fds_read2() function called from read_device_name():

//******************************************

static ret_code_t fds_read2(void)
{

#define FILE_ID2 0x1111
#define REC_KEY2 0x2222

fds_flash_record_t flash_record;
fds_record_desc_t record_desc;
fds_find_token_t ftok = {0};
uint32_t *data;

uint32_t err_code;

while (fds_record_find(FILE_ID2, REC_KEY2, &amp;amp;record_desc, &amp;amp;ftok) == FDS_SUCCESS)
{
err_code = fds_record_open(&amp;amp;record_desc, &amp;amp;flash_record);
if (err_code != FDS_SUCCESS)
{
return err_code;
}
data = (uint32_t *)flash_record.p_data;


device_name_pointer = (char*)data;
err_code = fds_record_close(&amp;amp;record_desc);
if (err_code != FDS_SUCCESS) {
return err_code;
}
}
return NRF_SUCCESS;
}

//***********************************************

and here is the fds_find_and_delete2() function called from main().  As I stated earlier I&amp;#39;ve played with turning this off and on, with varying results:

//*******************************************

static ret_code_t fds_find_and_delete2(void)
{
#define FILE_ID2 0x1111
#define REC_KEY2 0x2222
fds_record_desc_t record_desc;
fds_find_token_t ftok;

fds_flag = 1;

ftok.page=0;
ftok.p_addr=NULL;
// Loop and find records with same ID and rec key and mark them as deleted.
while (fds_record_find(FILE_ID2, REC_KEY2, &amp;amp;record_desc, &amp;amp;ftok) == FDS_SUCCESS)
{
fds_record_delete(&amp;amp;record_desc);
}
// call the garbage collector to empty them, don&amp;#39;t need to do this all the time, this is just for demonstration
ret_code_t ret = fds_gc();
if (ret != FDS_SUCCESS)
{
return ret;
}
fds_flag = 0;
return NRF_SUCCESS;
}

//*******************************&lt;/pre&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: fds issues</title><link>https://devzone.nordicsemi.com/thread/212836?ContentTypeID=1</link><pubDate>Tue, 01 Oct 2019 13:33:48 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:05617371-6d11-4474-aeee-25877d5b7511</guid><dc:creator>Einar Thorsrud</dc:creator><description>&lt;p&gt;Hi Dak,&lt;/p&gt;
&lt;p&gt;I am having problems following your data in the code snippet above. Where do you set&amp;nbsp;device_name_pointer before calling&amp;nbsp;fds_write2()? Remember tha tyou must point to valid data, and that the memory you point to must be valid at least until you get an event from FDS indication that the write has been performed.&lt;/p&gt;
&lt;p&gt;PS: please use Insert -&amp;gt; Insert Code when inserting code to improve readability.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: fds issues</title><link>https://devzone.nordicsemi.com/thread/212651?ContentTypeID=1</link><pubDate>Mon, 30 Sep 2019 14:43:23 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:33f3f8db-7bb8-461e-94d6-99c3ea5ad6e1</guid><dc:creator>Dak</dc:creator><description>&lt;p&gt;Sure I can do that.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Here is the on_write() function in ble_nus.c that calls the event handler for set device name.&amp;nbsp; It&amp;#39;s the last else if statement, corresponding to handle: char_handles2:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;//*****************************&lt;/p&gt;
&lt;p&gt;static void on_write(ble_nus_t * p_nus, ble_evt_t * p_ble_evt)&lt;br /&gt;{&lt;br /&gt; ble_gatts_evt_write_t * p_evt_write = &amp;amp;p_ble_evt-&amp;gt;evt.gatts_evt.params.write;&lt;br /&gt; &lt;br /&gt; if ((p_evt_write-&amp;gt;handle == p_nus-&amp;gt;rx_handles.cccd_handle)&amp;amp;&amp;amp;(p_evt_write-&amp;gt;len == 2))&lt;br /&gt; {&lt;br /&gt; &lt;br /&gt; if (ble_srv_is_notification_enabled(p_evt_write-&amp;gt;data))&lt;br /&gt; {&lt;br /&gt; p_nus-&amp;gt;is_notification_enabled = true;&lt;br /&gt; }&lt;br /&gt; else&lt;br /&gt; {&lt;br /&gt; p_nus-&amp;gt;is_notification_enabled = false;&lt;br /&gt; }&lt;br /&gt; }&lt;br /&gt; else if((p_evt_write-&amp;gt;handle == p_nus-&amp;gt;tx_handles.value_handle)&amp;amp;&amp;amp;(p_nus-&amp;gt;data_handler != NULL))&lt;br /&gt; {&lt;br /&gt; p_nus-&amp;gt;data_handler(p_nus, p_evt_write-&amp;gt;data, p_evt_write-&amp;gt;len);&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; else if(p_evt_write-&amp;gt;handle == p_nus-&amp;gt;char_handles1.value_handle)&lt;br /&gt; {&lt;br /&gt; uint32_t data_buffer0;&lt;br /&gt; &lt;br /&gt; memcpy(&amp;amp;data_buffer0, p_evt_write-&amp;gt;data, sizeof(uint32_t));&lt;br /&gt; &lt;br /&gt; p_nus-&amp;gt;set_baudrate_handler(p_nus, data_buffer0);&lt;/p&gt;
&lt;p&gt;} &lt;br /&gt; &lt;br /&gt; else if(p_evt_write-&amp;gt;handle == p_nus-&amp;gt;char_handles2.value_handle)&lt;br /&gt; {&lt;br /&gt; //uint32_t data_buffer1;&lt;br /&gt; char data_buffer1[32];&lt;br /&gt; char *data_buffer1_pointer = data_buffer1;&lt;br /&gt; &lt;br /&gt; memcpy(data_buffer1, p_evt_write-&amp;gt;data, sizeof(data_buffer1));&lt;br /&gt; p_nus-&amp;gt;set_device_name_handler(p_nus, data_buffer1_pointer);&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;//************************************&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;and here is the device name handler function itself:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;//*********************************&lt;/p&gt;
&lt;p&gt;static void set_device_name_handler(ble_nus_t * p_nus, char* new_device_name)&lt;br /&gt;{&lt;br /&gt; uint32_t err_code;&lt;br /&gt;&lt;br /&gt; memset(device_name_global,0,strlen(device_name_global));&lt;br /&gt; &lt;br /&gt; strcpy(device_name_global, (const char*)new_device_name);&lt;br /&gt;&lt;br /&gt; err_code = fds_write2(); &lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;br /&gt;&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;//******************************************&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;And here is the fds_write2() function called from the device handler:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;//***************************************&lt;/p&gt;
&lt;p&gt;static ret_code_t fds_write2(void)&lt;br /&gt;{&lt;br /&gt; &lt;br /&gt; #define FILE_ID2 0x1111&lt;br /&gt; #define REC_KEY2 0x2222&lt;br /&gt;&lt;br /&gt; fds_record_t record;&lt;br /&gt; fds_record_desc_t record_desc;&lt;br /&gt; fds_record_chunk_t record_chunk;&lt;br /&gt;&lt;br /&gt; record_chunk.p_data = device_name_pointer;&lt;br /&gt;&lt;br /&gt; record_chunk.length_words = sizeof(device_name_global);&lt;br /&gt; &lt;br /&gt; record.file_id = FILE_ID2;&lt;br /&gt; record.key = REC_KEY2;&lt;br /&gt; record.data.p_chunks = &amp;amp;record_chunk;&lt;br /&gt; record.data.num_chunks = 1;&lt;br /&gt; ret_code_t ret = fds_record_write(&amp;amp;record_desc, &amp;amp;record);&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; if (ret != FDS_SUCCESS)&lt;br /&gt; {&lt;br /&gt; return ret;&lt;br /&gt; }&lt;br /&gt; return NRF_SUCCESS;&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;//****************************************&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Here is the read_device_name() function called in main():&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;//*****************************************&lt;/p&gt;
&lt;p&gt;static void read_device_name(void)&lt;br /&gt;{&lt;br /&gt; uint32_t err_code;&lt;br /&gt; &lt;br /&gt; err_code = fds_read2();&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;br /&gt; &lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;//**********************************&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Here is the fds_read2() function called from read_device_name():&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;//******************************************&lt;/p&gt;
&lt;p&gt;static ret_code_t fds_read2(void) &lt;br /&gt;{&lt;br /&gt;&lt;br /&gt; #define FILE_ID2 0x1111&lt;br /&gt; #define REC_KEY2 0x2222 &lt;br /&gt; &lt;br /&gt; fds_flash_record_t flash_record;&lt;br /&gt; fds_record_desc_t record_desc;&lt;br /&gt; fds_find_token_t ftok = {0};&lt;br /&gt; uint32_t *data;&lt;br /&gt; &lt;br /&gt; uint32_t err_code;&lt;br /&gt; &lt;br /&gt; while (fds_record_find(FILE_ID2, REC_KEY2, &amp;amp;record_desc, &amp;amp;ftok) == FDS_SUCCESS)&lt;br /&gt; {&lt;br /&gt; err_code = fds_record_open(&amp;amp;record_desc, &amp;amp;flash_record);&lt;br /&gt; if (err_code != FDS_SUCCESS) &lt;br /&gt; {&lt;br /&gt; return err_code;&lt;br /&gt; }&lt;br /&gt; data = (uint32_t *)flash_record.p_data;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; device_name_pointer = (char*)data;&lt;br /&gt; err_code = fds_record_close(&amp;amp;record_desc);&lt;br /&gt; if (err_code != FDS_SUCCESS) {&lt;br /&gt; return err_code;&lt;br /&gt; }&lt;br /&gt; }&lt;br /&gt; return NRF_SUCCESS;&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;//***********************************************&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;and here is the fds_find_and_delete2() function called from main().&amp;nbsp; As I stated earlier I&amp;#39;ve played with turning this off and on, with varying results:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;//*******************************************&lt;/p&gt;
&lt;p&gt;static ret_code_t fds_find_and_delete2(void)&lt;br /&gt;{&lt;br /&gt; #define FILE_ID2 0x1111&lt;br /&gt; #define REC_KEY2 0x2222&lt;br /&gt; fds_record_desc_t record_desc;&lt;br /&gt; fds_find_token_t ftok;&lt;br /&gt; &lt;br /&gt; fds_flag = 1;&lt;br /&gt; &lt;br /&gt; ftok.page=0;&lt;br /&gt; ftok.p_addr=NULL;&lt;br /&gt; // Loop and find records with same ID and rec key and mark them as deleted. &lt;br /&gt; while (fds_record_find(FILE_ID2, REC_KEY2, &amp;amp;record_desc, &amp;amp;ftok) == FDS_SUCCESS)&lt;br /&gt; {&lt;br /&gt; fds_record_delete(&amp;amp;record_desc);&lt;br /&gt; }&lt;br /&gt; // call the garbage collector to empty them, don&amp;#39;t need to do this all the time, this is just for demonstration&lt;br /&gt; ret_code_t ret = fds_gc();&lt;br /&gt; if (ret != FDS_SUCCESS)&lt;br /&gt; {&lt;br /&gt; return ret;&lt;br /&gt; }&lt;br /&gt; fds_flag = 0;&lt;br /&gt; return NRF_SUCCESS;&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;//*******************************&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ok I hope thats enough.&amp;nbsp; I&amp;#39;ve made some modifications to ble_nus.h as well to support the characteristics I added, and for the UART Service event handler type, but I&amp;#39;ll leave those out for now, unless you want to see them.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Thanks&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Dak&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: fds issues</title><link>https://devzone.nordicsemi.com/thread/212562?ContentTypeID=1</link><pubDate>Mon, 30 Sep 2019 11:47:39 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:a91689ed-b921-404d-88a2-4c2f143ca07d</guid><dc:creator>Einar Thorsrud</dc:creator><description>&lt;p&gt;Hi Dak,&lt;/p&gt;
&lt;p&gt;It is a bit odd that writing a persistent name works the first time, and that the problem only occurs after updating it. However, it is difficult to understand much without seeing your code. Can you show the FDS related code, where you write, update and read the name?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item></channel></rss>