Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Чтение и запись в СОМ порт [D6, Win2k]


Страницы:   1 2 3

andrey__ ©   (2004-07-27 14:39:00) 

Нашёл ссылку:
D:\Internet\delphi\Мастера DELPHI  Работа с COM-портами под Windows_ (документация, исходники, скачать).htm

вроде всё понятно но пример не работает. В чем дело?


anton.   (2004-07-30 10:10:00) [21]

To andrey__
Мучаюсь с этой же проблемой, если разберешься напиши в форум


Reindeer Moss Eater   (2004-07-29 17:28:00) [22]

Если файл открыт с флагом оверлаппед, и если чтение запись использует структуру оверлаппед, то любой успешный вызов чтения записи возвращает False;
Следующий за этим GetlastError должен сказать IO_PENDING.
Убедившись в этом, надо вызвать функцию ожидания объекта синхронизации ссылка на который содержится в оверлаппед структуре (не забыв создать сам объект ожидания)
А когда объект просигналит - можно считать сколько там чего было принято и отправлено.


Reindeer Moss Eater   (2004-07-29 17:14:00) [23]

По ссылке из [13] ходил?
Пост № 11 читал?


andrey__   (2004-07-29 16:57:00) [24]

Как узнать что данные были записаны в порт, если WriteFile возвращает False.


DeepProg   (2004-07-29 12:34:00) [25]

andrey__
Если нужно не этот пример заставить работать, а вообще разобраться, то полезно было наведаться в Поздемелье Магов( http://www.delphikingdom.ru/mastering/index.htm).
Почитайте вот это:
1.Работа Титова - там почти все, что касается непосредственно портов.
http://delphi.mtu-net.ru/zip/com_win32.zip
2. Цикл статей по портам начинается здесь - http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=388
3. Здесь про синхронную работу(несмотря на название) http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=723


Reindeer Moss Eater   (2004-07-29 12:10:00) [26]

Что бы выйти из самолета через дверь, обязательно ли что бы был подан трап? Или можно без трапа?


andrey__   (2004-07-29 11:44:00) [27]

Что бы записать в порт и считать из порта у меня должно ли быть подключено к нему какое-то устройство (скажем модем) или можно и без устройства?


Reindeer Moss Eater   (2004-07-29 10:50:00) [28]

Замечательный совет.
Особенно если в DCB не хотим ничего менять кроме одного конкретного параметра.


jack128   (2004-07-28 19:15:00) [29]


> GetCommState(CommHandle,DCB); - получаем текущее DCB.
>  DCB.BaudRate:=CBR_9600; - устанавливаем скорость работы.
>  DCB.Parity:=NOPARITY; - устанавливаем отсутствие проверки
> на четность
>  DCB.ByteSize:=8; - 8 бит в передаваемом байте.
>  DCB.StopBits:=OneStopBit; - одиночный стоп-бит.
>  DCB.EvtChar:=chr(13); - вот собственно задаем символ для
> SetCommMask. В данном случае - возврат каретки.
>  SetCommState(cId,DCB);

К слову говоря, такую манеру изменения параметров порта, вроде сама Microsoft cоветует, да? ИМХО в корне не правильно. лудше так ZeroMemory(@dcb, SizeOf(dcb));  и выставить все параметры самостоятельно...


Reindeer Moss Eater   (2004-07-28 17:41:00) [30]

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/base/writefile.asp


Reindeer Moss Eater   (2004-07-28 17:12:00) [31]

Я выяснил в чем причина - у меня не получается запись в порт при выполнении ф-ции
WriteFile(CommHandle,Transmit,KolByte,KolByte,@Ovr);
...
fl:=WriteFile(CommHandle,Transmit,KolByte,KolByte,@Ovr);
 if not fl then
 begin
     ShowMessage(SysErrorMessage(GetLastError));
 end;


WriteFile в асинхронном режиме и не должна былавернуть Trueв случае успеха.


Reindeer Moss Eater   (2004-07-28 17:06:00) [32]

У меня была подобная проблема...
Ни малейшего подобия.
Это особенность конкретного девайса подключенного к порту.
И к самой процедуре записи в порт не имеющая не малейшего отношения.

и у меня при попытке записать в порт выдаёт сообщение
"Протекает наложенное событие ввода/вывода"  
Подскажите вчём дело и что делать?


Ранее уже была инициализирована запись в порт.
Она у тебя асинхронная.
Надо ждать пока не закончится.
Ждать объект синхронизации ссылка на которой в структуре оверлаппед


pavel_guzhanov   (2004-07-28 16:43:00) [33]

У меня была подобная проблема, решилась после того, как я стал добавлять к посылаемой в порт строке символы возврата каретки и перевода строки:
  Command:='02'+#13#10;
 StrPCopy(BufferIn, Command);
 WriteFile(h, BufferIn, StrLen(BufferIn),.....


andrey__   (2004-07-28 15:16:00) [34]

Я выяснил в чем причина - у меня не получается запись в порт при выполнении ф-ции
WriteFile(CommHandle,Transmit,KolByte,KolByte,@Ovr);

Я немого изменил код примера и вставил в ф-цию записи в порт след. код для поняти какая ошибка происходит:

  fl:=WriteFile(CommHandle,Transmit,KolByte,KolByte,@Ovr);
  if not fl then
  begin
      ShowMessage(SysErrorMessage(GetLastError));
  end;


и у меня при попытке записать в порт выдаёт сообщение
"Протекает наложенное событие ввода/вывода" 
Подскажите вчём дело и что делать?


andrey__   (2004-07-28 11:00:00) [35]

>AndrewVolkov ©   (27.07.04 23:27) [5]
>Я не поленился проверил - у меня все работает и на прием и на >запись в порт.
>1. Может у тебя настройки порта неверные (Скорость, Бит >останова...

Насколько я понял настройки задаются в примере и я их не менял

 GetCommState(CommHandle,DCB); - получаем текущее DCB.
 DCB.BaudRate:=CBR_9600; - устанавливаем скорость работы.
 DCB.Parity:=NOPARITY; - устанавливаем отсутствие проверки на четность
 DCB.ByteSize:=8; - 8 бит в передаваемом байте.
 DCB.StopBits:=OneStopBit; - одиночный стоп-бит.
 DCB.EvtChar:=chr(13); - вот собственно задаем символ для SetCommMask. В данном случае - возврат каретки.
 SetCommState(cId,DCB); - ну теперь собственно прописываем исправленное DCB.

А проблема вообщем такая:
 Запускаю программу, запускаю поток чтения, ввожу код символа в edit (например $55) и  посылаю в порт, потом ввожу число 13 (без $) в edit и посылаю в порт , но  никакого результата.

Я ставил точку останова в IF

   if (TransMask and EV_RXFLAG)=EV_RXFLAG then
    begin
     ClearCommError(CommHandle,Errs,@Stat);
     Kols := Stat.cbInQue;
     ReadFile(CommHandle,Resive,Kols,Kols,@Ovr);
     Form1.Panel1.Caption:=string(Resive);
   end;

И по результатам - я не захожу в IF.


GanibalLector   (2004-07-28 01:20:00) [36]

2 AndrewVolkov
>Нормальный пример. Даже очень....чем он вам не нравиться?

Из того,что я помню сходу...(просто давно эту статью читал)...так вот,а ты запиши $0 или считай из устройства $0. И таких приятныхмелочей там много!!!


Игорь Шевченко   (2004-07-27 23:32:00) [37]

Хорошая статья:

"Одно могу сказать точно - НЕ ДЕЛАЙТЕ как сделано в примере." (цитата)


AndrewVolkov   (2004-07-27 23:27:00) [38]

Я не поленился проверил - у меня все работает и на прием и на запись в порт.
1. Может у тебя настройки порта неверные (Скорость, Бит останова...
2. Отвечающая сторона - должна ли она реагировать на ваши запросы. И правильно ли вы формируете, то что хотите послать?


AndrewVolkov   (2004-07-27 23:18:00) [39]

то GanibalLector
Нормальный пример. Даже очень....чем он вам не нравиться? Для понимания самое то.

то Андрей
а что именно не работает?


GanibalLector   (2004-07-27 19:46:00) [40]

то плохой пример...Поищи в этой теме в других ветках.Там все есть.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо