Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2002.03.28;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.006 c
1-90871
P.
2002-03-17 13:40
2002.03.28
Вещественный тип...


1-90874
lipskiy
2002-03-16 16:40
2002.03.28
Как однозначно проверить, существует ли объект (создан ли, не испорчен ли)?


1-90928
Michael C
2002-03-11 17:13
2002.03.28
Массивы и IP


1-90913
Merle Corey
2002-03-18 15:15
2002.03.28
Создание компонента


4-91111
Quest
2002-01-28 08:46
2002.03.28
Как определить частоту процессора?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский