§ 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);
}
Если все скомпилировать и запустить приложение мы получим сообщение о том что данных нет. Логично. Теперь просто ради интереса попробуйте отсоединить модуль от питания, включить снова и запустить программу. При открытии порта мы получим сообщение содержащие время нашего последнего обращения к модулю.

На основе такой функциональности можно, например, сделать счетчик запусков модуля или сохранения неких специфичных настроек программы для привязки ее к конкретному модулю.
© Дмитрий Иванов
23 марта 2008 года
http://www.kernelchip.ru