![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Чтение и запись в СОМ порт [D6, Win2k]
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]то плохой пример...Поищи в этой теме в других ветках.Там все есть.