Вверх ↑
Этот топик читают: Гость
Ответов: 65
Рейтинг: 1
#1: 2010-08-31 09:40:10 ЛС | профиль | цитата
Никак не могу найти где собака зарыта в этой схеме, может у кого есть идеи, помогите пожалуйста

С интервалом в 50мс идет поочередная запись в Com порт Hex кода длиной 5 байт, кодов всего два, нужна поочередная запись этих Hex кодов и получение на них ответа.
Устройство подключенное к Com порту после получения одного Hex кода выдает на него ответ длиной также 5 байт, в зависимости от того какой был записан код в соответствующее положение становится компонент Commutator.

Так вот вся проблемма в том что периодически commutator не успевает переключится и на выходе 1 коммутатора я вижу кусок ответа на Hex код 1 и кусок ответа на Hex код 2.
Может быть можно заменить Commutator на другие компоненты ?
Как можно осуществить разделение выходного сигнала с Com порта без компонента коммутатор?
Или же возможно причина в таймере который в какойто момент подвисает и идет ошибка выбора потоков в коммутаторе, тогда как еще можно вести запись в Com порт с определенным интервалом времени без таймера ?

Написал много но уже с месяц не могу сам решить никак эту проблему, помогите пожалуйста.

code_20319.txt

Ссылка на компонент Commutator
http://hiasm.com/forum_serv.php?q=56&id=1728
карма: 1

0
файлы: 1code_20319.txt [2.5KB] [179]
Ответов: 200
Рейтинг: 5
#2: 2010-08-31 09:53:32 ЛС | профиль | цитата
Если ответа всего два и они заранее известны, можно воспользоваться StrMask
карма: 0

1
Голосовали:Radio
Ответов: 65
Рейтинг: 1
#3: 2010-08-31 09:58:12 ЛС | профиль | цитата
Evgen818
Ответы всегда разные и заранее не известны, они только по длине всегда одинаковые длиной 5 байт.
карма: 1

0
Ответов: 200
Рейтинг: 5
#4: 2010-08-31 10:03:44 ЛС | профиль | цитата
Radio, тогда скажи где взять компонент Commutator
------------ Дoбавленo в 10.03:
Попробуй вот так использовать чтение из порта
Add(ComAsync,9954166,280,301)
{
Port=""
ControlDTR=1
ControlRTS=1
RxChar=0
TxEmpty=0
CTS=0
DSR=0
RLSD=0
Point(onTxEmpty)
Point(onAfterClose)
Point(onRxChar)
Point(doEnumPorts)
Point(onEnumPorts)
Point(doRTS)
PColor(onAfterClose,16711765)
link(onRxChar,9954166:doRead,[(320,335)(320,352)(271,352)(271,328)])
}

карма: 0

1
Голосовали:Radio
Ответов: 65
Рейтинг: 1
#5: 2010-08-31 10:06:06 ЛС | профиль | цитата
тогда скажи где взять компонент Commutator

добавил ссылку в первом посте на Commutator

Попробуй вот так использовать чтение из порта

так не пойдет, мне нужно както разделять по разным направлениям ответы с com порта, т.е прошла запись Hex кода 1, сразу же идет на него ответ, этот ответ направить в одну сторону,
пошла запись второго Hex когда, ответ на него должен пойти в другое направление.
карма: 1

0
Ответов: 200
Рейтинг: 5
#6: 2010-08-31 10:48:03 ЛС | профиль | цитата
Попробуй вот так
code_20320.txt
карма: 0

1
файлы: 1code_20320.txt [1.8KB] [198]
Голосовали:Radio
Ответов: 65
Рейтинг: 1
#7: 2010-08-31 10:59:26 ЛС | профиль | цитата
Evgen818

Спасибо за возможный вариант, устройство к сожалению дома а я на работе, вечером буду пробовать.
карма: 1

0
Ответов: 200
Рейтинг: 5
#8: 2010-08-31 11:00:49 ЛС | профиль | цитата
Отпишись как проверишь
карма: 0

0
Ответов: 65
Рейтинг: 1
#9: 2010-08-31 22:09:24 ЛС | профиль | цитата
Отпишись как проверишь
Обязательно
------------ Дoбавленo в 22.09:
работает так же как и с элементом коммутатор, т.е периодически смешиваются выходные каналы вот в таком виде:



Add(MainForm,7206775,308,98)
{
Width=459
Height=307
link(onActivate,6820242:doOpen,[])
}
Add(Stream2Hex,804338,490,175)
{
Mode=3
link(onResult,8553197:doEvent1,[])
link(Data,10484687:Value,[])
}
Add(ComAsync,6820242,630,98)
{
BaudRate=4800
StopBits=2
RxChar=0
TxEmpty=0
Point(onRxChar)
Point(onTxEmpty)
Point(CTSState)
Point(DSRState)
Point(RLSDState)
Point(doBreak)
Point(doXon)
Point(doClearErrors)
Point(doRXClear)
Point(doTXClear)
link(onRead,14743073:doConvert,[])
}
Add(Stream2Hex,14743073,707,98)
{
Mode=2
Point(Position)
Point(CheckSum)
link(onResult,13655515:doEvent,[])
}
Add(Insert,8762608,819,98)
{
SubStr="."
Position=4
}
Add(Convertor,2268743,819,147)
{
Mode=5
Digits=8
}
Add(Hub,8553197,539,175)
{
InCount=2
link(onEvent1,11576281:doData,[(557,181)(557,132)])
link(onEvent2,6820242:doWrite,[(605,188)(605,118)])
}
Add(Memory,10484687,490,119)
{
Default=String(0000000003)
}
Add(Stream2Hex,15062978,511,294)
{
Mode=3
link(onResult,8553197:doEvent2,[(555,300)(555,203)(529,203)(529,188)])
link(Data,1104403:Value,[])
}
Add(Memory,1104403,511,245)
{
Default=String(00000000e7)
}
Add(Convertor,16001750,581,217)
{
link(onResult,10726033:doText,[])
}
Add(Counter,16697466,315,168)
{
Max=1
Point(doValue)
link(onNext,2319846:doEvent1,[])
}
Add(Timer,10483551,252,168)
{
Interval=50
link(onTimer,16697466:doNext,[])
}
Add(Label,10726033,630,217)
{
Left=15
Top=20
Width=90
Caption="Stat"
}
Add(IndexToChanel,5504297,420,168)
{
link(onEvent1,15062978:doConvert,[(482,174)(482,300)])
link(onEvent2,804338:doConvert,[])
}
Add(Hub,2319846,364,168)
{
link(onEvent1,5504297:doEvent,[])
link(onEvent2,16001750:doConvert,[(412,181)(412,223)])
}
Add(IndexToChanel,13655515,763,98)
{
Point(Index)
link(onEvent1,8762608:doInsert,[])
link(onEvent2,2268743:doConvert,[(811,111)(811,153)])
link(Index,16697466:Count,[(769,86)(750,86)(750,333)(321,333)])
}
Add(DoData,11576281,560,126)
{
Data=Integer(5)
link(onEventData,6820242:doRead,[(611,132)(611,125)])
}


изменено на первоначальное чтение из порта, но в итоге ситуация первоначальная.
Hужно как-то заставить IndextoChanel не переключать выходные каналы пока полностью не будет считана строка для Hex кода 1 или Hex кода 2 и пока не пройдет чтение ответа до конца 5 байт не производить запись следующего запроса, а сейчас получается если за указанное время чтение не успело пройти по каким либо причинам, что-то где-то подвисло то все равно канал переключается на второй и я уже на выходе вижу смесь куска ответа на оба кода.


карма: 1

0
Ответов: 3851
Рейтинг: 159
#10: 2010-08-31 22:24:55 ЛС | профиль | цитата

1. отослать данные в порт,
2. дождаться ответа,
3. переключить канал вывода,
4. дождаться начала периода,
5. перейти к п.1.
карма: 0
начавший
1
Голосовали:Radio
Ответов: 65
Рейтинг: 1
#11: 2010-08-31 22:27:11 ЛС | профиль | цитата
В общем итоге проблема в следующем, как в схеме в этом посте добиться следующего:

При записи в Com порт первого Hex кода нужно полностью дождаться на него ответ т.е считать все 5 байт, только после этого посылать на запись второй Hex код.



Add(MainForm,7206775,308,98)
{
Width=459
Height=307
link(onActivate,6820242:doOpen,[])
}
Add(Stream2Hex,804338,490,175)
{
Mode=3
link(onResult,8553197:doEvent1,[])
link(Data,10484687:Value,[])
}
Add(ComAsync,6820242,630,98)
{
BaudRate=4800
StopBits=2
RxChar=0
TxEmpty=0
Point(onRxChar)
Point(onTxEmpty)
Point(CTSState)
Point(DSRState)
Point(RLSDState)
Point(doBreak)
Point(doXon)
Point(doClearErrors)
Point(doRXClear)
Point(doTXClear)
link(onRead,14743073:doConvert,[])
}
Add(Stream2Hex,14743073,707,98)
{
Mode=2
Point(Position)
Point(CheckSum)
link(onResult,13655515:doEvent,[])
}
Add(Insert,8762608,819,98)
{
SubStr="."
Position=4
}
Add(Convertor,2268743,819,147)
{
Mode=5
Digits=8
}
Add(Hub,8553197,539,175)
{
InCount=2
link(onEvent1,11576281:doData,[(557,181)(557,132)])
link(onEvent2,6820242:doWrite,[(605,188)(605,118)])
}
Add(Memory,10484687,490,119)
{
Default=String(0000000003)
}
Add(Stream2Hex,15062978,511,294)
{
Mode=3
link(onResult,8553197:doEvent2,[(555,300)(555,203)(529,203)(529,188)])
link(Data,1104403:Value,[])
}
Add(Memory,1104403,511,245)
{
Default=String(00000000e7)
}
Add(Convertor,16001750,581,217)
{
link(onResult,10726033:doText,[])
}
Add(Counter,16697466,315,168)
{
Max=1
Point(doValue)
link(onNext,2319846:doEvent1,[])
}
Add(Timer,10483551,252,168)
{
Interval=50
link(onTimer,16697466:doNext,[])
}
Add(Label,10726033,630,217)
{
Left=15
Top=20
Width=90
Caption="Stat"
}
Add(IndexToChanel,5504297,420,168)
{
link(onEvent1,15062978:doConvert,[(482,174)(482,300)])
link(onEvent2,804338:doConvert,[])
}
Add(Hub,2319846,364,168)
{
link(onEvent1,5504297:doEvent,[])
link(onEvent2,16001750:doConvert,[(412,181)(412,223)])
}
Add(IndexToChanel,13655515,763,98)
{
Point(Index)
link(onEvent1,8762608:doInsert,[])
link(onEvent2,2268743:doConvert,[(811,111)(811,153)])
link(Index,16697466:Count,[(769,86)(750,86)(750,333)(321,333)])
}
Add(DoData,11576281,560,126)
{
Data=Integer(5)
link(onEventData,6820242:doRead,[(611,132)(611,125)])
}


------------ Дoбавленo в 22.27:
Andrey

Вот я примерно к тому же пришел, но как реализовать это, не представляю.
карма: 1

0
Ответов: 241
Рейтинг: 45
#12: 2010-08-31 22:49:18 ЛС | профиль | цитата
Основная задача компонента ComAsync - это работа с портом в асинхронном режиме. Если не используется чтение данных по событию прихода этих самых данных, почему не использовать стандартный компонент COM, включенный в дистрибутив? Глядишь, и советов было бы больше
карма: 0

0
Ответов: 65
Рейтинг: 1
#13: 2010-08-31 23:07:13 ЛС | профиль | цитата
Wolfik

Да вот на дополнительные точки слишком скуп стандартный com, а они так необходимы.
Вы как разработчик ComAsync не могли бы показать на примере как производить простую запись/чтение в асинхронном режиме ?

карма: 1

0
Ответов: 200
Рейтинг: 5
#14: 2010-09-01 13:14:00 ЛС | профиль | цитата
Radio, на сколько мне известно, порт выдает информацию по байтно, попробуй поставить на выход ком порта связку из счетчика и условия и проверяй количество принятых байт по условию.
К сожалению это только теория так как я немогу проверить, нет такого устройства.

карма: 0

0
Ответов: 14
Рейтинг: 2
#15: 2010-09-02 13:55:53 ЛС | профиль | цитата
Radio, попробуй так.
1. Читаеш порт постоянноcode_20359.txt
2.Останавливаеш только на время передачи
3.Oбрати внимание на Delay=50 , моя железка нормально заработала только при 800
карма: 0

0
файлы: 1code_20359.txt [302B] [113]
15
Сообщение
...
Прикрепленные файлы
(файлы не залиты)