Интернет-магазин

Просмотр корзины
В корзине:

товаров - 0 шт.



§ 2.4. Сохранение данных в EEPROM модуля

Дмитрий Иванов, 23 марта 2008

Файлы к статье скачать
Имя: KA002_4.zip (ZIP архив)
Размер: 128 КБ

В предыдущих статьях мы рассмотрели базовую функциональность модуля Ke-USB24A - работу с линиями ввода/вывода и блок АЦП. Теперь мы познакомимся с некоторыми дополнительными возможностями модуля, которые позволяют получать весьма интересные результаты. В этой статье мы поговорим о возможности сохранять в энергонезависимой памяти модуля (EEPROM) свои собственные данные. Что это означает? Это означает что мы можем записать в EEPROM модуля до 32 байт нашей собственной информации. При отключении питания информация в этой памяти сохраняется и остается доступной для считывания или перезаписывания.


Для записи данных предназначена команда $KE,UD,SET, для чтения - $KE,UD,GET. Если данных в памяти нет, то при чтении модуль вернет соответствующий ответ - #UD,NOTSET.

На основе этой информации давайте сделаем простенькое тестовое приложение, которое будет сохранять в EEPROM дату последнего открытия моудля в программе. Проект программы Вы как обычно можете найти в файлах к этой статье. Итак, рассмотрим код. Программа очень простая, толком ни чего не делает. Весь разумный код сосредоточен в обработчике нажатия кнопки "Open". Чтот тут происходит?

Как обычно открываем порт, а вот затем... Затем посылаем в порт команду $KE,UD,GET. Делаем небольшую задержку, читаем ответ модуля. Если данных нет - выводим соответствующее сообщение. Далее идет код, выполняемый если данные есть, но давайте сначала рассмотрим тот участок кода, который записывает данные - так понятней будет что происходит при чтении.

В блоке записи данных мы формируем строку содержащую текущее время в формате День.Месяц.Год Часы:Минуты и спомощью команды $KE,UD,SET записываем ее в память модуля.

Теперь понятно что происходит при чтени - полученный буфер отчищается от личшних для нас символов и полученная строка выводится в окне сообщения.

void CEEPROMDlg::OnOpen() 
{
  // TODO: Add your control notification handler code here
  UpdateData(true);

  ....................	
  
  // Считываем данные из EEPROM модуля
  DWORD lpdwBytesWritten;
  char buf[32];
  int len = sprintf(buf, "$KE,UD,GET\r\n"); 
  WriteFile( m_hFile, buf, len, &lpdwBytesWritten, NULL );    

  // Делаем небольшую задержку в 100 мс
  Sleep(100);

  DWORD dwBytesRead;
  unsigned char pBuff[128];

  ReadFile(m_hFile, &pBuff, sizeof(pBuff), &dwBytesRead, NULL);

  if( memcmp(pBuff, "#UD,NOTSET", 10) == 0 )
  {
    // EEPROM память пустая
    MessageBox("Open OK\nNo data available", "Info", MB_ICONINFORMATION);    
  }
  else
  {  
    // В EEPROM есть данные
    CString s1, temp;

    temp = pBuff;
    temp.Delete(0, 4);        // Удяляем '#UD,'
    int len = temp.GetLength();
    temp.Delete(len - 2, 2);  // Удаляем последние два символа '\r\n'

    s1.Format("Open OK!\nLast visit: %s", temp);
    MessageBox(s1, "Info", MB_ICONINFORMATION);
  }

  // Сохраняем новые данные
  time_t osBinaryTime;
  time( &osBinaryTime );
  CTime tm(osBinaryTime);

  len = sprintf(buf, "$KE,UD,SET,%d.%d.%d  %d:%d:%d\r\n", 
    tm.GetDay(), tm.GetMonth(), tm.GetYear(), tm.GetHour(), tm.GetMinute(), tm.GetSecond()); 
  WriteFile(m_hFile, buf, len, &lpdwBytesWritten, NULL);    
}

Если все скомпилировать и запустить приложение мы получим сообщение о том что данных нет. Логично. Теперь просто ради интереса попробуйте отсоединить модуль от питания, включить снова и запустить программу. При открытии порта мы получим сообщение содержащие время нашего последнего обращения к модулю.

EEPROM Модуль Ke-USB24A

На основе такой функциональности можно, например, сделать счетчик запусков модуля или сохранения неких специфичных настроек программы для привязки ее к конкретному модулю.



© Дмитрий Иванов
23 марта 2008 года
http://www.kernelchip.ru



© KERNELCHIP 2006 - 2017