Вверх ↑
Этот топик читают: Гость
Ответов: 27
Рейтинг: 0
#1: 2017-11-05 11:15:17 ЛС | профиль | цитата
Здравствуйте. подскажите пожалуйста, как правильно работать с комп портом когда требуется большая скорость передачи информации с внешней схемы в hiasm через com порт?
например в текущем проекте устройство на скорости 9600 передает 15 байт данных с паузой 20мс (время передачи данных не учитывается), и у меня возникает проблема: либо программа зависает так, что ее даже в диспетчере задач не убить, либо вообще синий экран (компьютер достаточно мощный).
какая теоретически возможная скорость приема в программе hiasm? (при скорости передачи данных 9600, то есть минимальная пауза между пакетами)
как часто нужно очищать буфер RX входа?
как часть опрашивать com порт методом do read? опасно ли это делать очень часто?
моя программа

--- Добавлено в 2017-11-05 11:17:08

Add(MainForm,68149,308,98)
{
Left=21
Top=105
Width=1307
Height=749
Color=-16777194
Font=[Arial,8,0,0,1]
Ctl3D=0
Caption="Весы тест"
BorderStyle=1
}
Add(Button,83996,511,119)
{
Left=15
Top=80
Width=110
Height=25
Hint="Закрыть порт"
Caption="Закрыть порт"
Data=Real(0)
link(onClick,8939706:doCLOSE,[])
}
Add(Hub,1978584,728,112)
{
OutCount=8
link(onEvent1,9948085:doSearch,[(788,118)(788,48)])
link(onEvent2,12991404:doSearch,[(802,125)(802,139)])
link(onEvent3,8917718:doSearch,[(793,132)(793,223)])
link(onEvent4,1035903:doEvent1,[(938,139)(938,349)])
link(onEvent5,6536698:doSearch,[(784,146)(784,286)])
link(onEvent6,14575583:doSearch,[(778,153)(778,342)])
link(onEvent7,13161640:doEvent1,[(766,160)(766,454)])
}
Add(Memo,14942338,910,609)
{
Left=1085
Top=5
Width=190
Height=370
Font=[MS Sans Serif,10,0,0,1]
Name="com"
AddType=1
ScrollBars=2
}
Add(Length,13894160,847,553)
{
link(Str,11523494:GetData,[(853,543)(923,543)])
}
Add(EventFromData,12005780,847,434)
{
}
Add(Hub,13161640,791,448)
{
OutCount=6
link(onEvent1,12005780:doData,[(828,454)(828,440)])
link(onEvent2,5828708:doTrim,[(828,461)(828,503)])
link(onEvent3,13894160:doLength,[(825,468)(825,559)])
link(onEvent4,106401:doCompare,[(821,475)(821,615)])
link(onEvent5,10627377:doCompare,[(857,482)(857,685)])
}
Add(If_else,106401,847,609)
{
Type=5
Op2=Integer(0)
link(onTrue,14942338:doAdd,[])
link(Op1,13894160:Result,[])
}
Add(Trim,5828708,847,497)
{
Char=" "
link(onTrim,11523494:doData,[])
link(Text,12005780:GetData,[])
}
Add(EventFromData,11523494,917,497)
{
}
Add(InfoTip,2996018,686,532)
{
Info=#45:блок вычисляет пустую строку и не пропускает |19:ее в текстовое поле|
Width=127
Height=46
}
Add(Memo,11002733,959,35)
{
Left=160
Top=470
Width=100
Height=30
Font=[MS Sans Serif,12,0,0,1]
Name="Статичная масса, кг"
AddType=1
}
Add(BlockFind,9948085,833,42)
{
IncludeBlock=1
StartBlock="m="
EndBlock="kg"
link(onSearch,16066545:doEvent1,[])
}
Add(Hub,16066545,882,42)
{
OutCount=5
link(onEvent1,11002733:doClear,[])
link(onEvent2,11002733:doAdd,[(920,55)(920,41)])
link(onEvent3,1034609:doData,[(1004,62)(1004,40)])
link(onEvent4,10137193:doAdd,[(1004,69)(1004,89)])
link(onEvent5,8939706:getANSWER,[(908,76)(908,108)(618,108)(618,139)])
}
Add(Plotter,8629865,1239,70)
{
Left=495
Top=445
Width=755
Height=255
Name="1"
LeftMargin=60
MouseControl=1
}
Add(EventFromData,10325151,959,279)
{
}
Add(Button,3998231,1183,70)
{
Left=380
Top=465
Width=105
Height=30
Caption="clear"
link(onClick,8629865:doClear,[])
}
Add(DoData,13316099,959,679)
{
Data=Integer(20)
link(onEventData,14942338:doDelete,[(1003,685)(1003,657)(898,657)(898,629)])
}
Add(If_else,10627377,910,679)
{
Type=2
Op1=Integer(0)
Op2=Integer(21)
link(onTrue,13316099:doData,[])
link(Op1,14942338:Count,[(916,667)(923,667)])
}
Add(Button,10105139,455,224)
{
Left=15
Top=205
Width=115
Height=50
Caption="Запуск"
Data=Integer(102)
link(onClick,5523910:doEvent1,[(527,230)(527,258)])
}
Add(Edit,9090604,455,308)
{
Left=20
Top=330
Width=120
Height=35
Font=[MS Sans Serif,14,0,0,1]
Text="эталон"
link(onEnter,5523910:doEvent4,[(517,321)(517,279)])
}
Add(Hub,5523910,546,252)
{
InCount=4
OutCount=1
link(onEvent1,8939706:doWrite,[(595,258)(595,132)])
}
Add(Button,3845243,455,266)
{
Left=20
Top=295
Width=120
Height=30
Caption="калибровка"
Data=Integer(101)
link(onClick,5523910:doEvent3,[])
}
Add(Label,6134918,1008,49)
{
Left=35
Top=475
Width=120
Caption="Статичная масса, кг"
}
Add(Memo,10535636,959,126)
{
Left=160
Top=540
Width=100
Height=30
Font=[MS Sans Serif,12,0,0,1]
Name="время до максимума, сек"
AddType=1
}
Add(BlockFind,12991404,833,133)
{
IncludeBlock=1
StartBlock="tm"
EndBlock=" "
link(onSearch,14517899:doEvent1,[])
}
Add(Hub,14517899,882,133)
{
link(onEvent1,10535636:doClear,[])
link(onEvent2,10535636:doAdd,[(920,146)(920,132)])
}
Add(Label,4863512,1008,140)
{
Left=20
Top=550
Width=134
Height=17
Caption="время до максимума, сек"
}
Add(Memo,6394335,959,210)
{
Left=160
Top=505
Width=100
Height=30
Font=[MS Sans Serif,12,0,0,1]
Name="макс вес"
AddType=1
}
Add(BlockFind,8917718,833,217)
{
IncludeBlock=1
StartBlock="Mm"
EndBlock=" "
link(onSearch,4421130:doEvent1,[])
}
Add(Hub,4421130,882,217)
{
link(onEvent1,6394335:doClear,[])
link(onEvent2,6394335:doAdd,[(920,230)(920,216)])
}
Add(Label,10374660,1007,224)
{
Left=15
Top=510
Width=136
Height=17
Caption="Максимальная масса, кг"
}
Add(BlockFind,6536698,826,280)
{
IncludeBlock=1
StartBlock="t"
EndBlock="ms"
link(onSearch,10325151:doData,[(945,286)(945,285)])
}
Add(Label,2077783,1057,301)
{
Left=65
Top=420
Width=140
Height=25
Caption="Результаты измерения"
}
Add(EventFromData,1034609,1078,34)
{
}
Add(PlotLines,10137193,1078,83)
{
Grapher="1"
Color=0
Size=3
Step=1
MaxValues=50
link(ValueY,1034609:GetData,[])
}
Add(PointHint,8156450,826,7)
{
Info=#5:масса|
}
Add(Plotter,15995436,1064,399)
{
Left=165
Top=15
Width=915
Height=365
Name="2"
LeftMargin=60
MouseControl=1
}
Add(Button,3621496,1008,399)
{
Left=470
Top=385
Width=105
Height=30
Caption="clear"
link(onClick,15995436:doClear,[])
}
Add(EventFromData,12016360,959,335)
{
}
Add(BlockFind,14575583,826,336)
{
IncludeBlock=1
StartBlock="n"
EndBlock=" "
link(onSearch,11507333:doEvent1,[])
}
Add(Hub,11507333,875,336)
{
link(onEvent1,12016360:doData,[(945,342)(945,341)])
link(onEvent2,15745017:doAdd,[(924,349)(924,404)])
}
Add(PlotPoints,15745017,959,398)
{
Grapher="2"
Color=0
Size=2
link(ValueY,12016360:GetData,[])
link(ValueX,10325151:GetData,[(972,354)(965,354)])
}
Add(Memo,9382399,1337,280)
{
Left=170
Top=605
Width=180
Height=110
Font=[MS Sans Serif,12,0,0,1]
Name="инфо"
AddType=1
ScrollBars=2
}
Add(BlockFind,2027671,1176,259)
{
StartBlock="no "
EndBlock="OK"
link(onSearch,14206065:doEvent1,[(1234,265)(1234,293)])
}
Add(Hub,14206065,1260,287)
{
InCount=5
link(onEvent2,9382399:doAdd,[(1298,300)(1298,286)])
}
Add(Label,7222823,1385,294)
{
Left=45
Top=620
Width=116
Height=17
Caption="информационное поле"
}
Add(BlockFind,15426661,1176,308)
{
IncludeBlock=1
StartBlock="k="
EndBlock="=k"
link(onSearch,14206065:doEvent2,[(1234,314)(1234,300)])
}
Add(BlockFind,4528169,1176,399)
{
StartBlock="tm"
EndBlock=" "
link(onSearch,14206065:doEvent4,[(1234,405)(1234,314)])
}
Add(BlockFind,6340660,1176,448)
{
StartBlock="Mm"
EndBlock=" "
link(onSearch,14206065:doEvent5,[(1234,454)(1234,321)])
}
Add(Hub,1035903,1134,343)
{
InCount=2
OutCount=5
link(onEvent1,2027671:doSearch,[(1162,349)(1162,265)])
link(onEvent2,15426661:doSearch,[(1162,356)(1162,314)])
link(onEvent4,4528169:doSearch,[(1162,370)(1162,405)])
link(onEvent5,6340660:doSearch,[(1162,377)(1162,454)])
}
Add(MultiElementEx,8939706,630,112)
{
link(onRead,1978584:doEvent1,[])
}
BEGIN_SDK
Add(EditMultiEx,4725630,21,21)
{
WorkCount=#19:doOPEN=открыть порт|20:doCLOSE=закрыть порт|28:doWrite=запись данных в порт|69:getANSWER=получение ответа от устройства для определния нужного порта|0:|
EventCount=#45:onRead=выдает строку полученную от устройства|
Width=601
Height=396
link(doOPEN,1786124:doEvent1,[(81,27)(81,160)])
link(doCLOSE,6746360:doEvent1,[(91,34)(91,265)])
link(doWrite,10791237:doWrite,[(193,41)(193,300)])
link(getANSWER,14751753:doEvent1,[(112,48)(112,244)])
}
Add(DoData,11464109,301,336)
{
Data=Integer(15)
link(onEventData,10791237:doRead,[(338,342)(338,307)])
}
Add(COM,10791237,364,273)
{
TimeOut=8
link(onRead,4725630:onRead,[(572,286)(572,27)])
link(Port,13835982:Item,[])
}
Add(Timer,1511251,245,336)
{
Interval=18
Enable=1
link(onTimer,11464109:doData,[])
}
Add(StrList,2755069,350,147)
{
Strings=#0:|0:|
}
Add(EnumCOM,16739650,294,147)
{
OutType=0
link(onEnumPorts,2755069:doAdd,[])
}
Add(Hub,828257,217,329)
{
link(onEvent1,10791237:doRXClear,[(297,335)(297,293)])
link(onEvent2,1511251:doTimer,[])
}
Add(ArrayRW,13835982,364,210)
{
Index=String()
link(onRead,10791237:doOpen,[(408,216)(408,248)(352,248)(352,279)])
link(Array,2755069:Array,[])
link(Index,456722:Count,[])
}
Add(Counter,456722,371,91)
{
Max=20
link(onNext,8011939:doEvent1,[])
}
Add(Timer,10352413,273,203)
{
Interval=600
Enable=1
link(onTimer,7374295:doEvent1,[])
}
Add(Hub,7374295,322,203)
{
link(onEvent1,456722:doNext,[(343,209)(343,97)])
link(onEvent2,13835982:doRead,[])
}
Add(Hub,1786124,189,154)
{
OutCount=4
link(onEvent1,2755069:doClear,[])
link(onEvent2,16739650:doEnumPorts,[(249,167)(249,153)])
link(onEvent3,10352413:doTimer,[(238,174)(238,209)])
link(onEvent4,828257:doEvent1,[(210,181)(210,335)])
}
Add(Hub,6746360,168,259)
{
InCount=3
OutCount=4
link(onEvent1,14751753:doEvent2,[(196,265)(196,251)])
link(onEvent2,10791237:doClose,[(273,272)(273,286)])
link(onEvent3,456722:doReset,[(276,279)(276,111)])
link(onEvent4,1511251:doStop,[(196,286)(196,349)])
}
Add(Hub,14751753,203,238)
{
InCount=2
OutCount=1
link(onEvent1,10352413:doStop,[(224,244)(224,216)])
}
Add(Hub,8011939,420,91)
{
link(onEvent1,13485130:doData,[])
link(onEvent2,14620153:doCompare,[(452,104)(452,139)])
}
Add(If_else,14620153,469,133)
{
Op1=Integer(0)
Op2=Integer(5)
link(onTrue,358913:doEvent1,[])
link(Op1,13485130:GetData,[])
}
Add(EventFromData,13485130,469,91)
{
}
Add(Message,4738578,553,133)
{
Message="USB ADC module не подключен, либо неисправен"
Caption="Устройство не обнаружено"
Point(onOK)
link(onOK,6746360:doEvent3,[(597,146)(597,212)(156,212)(156,279)])
}
Add(Hub,358913,518,133)
{
link(onEvent1,4738578:doMessage,[])
link(onEvent2,6746360:doEvent2,[(544,146)(544,213)(149,213)(149,272)])
}
END_SDK
Add(Button,210886,508,81)
{
Left=15
Top=110
Width=110
Height=25
Hint="Закрыть порт"
Caption="открыть порт"
Data=Real(0)
link(onClick,8939706:doOPEN,[(578,87)(578,118)])
}


Редактировалось 2 раз(а), последний 2017-11-05 11:17:55
карма: 0

0
vip
#1.1контекстная реклама от партнеров
Ответов: 8887
Рейтинг: 823
#2: 2017-11-05 12:46:58 ЛС | профиль | цитата
andrewproffi, байт передаётся 10 битами, 8 бит - информация, 2 бита - старт/стоп. При скорости подачи информации 9600 бит/сек порт принимает 960 байт/сек. Чтобы успеть прочитать необходимо, чтобы число обращений к порту умноженное на количество одновременно читаемых байт было БОЛЬШЕ этой цифры.
У вас на таймере установлен период 18 мсек. Надо иметь ввиду, что таймер имеет шаг 1/64 секунды, поэтому при установке от 16 до 31 мс он будет выдавать 32 события/сек. Читаете за один раз 15 байт или 15*32=480 байт/сек при поступлении 960 байт -- буфер порта будет переполняться и часть информации пропадёт.
Читайте пореже, но больше за один раз, например по 256 байт четыре-пять раз в секунду (200 мс на таймере)
Принятую строку сшивайте и парсите по вашему протоколу.
карма: 19

0
Ответов: 16884
Рейтинг: 1239
#3: 2017-11-05 13:21:25 ЛС | профиль | цитата

Add(MainForm,2953706,21,105)
{
Height=184
Position=1
link(onCreate,4761345:doOpen,[])
}
Add(COM,4761345,210,119)
{
TimeOut=300
link(onWrite,4761345:doRead,[(349,125)(349,172)(198,172)(198,153)])
link(onRead,2156430:doEvent1,[])
}
Add(Button,8807362,21,140)
{
@Hint=#8:15 байт.|
Left=20
Top=85
Width=245
Caption="Передать строку длинной 15 байт."
Data=String(Пробная строка.)
link(onClick,11412257:doWork2,[])
}
Add(TimeCounter,11887198,126,140)
{
link(onStart,4761345:doWrite,[])
link(onStop,15860880:doText,[(177,153)(177,181)])
}
Add(Hub,2156430,266,126)
{
link(onEvent1,11887198:doStop,[(340,132)(340,215)(113,215)(113,153)])
link(onEvent2,8094035:doText,[])
}
Add(Label,15860880,210,175)
{
Left=165
Top=46
Width=4
Height=4
Font=[MS Sans Serif,8,1,255,1]
Caption=""
}
Add(Label,8094035,294,133)
{
Left=165
Top=20
Width=4
Height=4
Font=[MS Sans Serif,8,1,255,1]
Caption=""
}
Add(Label,4026407,21,189)
{
Left=10
Top=20
Width=155
Height=50
Font=[MS Sans Serif,8,1,16711680,1]
Caption="Принятая строка:\r\n\r\nЗатраченное время (мс):"
AutoSize=1
Alignment=1
}
Add(Button,11720174,21,231)
{
@Hint=#8:15 байт.|
Left=20
Top=115
Width=245
Caption="Передать строку длинной 30 байт."
Data=String(Строка длина которой - 30 байт)
link(onClick,11412257:doWork3,[(95,237)])
}
Add(HubEx,11412257,91,140)
{
link(onEvent,11887198:doStart,[])
}

карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 27
Рейтинг: 0
#4: 2017-11-05 14:09:40 ЛС | профиль | цитата
Леонид спасибо. попробую.
Tad а можно комментарии по программе? подключил преобразователь, замкнул rx tx получил результат 16-17 и 32мс
карма: 0

0
Ответов: 16884
Рейтинг: 1239
#5: 2017-11-05 17:18:41 ЛС | профиль | цитата
andrewproffi писал(а):
а можно комментарии по программе?
Какие? Читаем надписи на Label и кнопках.


Add(Memo,7846730,917,665)
{
Left=1085
Top=5
Width=190
Height=370
Font=[MS Sans Serif,10,0,0,1]
Name="com"
AddType=1
ScrollBars=2
link(Str,16343651:Result,[])
}
Add(If_else,3277017,959,616)
{
Op2=String()
link(onFalse,9054605:doCompare,[])
}
Add(Trim,16343651,917,616)
{
Char=" "
Point(Result)
link(onTrim,3277017:doCompare,[])
}
Add(InfoTip,4623456,882,567)
{
Info=#45:блок вычисляет пустую строку и не пропускает |19:ее в текстовое поле|
Font=[MS Sans Serif,8,0,255,1]
Width=190
Height=186
}
Add(If_else,9054605,1008,623)
{
Type=2
Op1=Integer(0)
Op2=Integer(20)
link(onFalse,7846730:doAdd,[(1051,636)(1051,740)(905,740)(905,671)])
link(Op1,7846730:Count,[(1014,611)(1002,611)(1002,721)(930,721)])
}

Тут тоже нужны комментарии?
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 27
Рейтинг: 0
#6: 2017-11-05 17:46:12 ЛС | профиль | цитата
ну я понял что программа выдает время за которое была отправлена строка. но не вижу в этом ответа на какой нибудь из моих вопросов.
спасибо за подсказку по упрощению, только там надо исправить, в вашей программе данные просто не будут выводится после 20 строки.
карма: 0

0
Ответов: 16884
Рейтинг: 1239
#7: 2017-11-05 18:52:12 ЛС | профиль | цитата
Это и есть ответ на
andrewproffi писал(а):
какая теоретически возможная скорость приема в программе hiasm? (при скорости передачи данных 9600, то есть минимальная пауза между пакетами)

карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 27
Рейтинг: 0
#8: 2017-11-05 19:14:18 ЛС | профиль | цитата
аа, ясно. Спасибо.
карма: 0

0
Ответов: 27
Рейтинг: 0
#9: 2017-12-22 06:56:33 ЛС | профиль | цитата
И все таки еще раз: как правильно работать с компонентом ком порта? а именно:
должно ли ожидаемое количество байт (число которое отправляться в do read компонента) быть обязательно равно числу байт которое мы принимаем? или можно чтобы оно было больше?
как часто надо подавать команду на вход doRXclear?
чем выше скорость битрейта тем лучше? (длина проводов минимальная) если компьютер слабый то надо битрейт понижать?
и как часто нужно опрашивать порт?
путь будет конкретный пример. устройство отправляет в ком порт пакет данных 20 байт каждые 200мс. как гарантировано принять пакет в одну строку? используя только выводы RX TX.

меня это вопрос интересует потому что не всегда удается получить целую строку, а она разбивается на 2 в приемнике. (передаю данные с микроконтроллера через преобразователь usb uart в компьютер)

Редактировалось 1 раз(а), последний 2017-12-22 10:42:10
карма: 0

0
Ответов: 8887
Рейтинг: 823
#10: 2017-12-22 11:53:01 ЛС | профиль | цитата
andrewproffi, ещё раз:
1. "..должно ли ожидаемое количество байт.." --- нет, не должно, просто необходимо в секунду читать чуть больше, чем установленная скорость;
2. "..как часто .. doRXclear.." --- можно совсем не подавать;
3. "..чем выше скорость битрейта тем лучше?.." --- без разницы при отсутствии помех и наводок на линию связи;
4. "..как часто нужно опрашивать порт.." --- чем реже опрашивать, тем меньше нагружается компьютер и (в третий раз) "просто необходимо в секунду читать чуть больше, чем установленная скорость";
5. "..как ... принять пакет в одну строку.." --- никак, всегда будет вероятность отвлечения компьютера на собственные нужды и разрыв сообщения.
Леонид писал(а):
Принятую строку сшивайте и парсите по вашему протоколу.

Лишь в случае, если вы сами подаёте команду устройству на выдачу данных и знаете размер их, можно организовать "в одну строку".
карма: 19

0
Ответов: 4621
Рейтинг: 746
#11: 2017-12-22 12:09:05 ЛС | профиль | цитата
andrewproffi писал(а):
устройство отправляет в ком порт пакет данных 20 байт каждые 200мс. как гарантировано принять пакет в одну строку?
Попробуй этот компонент: /topic/65137 - Mode=Length, Length=20. В этом режиме компонент будет накапливать данные независимо от того, какими порциями они поступают и выдавать ровно по 20 байт.
карма: 26

0
Ответов: 27
Рейтинг: 0
#12: 2017-12-22 12:14:21 ЛС | профиль | цитата
Спасибо Леонид!
Спасибо Netspirit, попробую.
карма: 0

0
Ответов: 27
Рейтинг: 0
#13: 2017-12-23 06:40:13 ЛС | профиль | цитата
Вроде бы сделал оптимальные настройки, принимает стабильно.
а нельзя ли добавить в компонент прерывание? чтобы компонент сам начинал чтение порта когда в него чтото прилетит?
карма: 0

0
Ответов: 8887
Рейтинг: 823
#14: 2017-12-23 10:29:58 ЛС | профиль | цитата
[b]andrewproffi[/b],

Add(COMEX,14046772,273,245)
{
}

карма: 19

0
Ответов: 27
Рейтинг: 0
#15: 2017-12-23 14:59:38 ЛС | профиль | цитата
Леонид, а что это такое и как это применить? у меня нет такого компонента...
туплю, извиняюсь. пошел искать.
вернулся, не нашел. версия моей программы hiasm 4.05 build 186, подскажите пожалуйста как следует поступить чтобы работать с SVN ?

Редактировалось 2 раз(а), последний 2017-12-23 15:16:37
карма: 0

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