Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Чтение/Запись в comport, Чтение/Запись в comport средствами windo 
:(
    Опции темы
jon007
Дата 27.10.2015, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 13.12.2007

Репутация: нет
Всего: нет



Здравствуйте. Есть микроконтроллер USB- serial, его управление происходит текстовыми командами, при отправки на него команды он возвращает её эхо, для контроля. Через терминал или компанент делфи ComPort работает нормально, а вот с помощью команд WriteFile/ ReadFile ни как не могу заставить работать. Команда WriteFile не приводит к исполнению микроконтроллер, а команда ReadFile возвращает только часть посланной команды. Пишу читаю в порт разными способами и примерами с интернета, ни один не хочет работать. Сейчас остановился на этом:
Код

var
  S, D: array[0..127] of Char;
  actual_bytes: dword;
  .......
  FillChar(S, 128, #0);
  FillChar(D, 128, #0);
  StrPCopy(S, Memo1.Text);

  if not WriteFile(hPort, S, StrLen(S), actual_bytes, nil) then
  begin
    ShowMessage('Can''t write to port: ' + IntToStr(GetLastError));
    Exit;
  end;

  if not ReadFile(hPort, D, StrToInt(Edit3.Text), actual_bytes, nil) then
    ShowMessage('Can''t read from port: ' + IntToStr(GetLastError))
  else
    ShowMessage('Read ' + IntToStr(actual_bytes) + ' bytes');
  Memo2.Text := D;

Рабочий же код с  компанента ComPort такой:
Код

  Str1:= 'rel 1 ON' + #13#10;
  ComPort1.WriteStr(Str1);
  ....
  ComPort1.ReadStr(Str1, Count);

Подскажите куда копать, плиз.
PM MAIL   Вверх
Romikgy
Дата 27.10.2015, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



Цитата(jon007 @  27.10.2015,  17:28 Найти цитируемый пост)
ComPort1.ReadStr

работает с ожиданием данных из компорта, вы же 
Цитата(jon007 @  27.10.2015,  17:28 Найти цитируемый пост)
 ReadFile(hPort, D, StrToInt(Edit3.Text), actual_bytes, nil) 

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


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
jon007
Дата 28.10.2015, 08:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 13.12.2007

Репутация: нет
Всего: нет



Цитата(Romikgy @  27.10.2015,  21:26 Найти цитируемый пост)
может не все данные прийти! или делайте задержку или используйте корректную работу с ком портом...

По чтению данных понятно что может не всё прийти, при включенном режиме эха контроллер возвращает посланную команду целиком. Больше не понятно почему нормально не срабатывает запись в порт, конртоллер не выполняет посланную команду, думаю что часть данных теряются. С компонентом компорт контроллер нормально работает за исключением потери данных на ответе о выполненой команды, просто в произвольный момент времени от контроллера нет чёткого ответа или приходит только часть строки. вот думаю может другим способом получится управлять им, но пока ни чего не выходит. Да вот ещё часть кода инициализации и настройки порта:
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  S, D: array[0..127] of Char;
  actual_bytes: dword;
  DCB: TDCB;
begin

 { FillChar(S, 128, #0);
  FillChar(D, 128, #0);}

  DCB.DCBlength := SizeOf(DCB);

  if not GetCommState(hPort, DCB) then
  begin
    ShowMessage('Can''t get port state: ' + IntToStr(GetLastError));
    Exit;
  end;

  try
    DCB.BaudRate := StrToInt(BaudCombo.Text);
  except
    BaudCombo.Text := IntToStr(DCB.BaudRate);
  end;

  try
    DCB.ByteSize := StrToInt(ByteSizeCombo.Text);
  except
    ByteSizeCombo.Text := IntToStr(DCB.ByteSize);
  end;

  if ParityCombo.ItemIndex > -1 then
    DCB.Parity := ParityCombo.ItemIndex
  else
    ParityCombo.ItemIndex := DCB.Parity;

  if StopBitsCombo.ItemIndex > -1 then
    DCB.StopBits := StopBitsCombo.ItemIndex
  else
    StopBitsCombo.ItemIndex := DCB.StopBits;

  if not SetCommState(hPort, DCB) then
  begin
    ShowMessage('Can''t set new port settings: ' + IntToStr(GetLastError));
    Exit;
  end;

  PurgeComm(hPort, PURGE_TXABORT or PURGE_RXABORT or PURGE_TXCLEAR or PURGE_RXCLEAR);

end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  hPort := CreateFile(PChar(PortCombo.Text),
  GENERIC_READ + GENERIC_WRITE,
  0,
  nil,
  OPEN_EXISTING,
  FILE_ATTRIBUTE_NORMAL,
  0);

  if hPort = INVALID_HANDLE_VALUE then
    ShowMessage('Can''t open ' + PortCombo.Text + ': ' + IntToStr(GetLastError))
  else
    Button2.Hide;
end;
    
PM MAIL   Вверх
planetoxod
Дата 29.10.2015, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 4.3.2015

Репутация: нет
Всего: нет



Сколько байт возвращается?

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
jon007
Дата 30.10.2015, 07:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 13.12.2007

Репутация: нет
Всего: нет



Цитата(planetoxod @ 29.10.2015,  17:00)
Сколько байт возвращается?

Этот ответ добавлен с нового Винграда - http://vingrad.com

Здравствуйте. Посылаю строку rel 1 ON, длина получается 8 байт, на приём пишет тоже что пришло 8 байт, но строка получается только rel .
PM MAIL   Вверх
northener
Дата 30.10.2015, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 8
Всего: 20



Цитата(jon007 @  30.10.2015,  07:07 Найти цитируемый пост)
 Посылаю строку rel 1 ON, длина получается 8 байт

Версия Дельфи какая? Если Д2009+, то ясен пень.


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
jon007
Дата 30.10.2015, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 13.12.2007

Репутация: нет
Всего: нет



Цитата(northener @ 30.10.2015,  11:07)
Цитата(jon007 @  30.10.2015,  07:07 Найти цитируемый пост)
 Посылаю строку rel 1 ON, длина получается 8 байт

Версия Дельфи какая? Если Д2009+, то ясен пень.

Дэлфи 2010. Что не так в этих версиях?
PM MAIL   Вверх
northener
Дата 30.10.2015, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 8
Всего: 20



Цитата(jon007 @  30.10.2015,  11:15 Найти цитируемый пост)
Дэлфи 2010. Что не так в этих версиях? 

Юникод. Каждый символ это два байта, а не один. А твоя железяка разумеется юникода не знает и знать не хочет. Так что заменяй Char на AnsiChar.


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
jon007
Дата 30.10.2015, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 13.12.2007

Репутация: нет
Всего: нет



northener, Спасибо. Заработало. Но какую бы длиной команду не послал возврат идёт всегда по 8 байт, не подскажешь в какую сторону смотреть?
PM MAIL   Вверх
northener
Дата 31.10.2015, 02:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 8
Всего: 20



Цитата(jon007 @  30.10.2015,  11:44 Найти цитируемый пост)
Но какую бы длиной команду не послал возврат идёт всегда по 8 байт, не подскажешь в какую сторону смотреть? 

Не совсем понимвю вопрос. Посдеднюю версию кода я не вижу.
Могу только сказать что драйвер порта, как правило, выдаёт получаемые двнные некиими порциями. Обычно кратными 4 или 8.

Это сообщение отредактировал(а) northener - 31.10.2015, 02:02


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
jon007
Дата 31.10.2015, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 13.12.2007

Репутация: нет
Всего: нет



Цитата(northener @ 31.10.2015,  02:01)
Посдеднюю версию кода я не вижу.
Могу только сказать что драйвер порта, как правило, выдаёт получаемые двнные некиими порциями. Обычно кратными 4 или 8.

Здравствуйте. Вот так железяка работает, поменял только тип массива:
Код

var
  S, D: array[0..127] of AnsiChar;
  actual_bytes: dword;
  .......
  FillChar(S, 128, #0);
  FillChar(D, 128, #0);
  StrPCopy(S, Memo1.Text);
  if not WriteFile(hPort, S, StrLen(S), actual_bytes, nil) then
  begin
    ShowMessage('Can''t write to port: ' + IntToStr(GetLastError));
    Exit;
  end;
  if not ReadFile(hPort, D, StrToInt(Edit3.Text), actual_bytes, nil) then
    ShowMessage('Can''t read from port: ' + IntToStr(GetLastError))
  else
    ShowMessage('Read ' + IntToStr(actual_bytes) + ' bytes');
  Memo2.Text := D;

Эксперементировал с компонентом datapacket из набора comport, так вот там  действительно ответ железки приходит порциями вперемешку с символом конца строки #13#10. Думаю попробовать читать из порта в асинхронном режиме в отдельном потоке, но пока не разобрался как.

Это сообщение отредактировал(а) Poseidon - 5.11.2015, 09:27
PM MAIL   Вверх
northener
Дата 2.11.2015, 13:45 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 8
Всего: 20



Цитата(jon007 @  31.10.2015,  12:40 Найти цитируемый пост)
пока не разобрался как

Возможно поможет вот эта статья Работа с СОМ-портом в Windows


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
jon007
Дата 2.11.2015, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 13.12.2007

Репутация: нет
Всего: нет



Цитата(northener @ 2.11.2015,  13:45)

Возможно поможет вот эта статья Работа с СОМ-портом в Windows

Спасибо. Буду разбираться.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1012 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.