Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > ОС и железо
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 23.01.2011, 23:15
kote-kachok kote-kachok вне форума
Прохожий
 
Регистрация: 16.01.2011
Сообщения: 3
Репутация: 10
По умолчанию rs 232, ассинхроный режим, делфи

как открыть порт?как принимать и отсылать на порт?
Ответить с цитированием
  #2  
Старый 24.01.2011, 09:08
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

CreateFile с \\.\COM0 - открыть порт 0
WriteFile - писать в порт
ReadFile - читать из порта
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #3  
Старый 24.01.2011, 23:43
kote-kachok kote-kachok вне форума
Прохожий
 
Регистрация: 16.01.2011
Сообщения: 3
Репутация: 10
По умолчанию

ммм... класс,а если чуть-чуть поподробнее,или примерчик, позааааааайлюста, я тебе печеньку за это дам))
Ответить с цитированием
  #4  
Старый 11.02.2011, 13:54
programm007 programm007 вне форума
Прохожий
 
Регистрация: 09.01.2011
Сообщения: 6
Репутация: 10
По умолчанию

Я бы порекомендовал не изобретать велосипед, а использовать готовый бесплатный компонент bcomport или mscomm. Сам не раз работал с ними и остался доволен. Тем более, что bcomport позволяет как на низком так и на высоком уровне работать с COM-портом в асинхронном режиме.
К bcomport также прилагается документация с примерами на русском языке. Скачать bcomport можно отсюда.
Ответить с цитированием
  #5  
Старый 10.06.2011, 16:05
MCDFV MCDFV вне форума
Прохожий
 
Регистрация: 10.06.2011
Сообщения: 2
Репутация: 10
По умолчанию

Доброго всем времени суток!
Задача которая стоит передомной: есть девайс который раз в 5 секунд посылает на ком порт пакет такого формата 84 хх хх хх хх 85(в шеснадцатерисном значении), где хх 4 байта значение можности. Эти пакеты нужно принимать, заначение можности выводить в много строчное текстовое поле, создавать экселевский файл и записывать в каждую я чейку значения можности. Ну вывод в многострочное текстовое поле вообще проюблем нет, создание экселевского файла и запись в него думаю осилю, а вот с ком портом проблемы.
Как говорил programm007 использовал компонет bcomport в асинхронном режиме, использовал собитые OnRxChar компонета и чтение в строковую переменную и в многострочное текстовое поле выводил количество запрашиваемых для чтения байт, и количество байт которые удалось прочитать.
Пример с хелпа на компонет:
Код:
procedure TForm1.BComPort1RxChar(Sender: TObject; Count: Integer);
var
  Str: String;
  Stat: PAsync;
  N: Integer;
begin
  InitAsync(Stat);
  try
    BComPort1.ReadStrAsync(Str, Count, Stat);
    repeat
      // Выполнение других действий
    until BComPort1.IsAsyncCompleted(Stat);
    N := BComPort1.WaitForAsync(Stat);
    if N <> Count then SetLength(Str, Count);
  finally
    DoneAsync(Stat);
  end;
  // Действия с переменной Str
end;
Админ: Пользуемся тегами для оформления кода!

Наблюдаю такую картину иногда процедура читает полностью весь пакет, т.е выводится что процедура прочла все 6 байт, а иногда показывается что при приёме пакета процедура была выполнена 2 раза, т.е читаем сначала например 2 байта, а потом 4 байта. Причем таких случаев половина, не терять же мне половину данных? Нет. Ещё пакет может разбиваться на такие варианты приходит 1 и 5 байт, 2 и 4 байта, 3 и 3, 4 и 2, ну соответственно 5 и 1. и всегда сумма получается 6 байт.
Мои мысли по этому поводу: процедура успевает выполниться быстрее чем придут данные в буфер порта. А так как я в конце процедуры очищаю приёмный буфер, то оно опять видит что данные в буфере есть и опять выполняется эта процедура.
Прощу помощи как написать эту часть программы чтобы за 1 раз стабильно читался весь пакет 6 байт.
Пакеты от устройства приходят стабильно, пакеты корректные, проверял в терминалке.
За рание всем спасибо за внимание.

Последний раз редактировалось Admin, 19.06.2011 в 14:57.
Ответить с цитированием
  #6  
Старый 10.06.2011, 16:40
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

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

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #7  
Старый 14.06.2011, 14:16
MCDFV MCDFV вне форума
Прохожий
 
Регистрация: 10.06.2011
Сообщения: 2
Репутация: 10
По умолчанию

Aristarh Dark пробую я щас так делать. Столкнулся с проблемой (это не проблема, для тех кто проффесионально занимается программирование на делфи) но как мне 4 символа из строки вывести эти значения в шестнадцатеричном формате в многострочное текстовое поле?
Ответить с цитированием
  #8  
Старый 14.06.2011, 14:41
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

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

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #9  
Старый 27.06.2011, 15:46
glorit glorit вне форума
Прохожий
 
Регистрация: 16.05.2011
Сообщения: 10
Репутация: 10
По умолчанию

лучше подскажите как в момент передачи данных изменить скорость порта
Ответить с цитированием
  #10  
Старый 27.06.2011, 16:36
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Юзай SetCommState
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #11  
Старый 27.06.2011, 16:50
glorit glorit вне форума
Прохожий
 
Регистрация: 16.05.2011
Сообщения: 10
Репутация: 10
По умолчанию

я это понял первый раз я выставляю скорость а потом не могу её поменять

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

устройства это iButton (читает ТМ ключи через ком порт)
Ответить с цитированием
  #12  
Старый 27.06.2011, 16:52
glorit glorit вне форума
Прохожий
 
Регистрация: 16.05.2011
Сообщения: 10
Репутация: 10
По умолчанию

а у меня не получается поменять скорость (она не меняетсь)
Ответить с цитированием
  #13  
Старый 27.06.2011, 17:20
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

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

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #14  
Старый 27.06.2011, 17:21
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Вот кусок кода из моей работающей программы:
Код:
//Понижаем скорость на порту
  GetCommState(Device.PortHandle,DCB);
  DCB.BaudRate:=9600;
  SetCommState(Device.PortHandle,DCB);
Device - это самописный объект осуществляющий доступ к ком порту. Свойство PortHandle - это хендл файла который мне вернула функция CreateFile
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #15  
Старый 27.06.2011, 20:02
glorit glorit вне форума
Прохожий
 
Регистрация: 16.05.2011
Сообщения: 10
Репутация: 10
По умолчанию

я с тобой согласен

1 описываем порт
2 опрашиваем порт
3 выставляем скорость порта (19200)
4 выставляет время
5 SetCommMast

в принципе он готов

и тут начинается самое интересное

1 с порта считываем данные (данных нет )
2 с порта поступили данные (один символ '152')
3 поднимаем скорость (115200) //нет реакций
4 отправляем один символ ('0')
5 порт отвечает ('0','152')
6 передаем данные по символьно ('255','255','0','0' не пакетом а по символьно 64)
7 понижаем скорость(19200) //нет реакций
8 передаем данные ('0')
9 порт скидывает нам пакет данных //если скорость не переключалась пакет не верный


за портом слежу через программу 'Device Monitoring Studio' и сравниваю с прогой которая уже работает с портом(скачена с инета) мне надо чтоб порт опрашивалось также но составляла базы даннах(работала иначе)
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 02:37.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter