Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.07.2009, 18:24   #1
JustKurt
ANT team
Пользователь
 
Регистрация: 25.06.2009
Сообщений: 39
По умолчанию Работа с нетипизированными файлами

Добрый день!

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

Пишет либо String, либо самостоятельно вбитый массив HEX значений.
Так вот, мне необходимо в среднем отсылать в порт маленькие команды ( 5-6 байт) и большие файлы - от 50 кб до 30 мб.
Все бы хорошо, вбить данные в массив килобайт на 50 можно, но не 30 же метров
Почитал литературку - нашел варианты с потоками.
Так же некоторые функции, типа block read и некоторые другие.
Но не могу с ними разобраться.

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

С потоками все еще сложнее - не получается и все.

В общем - в идеале бы сделать нечто, что могло бы пихать файл в поток - и затем отсылать их кусками.

Как сделано у меня -

Код:
function sendDTA(sToSend:string; var s:string):boolean;
var NumberWritten:dword;
begin
s:='';
 NumberWritten:=0;
if WriteFile(hCommFile,
            PChar(sToSend)^,
            Length(sToSend),
            NumberWritten,
            nil)=false then begin
 message_sys('Error! Cant sent DTA!');
   result:=False;
    exit;
  CloseHandle(hCommFile);
   end else begin
   s:=readstringfrmrs232;
                 result:=true;
             end;
end;

пример использования

Код:
 if sendDTA('Qery'+#$01#$05#$0F,s)=False
 then
exit
else
message_sys('Qery OK! DTA recived: '+copy(s,8,9));
Так вот, мне необходимо посылать в порт либо набор HEX данных, либо просто строку с данными из файла.
В файле все данные являются нужными, то есть не нужно производить никакого поиска - тупо отослать от начала до конца.

Пробовал переписать функцию посыла - но всегда получается все не так, как хотелось бы.


Буду благодарен за любую помощь. Спасибо за внимание.
JustKurt вне форума Ответить с цитированием
Старый 18.07.2009, 04:21   #2
BaronTreep
Форумчанин
 
Регистрация: 29.05.2009
Сообщений: 320
По умолчанию

Код:
{ Используйте TFileStream для файлов и TBlockSerial из библиотеки http://synapse.ararat.cz/files/synaser.zip для портов }

const
  BufSize = 1024 // Можно взять и больше
var
  FStream : TStream;
  CPort   : TBlockSerial;
  Buffer  : packed array [0..1024] of byte; // byte или другой тип
begin
  BufSize := 1024;
  CPort   := TBlockSerial.Create;
  FStream := TFileStream.Create('_file_name_', fmOpenRead)
  try
    CPort.Connect('COM3');
    CPort.config(9600, 8, 'N', ONESTOPBIT, false, false);
    FStream.ReadBuffer(@Buffer, BufSize);
    CPort.SendBufferEx(@Buffer, BufSize, 10);
  finally
    CPort.free;
    FStream.Free;
  end;
end;

Последний раз редактировалось BaronTreep; 18.07.2009 в 04:32.
BaronTreep вне форума Ответить с цитированием
Старый 18.07.2009, 09:43   #3
JustKurt
ANT team
Пользователь
 
Регистрация: 25.06.2009
Сообщений: 39
По умолчанию

BaronTreep, Спасибо! пролили немного света на проблему! Но дело в том, что у меня своеобразный серийный порт ( на самом деле в виде ярлыка к USB устройству, в данном случае - Телефон SonyEricsson, подключенный к USB порту. Работаю не через модем, а через низкоуровневой интерфейс программирования), на самом деле я не смогу так отсылать поток.

Код:
 FStream.ReadBuffer(@Buffer, BufSize);

Можно ли как-то присвоить переменной значение и выводить ее как строку в буффер переменной? Иначе моя функция не работает, а пример для ком-портов не пойдет. =(
JustKurt вне форума Ответить с цитированием
Старый 18.07.2009, 10:08   #4
BaronTreep
Форумчанин
 
Регистрация: 29.05.2009
Сообщений: 320
По умолчанию

Вы пишете последовательный порт = COM-порт:

http://ru.wikipedia.org/wiki/Последовательный_порт

USB - http://ru.wikipedia.org/wiki/USB

FStream.ReadBuffer(@Buffer, BufSize); - вы прочли кусок из файла (потока) в буфер, теперь у вас есть указатель. Вы можете написать его на порт. Читайте книжки Агурова по USB в Delphi.
BaronTreep вне форума Ответить с цитированием
Старый 18.07.2009, 10:46   #5
JustKurt
ANT team
Пользователь
 
Регистрация: 25.06.2009
Сообщений: 39
По умолчанию

За книгу спасибо!
Считаю, что вопрос решен - ушел читать)
JustKurt вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с файлами в С++ ai\ekcah^p Помощь студентам 2 21.06.2009 16:16
Работа с файлами Cpluser Общие вопросы C/C++ 2 16.02.2009 23:22
Работа с файлами Скрунж Паскаль, Turbo Pascal, PascalABC.NET 1 18.10.2008 15:19
Работа с файлами Maksi Фриланс 4 07.06.2008 11:38
Работа с файлами Yar Помощь студентам 2 02.06.2008 08:03