Текущий архив: 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.45 MB
Время: 0.007 c