RS port
5 отговора
134 прегледа
RS port
Здравейте.
Предварително искам да кажа, че не съм програмист, но в момента имам задача, която бих могъл да свърша бързо, ако успея да направя програма.
Целта е да се подкара комуникация между две устройства свързани помежду си с модеми и съответно да се предават и приемат данни..
Използвам TMS Async32 компонентите VaComm и VaModem.
Проблемът е, че при диреkтна връзка само през RS (VaComm) успявам да чета и пиша в RS порта с методите WriteText и ReadText, но когато изградя връзка през модемите използвайки VaModem - ReadText вече не работи.
Може ли някой да ми обясни причината за това и има ли някакво решение?
Мишо
Предварително искам да кажа, че не съм програмист, но в момента имам задача, която бих могъл да свърша бързо, ако успея да направя програма.
Целта е да се подкара комуникация между две устройства свързани помежду си с модеми и съответно да се предават и приемат данни..
Използвам TMS Async32 компонентите VaComm и VaModem.
Проблемът е, че при диреkтна връзка само през RS (VaComm) успявам да чета и пиша в RS порта с методите WriteText и ReadText, но когато изградя връзка през модемите използвайки VaModem - ReadText вече не работи.
Може ли някой да ми обясни причината за това и има ли някакво решение?
Мишо
Не конкртетно
За да опитам да помогна, поясни какво значи "когато изградя връзка през модемите използвайки VaModem - ReadText вече не работи"
Правиш с единия модем номеронабиране, получаваш позвъняване, вдигаш и ...??
Правиш с единия модем номеронабиране, получаваш позвъняване, вдигаш и ...??
Re: Не конкртетно
Здравей.
Ще се опитам да обясня...
TMS Async32 e комплект от компоненти за Delphi предназначени за обмен през RS порта.
Основният компонент тук е VaComm. С него много лесно се осъществява такава комуникация, използвайки методите му WriteText или ReadText. Има и куп други методи за тази цел, но аз използвам тези два. С тях програмката работи и досега върши работа.
В TMS Async32 има и компонент VaModem. Той пък има методи Init, Dial, Hangup, събитията OnNoCarrier, OnBusy и тнт, които доста облекчават нещата, в противен случай ще трябва да пиша АТ команди и да следя за отговорите на модема (Честно казано вече се насочих към този вариант).
Основното свойство на VaModem е Com и тук се посочва към кой точно от използваните във формата VaCom компоненти се 'прикача' този VaModem.
Задачата ми е да набера телефонен номер, да се свържа с устройството отсреща и използвайки тези методи да изпратя няколко байта, да изчакам известно време и да прочета отговора. Това работи, но отговора не мога да го прочета. Кода изглежда така:
aVaComm1.WriteText('BC') ;
Delay(1000); //Забавяне 1000мс - цикъл в тялото му Application.ProcesMessage
strRecTxt:=aVaComm1.ReadText;
Сигурен съм, че има отговор от отсреща, защото Rx на модема ми мига.
Мисля си, че компонентът VaModem чете от rec буфера преди мен и изтрива прочетените байтове. Ако го махна и използвам АТ команди за да свържа двата модема същият този код работи безгрешка.
Това е.
Всъщност има събитие при което успявам да чета получения отговор - то е VaCommRxBuf(Sender: TObject; Data: PVaData; Count: Integer), но за да го използвам, трябва да пренапишо всичко. Иска ми се да става с VaComm1.ReadText :)
Не знам дали бях напълно ясен, но многословен бях със сигурност. :)
Всичко добро.
Мишо.
Ще се опитам да обясня...
TMS Async32 e комплект от компоненти за Delphi предназначени за обмен през RS порта.
Основният компонент тук е VaComm. С него много лесно се осъществява такава комуникация, използвайки методите му WriteText или ReadText. Има и куп други методи за тази цел, но аз използвам тези два. С тях програмката работи и досега върши работа.
В TMS Async32 има и компонент VaModem. Той пък има методи Init, Dial, Hangup, събитията OnNoCarrier, OnBusy и тнт, които доста облекчават нещата, в противен случай ще трябва да пиша АТ команди и да следя за отговорите на модема (Честно казано вече се насочих към този вариант).
Основното свойство на VaModem е Com и тук се посочва към кой точно от използваните във формата VaCom компоненти се 'прикача' този VaModem.
Задачата ми е да набера телефонен номер, да се свържа с устройството отсреща и използвайки тези методи да изпратя няколко байта, да изчакам известно време и да прочета отговора. Това работи, но отговора не мога да го прочета. Кода изглежда така:
aVaComm1.WriteText('BC') ;
Delay(1000); //Забавяне 1000мс - цикъл в тялото му Application.ProcesMessage
strRecTxt:=aVaComm1.ReadText;
Сигурен съм, че има отговор от отсреща, защото Rx на модема ми мига.
Мисля си, че компонентът VaModem чете от rec буфера преди мен и изтрива прочетените байтове. Ако го махна и използвам АТ команди за да свържа двата модема същият този код работи безгрешка.
Това е.
Всъщност има събитие при което успявам да чета получения отговор - то е VaCommRxBuf(Sender: TObject; Data: PVaData; Count: Integer), но за да го използвам, трябва да пренапишо всичко. Иска ми се да става с VaComm1.ReadText :)
Не знам дали бях напълно ясен, но многословен бях със сигурност. :)
Всичко добро.
Мишо.
Предложение
Опитай вместо delay(1000) да ползваш нещо от рода:
xGetTick := GetTickCount+1000; // текущо време плюс 1000 (бих пробвал и с 5000)
s:='';
while (s='') and (xGetTick > GetTickCount) do begin // чакаш таймаут
s:= VaXX.ReadText;
...ProcessMessages;
end;
Разбира се, трябва да си осигуриш получаването на целия отговор. Така както съм го написал, би могло да се получи само началото на отговора.
И още - ако е имаш време - пренапиши го, по-добрият вариант е да ползваш събитията за четене. Така няма да ти се налага на маса места да ползваш processmessages, а и програмата ти няма да седи и да чака.
xGetTick := GetTickCount+1000; // текущо време плюс 1000 (бих пробвал и с 5000)
s:='';
while (s='') and (xGetTick > GetTickCount) do begin // чакаш таймаут
s:= VaXX.ReadText;
...ProcessMessages;
end;
Разбира се, трябва да си осигуриш получаването на целия отговор. Така както съм го написал, би могло да се получи само началото на отговора.
И още - ако е имаш време - пренапиши го, по-добрият вариант е да ползваш събитията за четене. Така няма да ти се налага на маса места да ползваш processmessages, а и програмата ти няма да седи и да чака.
Re: Предложение
Здравей.
Функцията Delay прави подобно нещо... Ето я:
msc // - вх.парметър
FirstTickCount:=GetTickCount;
repeat
Application.ProcessMessages;
until ((GetTickCount-FirstTickCount) >= Longint(msc));
На практика проверявам за отговор всеки 1000мс. в продължение на 2 минути, проблемът е, че не става с ReadText.
Събитието VaComm1RxBuf регистрира приетите байтове и там наистина мога да ги обработвам, но се усложнява анализа...
По разумно ми се струва, да изчакам макс. 2 минути и да прочета всички приети байтове, но това не се получава..
Опитах с Хипертерминала на Windows да направя същото, което трябва да прави тази програма :) там нямам проблеми.. Свързвам се, изпращам байтовете , получавам отговор и тнт.. Чудя се, дали с него да не си свърша работата :)
Все пак ми е интересно защо не тръгва ReadText, когато имам модем.
Функцията Delay прави подобно нещо... Ето я:
msc // - вх.парметър
FirstTickCount:=GetTickCount;
repeat
Application.ProcessMessages;
until ((GetTickCount-FirstTickCount) >= Longint(msc));
На практика проверявам за отговор всеки 1000мс. в продължение на 2 минути, проблемът е, че не става с ReadText.
Събитието VaComm1RxBuf регистрира приетите байтове и там наистина мога да ги обработвам, но се усложнява анализа...
По разумно ми се струва, да изчакам макс. 2 минути и да прочета всички приети байтове, но това не се получава..
Опитах с Хипертерминала на Windows да направя същото, което трябва да прави тази програма :) там нямам проблеми.. Свързвам се, изпращам байтовете , получавам отговор и тнт.. Чудя се, дали с него да не си свърша работата :)
Все пак ми е интересно защо не тръгва ReadText, когато имам модем.
Зарежи го тоя терминал :)
По-лесно ще ти е да си прехванеш събитието, отколкото да правиш глупости с терминала.
А относно ReadText - може би работи само когато модемът е в тектов режим, а не в режим данни (след установяване на connect) - прочети описанието, ако има такова.
Обикновенно компонентите за приемане имат по два метода (текст/bin) и едно събитие.
А относно ReadText - може би работи само когато модемът е в тектов режим, а не в режим данни (след установяване на connect) - прочети описанието, ако има такова.
Обикновенно компонентите за приемане имат по два метода (текст/bin) и едно събитие.