Вверх ↑
Этот топик читают: Гость
Ответов: 195
Рейтинг: 1
#1: 2017-09-25 18:08:44 ЛС | профиль | цитата
нужен пример работы с компортом. какую нибудь простенькую терминалку.

есть одно устройство, которое настраивается через терминал. вот хочу склепать программку для более удобной настройки. но как работать с компортом не разобрался.
карма: 0

0
vip
#1.1контекстная реклама от партнеров
Ответов: 8885
Рейтинг: 823
#2: 2017-09-25 20:11:09 ЛС | профиль | цитата
z80,
СОМ


Add(MainForm,2953706,399,112)
{
Height=338
Point(onClose)
link(onCreate,12866054:doWork1,[])
link(onClose,9810891:doClose,[(443,139)(443,188)])
}
Add(COM,9810891,455,175)
{
link(onWrite,13499412:doCompare,[])
link(onRead,12770059:doCompare,[(502,188)(502,223)])
link(Port,12866054:Var1,[])
link(BaudRate,12866054:Var2,[])
}
Add(ChildPanel,12866054,455,126)
{
@Hint=#26:Выбор порта COM и скорости|
link(onEvent1,11608495:doEvent1,[])
}
BEGIN_SDK
Add(EditMulti,7074828,21,21)
{
EventCount=1
WorkCount=1
VarCount=2
Width=405
Height=144
link(doWork1,11868306:doEvent1,[(39,27)(39,34)])
link(Var1,5543231:Value,[(27,92)(377,92)])
link(Var2,4595330:Text,[(34,151)(41,151)])
}
Add(Panel,1419232,147,98)
{
Left=1
Top=1
Width=360
Height=38
Align=5
Point(doVisible)
}
Add(ComboBox,4356057,224,42)
{
Left=100
Top=10
Width=255
Height=21
DataType=1
link(onClick,11985537:doSearch,[])
}
Add(DeviceInfo,9938011,84,35)
{
link(onEnumDevice,10515647:doSeparateMT,[])
}
Add(StrMask,9816583,175,35)
{
Mask="*COM#*"
link(onTrue,4356057:doAdd,[])
}
Add(Hub,13018573,385,28)
{
link(onEvent1,7611251:doWork1,[(407,34)(407,96)(87,96)(87,111)])
link(onEvent2,7074828:onEvent1,[(414,41)(414,27)])
}
Add(Edit,4595330,35,105)
{
Left=20
Top=10
Text="9600"
DataType=2
Point(doEnabled)
}
Add(Hub,11868306,49,28)
{
link(onEvent1,7611251:doWork2,[(75,34)(75,118)])
link(onEvent2,9938011:doEnumDevice,[])
}
Add(ChanelToIndex,7611251,98,105)
{
link(onIndex,1419232:doVisible,[])
}
Add(MT_MultiData,10515647,126,35)
{
Count=4
link(onData4,9816583:doCompare,[(166,62)(166,41)])
}
Add(BlockFind,11985537,273,49)
{
IncludeBlock=1
StartBlock="("
EndBlock=")"
link(onSearch,4763223:doReplace,[])
link(onEndSearch,13018573:doEvent1,[(313,62)(313,34)])
}
Add(Memory,5543231,371,49)
{
}
Add(Replace,4763223,322,49)
{
SubStr="COM"
link(onReplace,5543231:doValue,[])
}
END_SDK
Add(Hub,11608495,497,126)
{
OutCount=4
link(onEvent1,9810891:doOpen,[(528,132)(528,166)(449,166)(449,181)])
link(onEvent2,519729:doClear,[(607,139)(607,230)])
link(onEvent3,7744655:doWork2,[(559,146)(559,230)])
link(onEvent4,7878420:doTimer,[(521,153)(521,162)(304,162)(304,181)])
}
Add(InfoTip,3654307,287,28)
{
Info=#293:Программа на ПК каждые пол секунды циклически: 1. очищает буфер приёма 2. отправляет знак @ контроллеру 2. принимает 7 байт с контроллера и обрабатывает >> далее см. пункт 1. А контроллер при обнаружении знака @ отправляет 7 байт в программу на ПК и переходит в ожидание нового знака @ от ПК. |0:|0:|
Width=372
Height=74
}
Add(Timer,7878420,315,175)
{
@Hint=#15:Интервал опроса|
Interval=500
Enable=1
link(onTimer,11725558:doEvent1,[])
}
Add(Hub,11725558,357,175)
{
link(onEvent1,9810891:doRXClear,[(437,181)(437,195)])
link(onEvent2,16095729:doData,[])
}
Add(If_else,13499412,511,175)
{
Type=5
Op2=Integer(0)
link(onTrue,3388875:doTimer,[(552,181)(552,109)(292,109)(292,237)])
}
Add(DoData,6479751,385,231)
{
Data=Integer(7)
link(onEventData,9810891:doRead,[(438,237)(438,209)])
}
Add(Timer,3388875,315,231)
{
@Hint=#45:Задержка чтения на время реагирования датчика|
Interval=10
Enable=1
AutoStop=1
link(onTimer,6479751:doData,[])
}
Add(StringTable,519729,616,217)
{
Left=1
Top=52
Width=398
Height=260
Align=5
Columns=#4:1=50|4:2=50|4:3=50|4:4=50|4:5=50|4:6=50|4:7=50|
Grid=0
}
Add(ChildPanel,7744655,567,217)
{
@Hint=#30:Обработка строки из 7 символов|
link(onEvent1,519729:doAdd,[])
}
BEGIN_SDK
Add(EditMulti,5078392,21,21)
{
EventCount=1
WorkCount=2
Width=566
link(doWork1,2457922:doEnum,[(36,27)(36,48)])
link(doWork2,13123038:doData,[(29,34)(29,125)])
}
Add(Panel,1913774,140,112)
{
Left=1
Top=1
Width=398
Align=2
Visible=1
Point(doVisible)
}
Add(Edit,14182937,525,112)
{
Left=5
Top=15
Text="0"
DataType=2
}
Add(Edit,3478398,469,112)
{
Left=60
Top=15
Text="0"
DataType=2
}
Add(Edit,9207547,413,112)
{
Left=115
Top=15
Text="0"
DataType=2
}
Add(Edit,12465920,357,112)
{
Left=170
Top=15
Text="0"
DataType=2
}
Add(Edit,9058301,301,112)
{
Left=220
Top=15
Text="0"
DataType=2
}
Add(Edit,14473573,245,112)
{
Left=275
Top=15
Text="0"
DataType=2
}
Add(Edit,7790254,189,112)
{
Left=330
Top=15
Text="0"
DataType=2
}
Add(IndexToChanel,2383984,140,42)
{
Count=8
Point(Index)
link(onEvent2,14182937:doText,[(518,55)(518,118)])
link(onEvent3,3478398:doText,[(455,62)(455,118)])
link(onEvent4,9207547:doText,[(400,69)(400,118)])
link(onEvent5,12465920:doText,[(345,76)(345,118)])
link(onEvent6,9058301:doText,[(290,83)(290,118)])
link(onEvent7,14473573:doText,[(235,90)(235,118)])
link(onEvent8,7790254:doText,[(180,97)(180,118)])
link(Index,2457922:NumSubStr,[(146,30)(92,30)(92,87)(55,87)])
}
Add(DoData,13123038,98,119)
{
Data=Integer(1)
link(onEventData,1913774:doVisible,[])
}
Add(FormatStr,116793,336,168)
{
DataCount=7
Mask="%7;%6;%5;%4;%3;%2;%1"
link(onFString,5078392:onEvent1,[(572,174)(572,27)])
link(Str1,7790254:Text,[(342,160)(195,160)])
link(Str2,14473573:Text,[(349,156)(251,156)])
link(Str3,9058301:Text,[(356,152)(307,152)])
link(Str4,12465920:Text,[])
link(Str5,9207547:Text,[(370,152)(419,152)])
link(Str6,3478398:Text,[(377,156)(475,156)])
link(Str7,14182937:Text,[(384,160)(531,160)])
}
Add(Convertor,5514903,98,42)
{
Mode=3
link(onResult,2383984:doEvent,[])
}
Add(Str_Enum,2457922,49,42)
{
Delimiter=""
link(onEnum,5514903:doConvert,[])
link(onEndEnum,116793:doString,[(87,55)(87,174)])
}
END_SDK
Add(If_else,12770059,511,217)
{
Type=5
Op2=String()
link(onTrue,7744655:doWork1,[])
}
Add(DoData,16095729,385,182)
{
Data=String(@)
link(onEventData,9810891:doWrite,[(431,188)(431,202)])
}

карма: 19

0
Ответов: 195
Рейтинг: 1
#3: 2017-09-26 09:21:10 ЛС | профиль | цитата
спасибо огромное.

есть у меня все таки одно недопонимание в работе компорта
я должен указать сколько байт мне принять.
вот это устройство http://mobileelectronics.com.ua/forum/index.php?topic=532.0

судя по всему ZOC терминал сам как то определяет сколько байт принять? не пойму как мне этот момент реализовать.
я понимаю, что тут вопрос уже не по хайасм а по работе компорта.
карма: 0

0
Ответов: 8885
Рейтинг: 823
#4: 2017-09-26 10:56:16 ЛС | профиль | цитата
z80, по всей видимости "эмулятор" у вас есть, а программного обеспечения нет (или дорого просят?)
Чтобы ответить на ваш вопрос, нужно ЗНАТЬ систему команд посылаемых на эту игрушку и ответов игрушки.
СОМ порт имеет небольшой буфер, в котором хранятся принятые данные. При переполнении буфера старые данные заменяются новыми и пропадают. Чтобы ничего не пропустить вы должны установить число обращений к порту и количество читаемых байт в соответствии с установленной скоростью порта.
Например при скорости 38400 бит/сек (~3840 байт/сек) и 64 чтений/сек (через 16 мсек) вы при каждом чтении должны принимать не менее 3840/64=60 байт, и наоборот, если вы установили число читаемых байт 256, то можете обращаться к порту не так часто 3840/256=~15 раз/сек или через каждые ~64 мсек.
карма: 19

0
Ответов: 195
Рейтинг: 1
#5: 2017-09-26 11:55:01 ЛС | профиль | цитата
Программного обеспечения нет. разработчик его еще не написал. Я занимаюсь установкой эмуляторов и часто приходится настраивать праметры. Вот и думаю облегчить себе труд. а то через терминал не очень удобно.
Разработчика знаю лично, думаю протоколом обмена поделится.
карма: 0

0
Ответов: 1328
Рейтинг: 69
#6: 2017-09-26 12:28:17 ЛС | профиль | цитата
z80, есть еще асинхронный СОМ порт

Add(COMEX,16722058,630,476)
{
}

--- Добавлено в 2017-09-26 12:29:13

который сам выдает принятые данные

Редактировалось 1 раз(а), последний 2017-09-26 12:29:13
карма: 2

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