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

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

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



§ 2.8. Программирование модуля Ke-USB24A на языке Delphi (Часть 3)

Дмитрий Иванов, 13 апреля 2008

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

Еще одна небольшая статья по программированию модуля Ke-USB24A на языке Delphi. Здесь мы будем записывать/считывать данные из энергонезависимой памяти модуля (EEPROM).


В программе будет возможнрость записать в память модуля строку данных. Обратите внимание, что ее длина не должна превышать 32 символов. Так же можно будет считать ранее записанную строку данных.

программирование USB на Delphi

Процедура записи данных весьма проста - мы просто формируем команду записи $KE,UD,SET и отправляем ее в порт.

procedure TForm1.Button2Click(Sender: TObject);
var
Buf: string;
CRbyte: Shortint;
LFbyte: Shortint;
NumberWritten : DWORD;

begin
CRbyte := 13; // HEX 0x0D
LFbyte := 10; // HEX 0x0A

if (Length(Edit2.Text) <= 0) then
begin
   MessageDlg('No Data to write', mtError, [mbOK], 0);
   Exit;
end;

Buf := '$KE,UD,SET,' + Edit2.Text + Char(CRbyte) + Char(LFbyte);  
WriteFile(CommHandle, PChar(Buf)^, Length(Buf), NumberWritten, nil); 
MessageDlg('Data has been sended to module', mtInformation, [mbOK], 0);
end;

Функция чтения данных из памяти модуля несколько сложнее, но сама структура нам уже знакома. Формируем команду на чтение данных, отправляем ее в порт, делаем небольшую задержку, читаем данные из порта, проводим их анализ и если все Ok - показываем сообщение.

procedure TForm1.Button3Click(Sender: TObject);
var
BinBuf: array[0..64] of Char;
Buf: string;
pBuf: array [0..64] of Char;
CRbyte: Shortint;
LFbyte: Shortint;
NumberWritten : DWORD;

begin
CRbyte := 13; // HEX 0x0D
LFbyte := 10; // HEX 0x0A

// Clear Port Buffers from previous data
PurgeComm(CommHandle, PURGE_TXABORT or PURGE_RXABORT or 
                                PURGE_TXCLEAR or PURGE_RXCLEAR);

Buf := '$KE,UD,GET' + Char(CRbyte) + Char(LFbyte);
WriteFile(CommHandle, PChar(Buf)^, Length(Buf), NumberWritten, nil);

// Make littele pause for wait module anser
Sleep(480); // Wait 480 ms

ReadFile(CommHandle, BinBuf, 128, NumberWritten, nil);
if(NumberWritten = 0) then
begin
  MessageDlg('Read Data Fail #1', mtError, [mbOK], 0);
  Exit;
end;

if(StrLComp(BinBuf, '#UD,NOTSET', 10) = 0) then
begin
  MessageDlg('Module is empty. No data at present.', mtInformation, [mbOK], 0);
  Exit;
end;
                                            
// Removing sub-strings '#UD,' and CR,LF
StrLCopy(pBuf, BinBuf + 4, NumberWritten - 4 - 2);  
MessageDlg(pBuf, mtInformation, [mbOK], 0); 
end;

end.


© Дмитрий Иванов
13 апреля 2008 года
http://www.kernelchip.ru



© KERNELCHIP 2006 - 2024