Вверх ↑
Этот топик читают: Гость
Этот топик был перемещен из раздела "Помощь по среде"
Ответов: 6
Рейтинг: 0
#1: 2008-10-27 10:16:00 ЛС | профиль | цитата
Народ, прошу помощи! Задача: прием данных с GPS-приемника по RS-232. GPS-модуль выдает некоторое количество строк символов каждую секунду (строка заканчивается стандартно: "перевод строки+возврат каретки"). Собственно виндовая терминалка строки отображает корректно, без разрывов. А вот с COM-компонентом в HiAsm все намного хуже - компонент беспорядочно рвет строки, соотвественно рванную строку я уже обработать не могу. Покрутив-повертев его, я согласился что он "синхронный". На форуме нашел "асинхронный" - "ComAsync", и еще часа четыре убил за зря - так и не смог добиться нормального приема. Перепробовал практически все что можно было. Я в тупике... Ну немогу я знать сколько байт должно быть принято, т.к. каждый раз, в зависимости от текущего состояния, GPS-приемник выдает разное количество байт. Как мне быть? Прошу помочь!!!
За ранее благодарю.
карма: 1

0
Ответов: 1328
Рейтинг: 69
#2: 2008-10-27 11:14:52 ЛС | профиль | цитата
Вот nesco выкладывал схемку:code_10409.txt
------------ Дoбавленo:

konsvik, как запускаешь GPS-приемник, у меня он сам не выдает ничего, нужно передать в порт к-то строку инициализации?
карма: 2

0
файлы: 1code_10409.txt [1KB] [468]
Ответов: 5446
Рейтинг: 323
#3: 2008-10-27 11:46:05 ЛС | профиль | цитата
Konst, я экспериментировал с GPS (правда, под C++), и ничего мне в порт передавать не приходилось. Но это зависит от типа приёмника, никоторые особо продвинутые надо переключать в "текстовый" (NMEA) режим.
карма: 1

0
Ответов: 6
Рейтинг: 0
#4: 2008-10-27 11:58:36 ЛС | профиль | цитата
Konst писал(а):

У меня ZX-4125P не помню чей фирмы, так вот, ни какой инициализации делать не приходится, т.е. выдача инфы происходит сразу. А что у тебя за модель и есть на него доки? Если доки есть то разобраться не составит особых проблем. Извиняюсь за глупый вопрос, я в хиасме новичек, как использовать вышеприведенную схему? Как скормить её хиасму?
карма: 1

0
Ответов: 5446
Рейтинг: 323
#5: 2008-10-27 12:01:16 ЛС | профиль | цитата
Выдели код и вставь (Ctrl+V) в хиасм.
карма: 1

0
Ответов: 1328
Рейтинг: 69
#6: 2008-10-27 12:02:01 ЛС | профиль | цитата
NMEA по умолчанию приемник на сюзфстар 3, у него несколько вариантов запуска, холодный и горячий старт, т.ч. я думаю должна быть инициализация к-то
карма: 2

0
Ответов: 6
Рейтинг: 0
#7: 2008-10-27 21:36:14 ЛС | профиль | цитата
Konst писал(а):
NMEA по умолчанию приемник на сюзфстар 3, у него несколько вариантов запуска, холодный и горячий старт, т.ч. я думаю должна быть инициализация к-то

Про такой приемник ничего не слышал, NMEA по умолчанию - это нормально, варианты запуска к инициализации отношения не имеют. Напиши название приемника в оригинальном виде, попробую чего-нибудь нарыть.
Вот nesco выкладывал схемку:code_10409.txt

Не прокатывает этот вариант, при скорости порта 9600 и времени тактирования 1мс не освобождается весь буфер приема, т.е. идет накопление данных в буфере COM-порта. Например: считываю строку с временем 20:20:00, хотя уже принята строка 20:20:10, далее считываю строку с временем 20:20:01, хотя уже принята строка 20:20:13, и т.д. Решения проблемы не вижу. Как еще можно извернуться? Вопрос остается открытым... HELP !!!
карма: 1

0
Ответов: 8930
Рейтинг: 823
#8: 2008-10-27 22:22:23 ЛС | профиль | цитата
konsvik, обратите вниманте на примечание к точке doRead "Чтение данных из порта. Необходимое количество байт указывается в потоке" - т. е. можно читать не по одному байту, а скажем, по 256 (скорость порта, время обращения и количество байт для чтения - взаимосвязанные величины)
карма: 19

0
Ответов: 3851
Рейтинг: 159
#9: 2008-10-27 23:07:17 ЛС | профиль | цитата
если известен формат данных, то можно попробовать такую code_10416.txt схему (в мультик вставишь проверку на соответствие формату законченной строки).
карма: 0
начавший
0
файлы: 1code_10416.txt [754B] [438]
Разработчик
Ответов: 26163
Рейтинг: 2127
#10: 2008-10-27 23:10:19 ЛС | профиль | цитата
Леонид писал(а):
Необходимое количество байт указывается в потоке" - т. е. можно читать не по одному байту, а скажем, по 256

Для этого нужен немного другой накопитель


Add(MainForm,8509514,301,245)
{
}
Add(COM,5708819,462,301)
{
Port=3
link(onRead,12632153:doCase,[])
}
Add(Case,12632153,511,308)
{
Value=String()
link(onNextCase,12646442:doStrCat,[])
link(onTrue,13691511:doData,[(557,321)(557,370)])
}
Add(Case,10656416,630,364)
{
Value=String()
link(onNextCase,8036954:doWork,[])
}
Add(Timer,11901500,364,329)
{
Interval=10
Enable=1
link(onTimer,16112240:doData,[])
}
Add(DoData,16112240,413,329)
{
Data=Integer(256)
link(onEventData,5708819:doRead,[])
}
Add(Hub,15962356,301,294)
{
OutCount=3
link(onEvent2,5708819:doOpen,[])
link(onEvent3,11901500:doTimer,[(349,314)(349,335)])
}
Add(Check,8036954,693,364)
{
Caption="Out"
}
Add(Check,9419350,245,294)
{
Caption="Start"
link(onEvent,15962356:doEvent1,[])
}
Add(Check,14669078,497,350)
{
Caption="Clear"
link(onEvent,12646442:doClear,[(566,356)(566,321)])
}
Add(StrCat,12646442,581,308)
{
Point(doClear)
link(Str2,10589453:Var1,[(594,296)(570,296)(570,352)])
}
Add(DoData,13691511,581,364)
{
link(onEventData,10656416:doCase,[])
link(Data,10589453:Var2,[])
}
Add(GetDataEx,10589453,574,343)
{
link(Data,12646442:Result,[])
}

карма: 22

0
Ответов: 6
Рейтинг: 0
#11: 2008-10-28 00:02:31 ЛС | профиль | цитата
nesco писал(а):
Для этого нужен немного другой накопитель

А что мы в первом 'Case' пытаемся сравнить? Символ со строкой? Немогу же я подставить для сравнения строку. В общем то же не выход. Я прихожу к выводу что операция по выделению строки из потока должна осуществляться по приему символов "перевод строки+возврат каретки" в компоненте 'COM-port', иначе получаем рванные строки, потому как нет более способа засинхронизироваться. А сложно модифицировать компонент 'COM-port'? Ведь здорово было бы, если бы он имел опцию "выдывать данные из буфера строками заканчивающимися CF+LF".
Спасибо всем, однако впрос остается открытым...
карма: 1

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#12: 2008-10-28 00:10:17 ЛС | профиль | цитата
konsvik писал(а):
А что мы в первом 'Case' пытаемся сравнить? Символ со строкой?

А что, разве символ, это не строка длиной в один символ
карма: 22

0
Ответов: 6
Рейтинг: 0
#13: 2008-10-28 00:24:07 ЛС | профиль | цитата
nesco писал(а):
А что, разве символ, это не строка длиной в один символ?

Да конечно, но на входе 'Case' мы имеем строку длинной до 256 символов! Правильно? А если это так, то каков смысл 'Case'?
карма: 1

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#14: 2008-10-28 00:27:55 ЛС | профиль | цитата
konsvik писал(а):
А если это так, то каков смысл 'Case'?

При завершении передачи, после того, как пройдет задержка, на выходе появится пустая строка, вот ее-то Case и отлавливает, выдавая накопленные данные в поток одной строкой
карма: 22

0
Ответов: 1328
Рейтинг: 69
#15: 2008-11-05 01:35:16 ЛС | профиль | цитата
konsvik писал(а):
У меня ZX-4125P не помню чей фирмы, так вот, ни какой инициализации делать не приходится, т.е. выдача инфы происходит сразу. А что у тебя за модель и есть на него доки?

GlobalSat 353, был конфликт драйверов мобильника и GPS приемника, действительно данные идут сразу.
konsvik, а что хочешь сделать, если не секрет?

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

nesco, Прикол в том, что у GPS приемник не передает пустых строк, по этому предыдущ. схемы не работали. Вот так работает, но по моему медленно, есть предлолжения,как ускорить

Add(MainForm,8509514,70,63)
{
Width=660
Height=494
}
Add(COM,5708819,406,196)
{
BaudRate=4800
Parity=3
TimeOut=1
link(onRead,4807444:doValue,[])
}
Add(Timer,11901500,308,224)
{
Interval=1
Enable=1
link(onTimer,16112240:doData,[])
}
Add(DoData,16112240,357,224)
{
Data=Integer(1)
link(onEventData,5708819:doRead,[])
}
Add(Hub,15962356,245,189)
{
OutCount=3
link(onEvent2,5708819:doOpen,[])
link(onEvent3,11901500:doTimer,[(293,209)(293,230)])
}
Add(Check,9419350,189,189)
{
Caption="Start"
link(onEvent,15962356:doEvent1,[])
}
Add(Memo,37557,777,210)
{
Left=115
Top=65
Width=515
Height=210
ScrollBars=3
}
Add(Button,6627573,105,182)
{
Left=55
Top=12
Caption="Start"
link(onClick,9419350:doWork,[(156,188)(156,195)])
}
Add(Button,1445190,175,308)
{
Left=55
Top=50
Caption="Stop"
link(onClick,13915471:doEvent1,[])
}
Add(Hub,13915471,224,308)
{
link(onEvent1,5708819:doClose,[(331,314)(331,209)])
link(onEvent2,11901500:doStop,[(282,321)(282,237)])
}
Add(Edit,8380863,273,91)
{
Left=45
Top=95
link(onEnter,5708819:doWrite,[(355,104)(355,223)])
}
Add(ArrayRW,6457832,679,266)
{
link(Array,12555173:Array,[])
link(Value,4807444:Value,[(699,250)(475,250)])
}
Add(Case,15358791,567,203)
{
Value=Integer(13)
link(onNextCase,6457832:doAdd,[(628,200)(665,200)(665,286)])
link(onTrue,10885940:doEvent1,[])
}
Add(CharArray,12555173,679,203)
{
link(onGetStr,37557:doAdd,[])
}
Add(Hub,10885940,616,210)
{
link(onEvent1,12555173:doGetStr,[])
link(onEvent2,12555173:doClear,[])
}
Add(Convertor,10967919,511,203)
{
Mode=3
link(onResult,15358791:doCase,[])
}
Add(Memory,4807444,469,203)
{
Default=String()
link(onData,10967919:doConvert,[])
}


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

Второй вариант:

Add(MainForm,8509514,140,84)
{
Width=660
Height=494
}
Add(COM,5708819,406,196)
{
BaudRate=4800
TimeOut=1
link(onRead,4807444:doValue,[])
}
Add(Timer,11901500,308,224)
{
Interval=1
Enable=1
link(onTimer,16112240:doData,[])
}
Add(DoData,16112240,357,224)
{
Data=Integer(1)
link(onEventData,5708819:doRead,[])
}
Add(Hub,15962356,245,189)
{
OutCount=3
link(onEvent2,5708819:doOpen,[])
link(onEvent3,11901500:doTimer,[(293,209)(293,230)])
}
Add(Check,9419350,189,189)
{
Caption="Start"
link(onEvent,15962356:doEvent1,[])
}
Add(Memo,37557,798,301)
{
Left=115
Top=65
Width=515
Height=165
Font=[MS Sans Serif,10,1,0,1]
AddType=1
ScrollBars=3
link(Str,5079453:Result,[(804,268)(664,268)])
}
Add(Button,6627573,105,182)
{
Left=45
Top=177
Caption="Start"
link(onClick,9419350:doWork,[(156,188)(156,195)])
}
Add(Button,1445190,175,308)
{
Left=45
Top=215
Caption="Stop"
link(onClick,13915471:doEvent1,[])
}
Add(Hub,13915471,224,308)
{
link(onEvent1,5708819:doClose,[(331,314)(331,209)])
link(onEvent2,11901500:doStop,[(282,321)(282,237)])
}
Add(Case,15358791,567,203)
{
Value=String(0A)
link(onNextCase,5079453:doStrCat,[])
link(onTrue,10885940:doEvent1,[(626,216)(626,307)])
}
Add(Hub,10885940,714,301)
{
OutCount=3
link(onEvent1,37557:doAdd,[])
link(onEvent2,5079453:doClear,[(758,314)(758,282)(645,282)(645,216)])
link(onEvent3,9262457:doClear,[(772,321)(772,260)(703,260)(703,216)])
}
Add(Memory,4807444,469,203)
{
link(onData,9941562:doConvert,[])
}
Add(Stream2Hex,9941562,518,203)
{
Mode=2
link(onResult,15358791:doCase,[])
}
Add(StrCat,5079453,658,203)
{
Point(doClear)
link(onStrCat,9262457:doValue,[])
link(Str1,9262457:Value,[(664,191)(692,191)(692,247)(720,247)])
link(Str2,4807444:Value,[(671,174)(621,174)(621,247)(475,247)])
}
Add(Memory,9262457,714,203)
{
Default=String()
}


карма: 2

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)