Вверх ↑
Этот топик читают: Гость
Ответов: 655
Рейтинг: 18
#1: 2013-01-20 17:42:30 ЛС | профиль | цитата
Всем привет!

Есть железка работающая через COM порт, обмен данными происходит в режиме запрос ответ, так вот при отправке какой-либо команды, ответ приходит такой же длинны т.е. отправил команду 6 байт и получил ответ 6 байт.
Но есть исключение...есть команда 6 байт...но в ответ на нее должно прийти 7 байт.
В атаче схема, вариант 1 - работает, но возникает вопрос "Правильно ли так делать?"
Вариант 2 - работает не правильно (сначало приходит 6 байт, затем еще 1 байт отдельно)
Как еще можно реализовать схему?
code_30128.txt
карма: 0

0
файлы: 1code_30128.txt [1.4KB] [205]
Разработчик
Ответов: 26164
Рейтинг: 2127
#2: 2013-01-20 17:52:43 ЛС | профиль | цитата
Gunnman писал(а):
1 - работает, но возникает вопрос

Для неасинхронного порта, который у нас -- да, так можно делать, но нужно поставить еще условие -- пропускать на чтение только, если нет 0.
------------ Дoбавленo в 17.52:
Как еще можно реализовать схему?
Постоянно читать нужное количество байтов в другом потоке (асинхронное чтение) и не пропускать на выход пустую строку, по ней же и синхронизироваться. И не забыть поставить накопитель потока

Как-тот так -- пример побайтового чтения

Add(ArrayRW,6457832,441,196)
{
link(Array,7493369:Array,[])
}
Add(Case,15358791,350,154)
{
Value=String()
link(onNextCase,6457832:doAdd,[(430,160)(430,216)])
link(onTrue,10885940:doEvent1,[])
}
Add(Hub,10885940,392,161)
{
link(onEvent1,7493369:doGetStr,[])
link(onEvent2,7493369:doClear,[])
}
Add(CharArray,7493369,441,154)
{
link(onGetStr,6051039:doCase,[])
}
Add(Case,6051039,483,161)
{
Value=String()
link(onNextCase,14653964:doWork,[])
}
Add(Check,14653964,546,161)
{
Caption="onRead"
}
Add(COM,9474096,280,147)
{
link(onRead,15358791:doCase,[])
}
Add(Thread,9924392,175,175)
{
Delay=10
link(onExec,1518419:doData,[])
}
Add(DoData,1518419,224,175)
{
Data=Integer(1)
link(onEventData,9474096:doRead,[])
}
Add(Check,4129666,91,175)
{
Caption="StartRead"
link(onEvent,9924392:doStart,[])
}

карма: 22

0
Ответов: 655
Рейтинг: 18
#3: 2013-01-20 18:01:47 ЛС | профиль | цитата
nesco, Спасибо, буду разбираться.
карма: 0

0
Ответов: 16884
Рейтинг: 1239
#4: 2013-01-20 18:26:09 ЛС | профиль | цитата
Gunnman писал(а):
Как еще можно реализовать схему?

code_30129.txt
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
файлы: 1code_30129.txt [343B] [126]
Разработчик
Ответов: 26164
Рейтинг: 2127
#5: 2013-01-20 19:11:18 ЛС | профиль | цитата
Tad, а как же вот это

Gunnman писал(а):
Но есть исключение...есть команда 6 байт...но в ответ на нее должно прийти 7 байт.

В твоей схеме примется только 6 байт, 7-й байт уничтожится очисткой буфера
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#6: 2013-01-20 20:03:35 ЛС | профиль | цитата
nesco, какой длины прийдет ответ столько и считает. И при чем здесь длинна команды ? Не надо путать буфер передачи с буфером приема.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26164
Рейтинг: 2127
#7: 2013-01-20 20:43:57 ЛС | профиль | цитата
Tad писал(а):
какой длины прийдет ответ столько и считает

Это ты откуда такую чушь взял У нас ни в одном компоненте COM не реализована функция определения действительной длины принятого буфера, это нормально можно реализовать только в асинхронном режиме. А в твоей схеме тупо длину переданной команды с onWrite, ты отправляешь на чтение этого же количества байт через компонент If_Else на doRead, а остальное тупо стирашь по doRXClear.
Или для тебя новость, что запросив 6-ть байт на чтение в одной итерации, ты и получишь только эти 6-ть байт
Откуда ты взял, что запросив 6-ть байт, ты получишь весь буфер чтения
------------ Дoбавленo в 20.43:
Tad, если тебе действительно интересно, как осуществляется асинхронное чтение всего буфера чтения, то завтра тебе могу выложить экспериментальный компонент асинхронного обмена по COM-порту, он у меня на работе просто. Он пока находится в стадии тестирования, но можете потестировать его, если хотите, может еще кто потестирует. Но, увы, он не работает под FPC из-за наличия мультипоточности
карма: 22

0
Ответов: 655
Рейтинг: 18
#8: 2013-01-20 23:55:40 ЛС | профиль | цитата
Очень ждемс экспериментальный компонент от nesco, !!
карма: 0

0
Разработчик
Ответов: 26164
Рейтинг: 2127
#9: 2013-01-21 01:55:34 ЛС | профиль | цитата
Gunnman писал(а):
Очень ждемс экспериментальный компонент от nesco, !!

Предупреждение сразу -- перед работой с этим компонентом желательно ознакомиться с ограничениями при работе с потоками. Это чтобы потом вопросов не было -- а почему он у меня вылетает
карма: 22

0
Гость
Ответов: 17029
Рейтинг: 0
#10: 2013-01-21 14:37:30 правка | ЛС | профиль | цитата


Редактировалось 4 раз(а), последний 2025-01-09 04:26:01
карма: 0

0
Разработчик
Ответов: 26164
Рейтинг: 2127
#11: 2013-01-22 12:58:36 ЛС | профиль | цитата
host-109-235-189-9.bisv.r писал(а):
Это есть в F1?

Да, есть, по элементу Thread

карма: 22

0
Разработчик
Ответов: 26164
Рейтинг: 2127
#12: 2013-01-22 13:01:42 ЛС | профиль | цитата
Вот, как и обещал -- асинхронный COM-порт, новая редакция. Работает под FPC Из-под FPC категорически не рекомендуется использовать асинхронный выход onRead совместно с интерфейсными элементами, этот выход служит для буферизированного чтения.
Для проверки примера можно использовать виртуальные COM-порты
карма: 22

0
файлы: 1comex_001.zip [5.7KB] [289]
Ответов: 655
Рейтинг: 18
#13: 2013-01-22 15:05:08 ЛС | профиль | цитата
Ок бум тестить! Спасибо!
карма: 0

0
Разработчик
Ответов: 26164
Рейтинг: 2127
#14: 2013-01-24 14:02:24 ЛС | профиль | цитата
Ну и че, кто-нибудь потестил
А то скачать -- скачали (уже 11 чел на текущий момент), а как работает -- молчат. Или до кучи качали, а шобы було
карма: 22

0
Гость
Ответов: 17029
Рейтинг: 0
#15: 2013-01-24 14:50:54 правка | ЛС | профиль | цитата


Редактировалось 4 раз(а), последний 2025-01-09 04:26:01
карма: 0

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