Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.03.28;
Скачать: CL | DM;

Вниз

COM-порт   Найти похожие ветки 

 
M-A-B ©   (2002-02-04 15:09) [0]

Доброе время суток господа программисты!

Работаю с СОМ-портом. Никаких проблем у меня не было с приёмом и перердачей данных
через СОМ порт до того пока данные с прибора на компьютер передавались через
интерфейс RS232, но вот недавно у меня на работе сделали преобразователь с RS485 на
RS232, т.е. данные с прибора на преобазователь передаются через RS485, а вот уже с
преобразователя на комп чере RS232. И вот теперь для того, чтобы у меня всё
полуичлось необходимо перед отправкой данных в порт установить флаг DTR в 0, а перед
получением установить флаг DTR в 1. Пытаюсь использовать функцию
EscapeCommFunction(hCOM, CLRDTR) и соответственно EscapeCommFunction(hCOM, SETDTR),
но ничего не получается!!!

--------- Вообщем вот старый код (работающий на RS232) ----------
// Установка параметров DCB, TimeOuts, и т.п. Инициализация СОМ-порта.
...
// Запись в порт
WriteFile(hCOM, Buffer, 10, NumberOfBytesWritten, nil);

// Ожидание ответа
for kkk:=1 to 10 do begin
ClearCommError(hCOM, Error, @Stat);
if (Stat.cbInQue>0) or (Error>0) then break;
sleep(10)
end; // for kkk

// Чтение из порта
if (Stat.cbInQue>0) and (Error=0) then
ReadFile(hCOM,...)
------------------------------ Конец ----------------------------

--------- А вот новый код для моей задачи (не работает) ---------
// Установка параметров DCB, TimeOuts, и т.п. Инициализация СОМ-порта.
...
DCB.Flags:=(DCB.Flags and not $30) or (DTR_CONTROL_SHAKE shl 4);
...

// Установка флага DCB.fDTRControl в 0
EscapeCommFunction(hCOM, CLRDTR);

// Запись в порт
WriteFile(hCOM, Buffer, 10, NumberOfBytesWritten, nil);

// Ожидание ответа
for kkk:=1 to 10 do begin
ClearCommError(hCOM, Error, @Stat);
if (Stat.cbInQue>0) or (Error>0) then break;
sleep(10)
end; // for kkk

// Установка флага DCB.fDTRControl в 1
EscapeCommFunction(hCOM, SETDTR);

// Чтение из порта
if (Stat.cbInQue>0) and (Error=0) then
ReadFile(hCOM,...)
--------------------------------------------- Конец
---------------------------------------------


Что делать не знаю - тупик! :-(
Подскажите, помогите, очень надо!
Заранее спасибо за помощь.


 
OlegY ©   (2002-02-05 10:37) [1]

Слету не вдаваясь в подробности
полуичлось необходимо перед отправкой данных в порт установить флаг DTR в 0, а перед
получением установить флаг DTR в 1.


// Установка флага DCB.fDTRControl в 0
EscapeCommFunction(hCOM, CLRDTR);

// Запись в порт
WriteFile(hCOM, Buffer, 10, NumberOfBytesWritten, nil);

-------------------
Ты ждешь овета не переключив DTR
-------------------

// Ожидание ответа
for kkk:=1 to 10 do begin
ClearCommError(hCOM, Error, @Stat);
if (Stat.cbInQue>0) or (Error>0) then break;
sleep(10)
end; // for kkk

// Установка флага DCB.fDTRControl в 1
EscapeCommFunction(hCOM, SETDTR);




 
OlegY ©   (2002-02-05 10:47) [2]

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

Это происходит из за того, что после WriteFile пару байт еще находятся в буфере FIFO (т.е. в линию физически еще не передались).

Лечится:
1. Отключением FIFO (панель управления).
2. Добавлением в конец передаваемых данных 1..2 незначащих байтов (0 или $FF)

или
Сделать переключатель чтение/запись для RS485 аппаратно (на каком нибудь микроконтроллере)


 
M-A-B ©   (2002-02-13 08:25) [3]

Исправил, всё равно ничего не получается!
Мне подсказали, что перед установкой флага DTR в 1 необходимо проанализировать, что все байты отправлены, т.е. проверить буфер передачи. Но как это сделать???


 
limon ©   (2002-02-13 10:44) [4]

Если обмен асинхронный - GetOverlappedResult - статус последней операции.
ClearCommError дает доступ к обоим буферам



Страницы: 1 вся ветка

Текущий архив: 2002.03.28;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.016 c
1-90921
SB
2002-03-13 21:56
2002.03.28
Случайное число


1-90969
SecondGray
2002-03-15 05:53
2002.03.28
Delphi 5&Win98 против Delphi5&Win2K


14-91049
McSimm
2002-02-13 15:31
2002.03.28
Скучно тут как-то...


3-90749
Rustik
2002-02-26 15:44
2002.03.28
Репорт вместо 10 таблиц 1 queryзапрос


14-91039
nikols
2002-02-11 08:49
2002.03.28
Долго за компиком. Болят глаза. Кто как лечится?