Forth
http://fforum.winglion.ru/

Работа с Com портом в SPF4 и сопутствующие вопросы
http://fforum.winglion.ru/viewtopic.php?f=39&t=2275
Страница 1 из 4

Автор:  MrYuran [ Пт июл 10, 2009 09:09 ]
Заголовок сообщения: 

Попробовал поиграться с СОМ-портом.
В библиотеке ~mak/COMM4.F нашёл COMM_OPEN, COMM-SET, UEMIT,
но не нашёл COMM_CLOSE :(
В результате порт не закрывается, и при следующем подключении байты в него не выдаются
А при первом - выдаются.
Где можно взять красивую библиотеку для СОМ-порта?

Нужно писать примочку для обмена по очередному самопальному протоколу, и от перспективы рисования окошечек и кнопочек в билдере уже подташнивает...

Автор:  Kopa [ Пт июл 10, 2009 10:04 ]
Заголовок сообщения: 

MrYuran писал(а):
Где можно взять красивую библиотеку для СОМ-порта?
...


Красивую не знаю.

Поиск по каталогу \devel на слова com-close и commclose
показывает \devel\~ilya\lib\tm_com.f
\devel\~diver\comm.f

P.S. Возможно ещё есть варианты.
Можно глянуть и в Win32Forth.

Автор:  Pretorian [ Пт июл 10, 2009 11:07 ]
Заголовок сообщения: 

\devel\~pi\lib\comport.f

По умолчанию com порты имеют настройки:
- скорость: 9600
- бит данных: 8
- четность: нет
- стоповые биты: 1

com1 ( -> handle ) - хендл com1 после инициализации
com2 ( -> handle ) - хендл com2 после инициализации
com3 ( -> handle ) - хендл com3 после инициализации
com4 ( -> handle ) - хендл com4 после инициализации

COM1 ( -> flag ) - открывает порт com1
COM2 ( -> flag ) - открывает порт com2
COM3 ( -> flag ) - открывает порт com3
COM4 ( -> flag ) - открывает порт com4
COMClose ( handle -> ior ) - закрыть com порт
COMRead ( addr u handle -> c-addr u ) - читать строку из com в буфер
COMWrite ( c-addr u handle -> ) - записать строку в com порт
COMIn ( handle -- char ) - прием символа из порта
COMOut ( char handle -- ) - передача символа в открытый порт
COMSet ( handle BaudRate ByteSize StopBits Parity -> ior ) - настройка
порта
COMClear ( handle -> ) - очищает очередь приема/передачи в драйвере com порта

Код:
\ Закрыть com порт
: COMClose ( handle -> ior )
   CloseHandle ;

Автор:  Mihail [ Пт июл 10, 2009 12:04 ]
Заголовок сообщения: 

MrYuran писал(а):
но не нашёл COMM_CLOSE


В Винде компорт представлен как файла.
Хедр компорта COMM_OPEN заносит в переменную COMMid.
Стало-быть закрытие - COMMid CLOSE-FILE

Со стороны контроллера с моей прошивкой информация приходит?

Автор:  Kopa [ Пт июл 10, 2009 13:11 ]
Заголовок сообщения: 

MrYuran писал(а):
Нужно писать примочку для обмена по очередному самопальному протоколу, и от перспективы рисования окошечек и кнопочек в билдере уже подташнивает...


Можно использовать оконные либы ~yz
Примеры программ работы по "нестандартному" протоколу на SPF4

Автор:  MrYuran [ Ср июл 22, 2009 13:18 ]
Заголовок сообщения: 

Посмотрел примеры из девела, всё хорошо, только нужно ещё вручную ногами DTR и RTS махать.
В ВинАПИ это осуществляется функцией EscapeCommFunction().
Насколько я понял, нужно прописать её типа так:
WINAPI: GetCommState KERNEL32.DLL
WINAPI: SetCommState KERNEL32.DLL
WINAPI: SetCommTimeouts KERNEL32.DLL
WINAPI: PurgeComm KERNEL32.DLL
WINAPI: TransmitCommChar KERNEL32.DLL
WINAPI: WaitCommEvent KERNEL32.DLL
WINAPI: GetCommMask KERNEL32.DLL
WINAPI: EscapeCommFunction KERNEL32.DLL
Читаем далее:
Цитата:
Выполняемое действие определяется вторым параметром, который может принимать одно из следующих значений:
CLRDTR Сбрасывает сигнал DTR
CLRRTS Сбрасывает сигнал RTS
SETDTR Устанавливет сигнал DTR
SETRTS Устанавливает сигнал RTS

Насколько я опять же подозреваю, нужно знать значения этих констант, чтобы потом можно было написать что-то вроде
SETDTR EscapeCommFunction
И где их взять?

Автор:  chu [ Ср июл 22, 2009 13:27 ]
Заголовок сообщения: 

MrYuran писал(а):
И где их взять?



lib/win/const.f

Автор:  MrYuran [ Ср июл 22, 2009 13:41 ]
Заголовок сообщения: 

chu писал(а):
lib/win/const.f

Ага, спасибо!
Щас уже начну что-нибудь сварганивать.

Автор:  Mihail [ Ср июл 22, 2009 14:00 ]
Заголовок сообщения: 

1 CONSTANT SETXOFF
2 CONSTANT SETXON
3 CONSTANT SETRTS
4 CONSTANT CLRRTS
5 CONSTANT SETDTR
6 CONSTANT CLRDTR
8 CONSTANT SETBREAK
9 CONSTANT CLRBREAK

: +DTR ( -- ) SETDTR COMPORT_ID EscapeCommFunction DROP ;
: -DTR ( -- ) CLRDTR COMPORT_ID EscapeCommFunction DROP ;

: +RTS ( -- ) SETRTS COMPORT_ID EscapeCommFunction DROP ;
: -RTS ( -- ) CLRRTS COMPORT_ID EscapeCommFunction DROP ;

: +BREAK ( -- ) SETBREAK COMPORT_ID EscapeCommFunction DROP ;
: -BREAK ( -- ) CLRBREAK COMPORT_ID EscapeCommFunction DROP ;

Автор:  MrYuran [ Ср июл 22, 2009 15:57 ]
Заголовок сообщения: 

Mihail писал(а):
: +DTR ( -- ) SETDTR COMPORT_ID EscapeCommFunction DROP ;
: -DTR ( -- ) CLRDTR COMPORT_ID EscapeCommFunction DROP ;

Ага, точно, спасибо

Автор:  Ilya [ Ср июл 22, 2009 23:21 ]
Заголовок сообщения: 

Kopa писал(а):
MrYuran писал(а):
Нужно писать примочку для обмена по очередному самопальному протоколу, и от перспективы рисования окошечек и кнопочек в билдере уже подташнивает...


Можно использовать оконные либы ~yz

Либа удобная (хорошая дока, проста в понимании), но для более тонких вещей есть прекрасные либы от ~nn
Минусы: почти полное отсутствие доки, чуть сложнее в понимании (ООП)
Плюсы: гибче, легко применяется неФОРТерами GUI в nnCron-е

Автор:  MrYuran [ Чт июл 23, 2009 09:29 ]
Заголовок сообщения: 

извиняюсь конечно за глупые вопросы :shuffle;
Как кинуть в СОМ-порт значение с вершины стека и N символов тоже со стека?
Применительно к SPF.

Скорее даже не так.
Как обозначается вершина стека данных (адрес)

Сорри, уже нашёл
: COMOut ( char handle -- )
TransmitCommChar DROP ;

Ещё вот придумал:
: COMOutN ( char[] handle N -- )
0 DO DUP COMOut LOOP
DROP ;

Но так символы будут выводиться в обратном порядке.
А как вывести со стека, но в том порядке, в котором их положили?

Кстати... На стеке же 16р числа лежат, а мы выводим чары...
что-то я совсем запутался

Автор:  chu [ Чт июл 23, 2009 10:07 ]
Заголовок сообщения: 

MrYuran писал(а):
Кстати... На стеке же 16р числа лежат, а мы выводим чары...
что-то я совсем запутался


Тривиально:

\ переслать слово (2байта)
: >t ( n -- ) DUP 0xFF AND COMPORT_ID COMOut 8 RSHIFT COMPORT_ID COMOut ;

Автор:  MrYuran [ Чт июл 23, 2009 12:17 ]
Заголовок сообщения: 

MrYuran писал(а):
Ещё вот придумал:
: COMOutN ( char[] handle N -- )
0 DO DUP COMOut LOOP
DROP ;

Хрень какую-то придумал...
Надо так:
: COMOutN ( char[] handle N -- )
0 DO DUP >R COMOut R> LOOP
DROP ;

Хотя на самом деле и так не надо, а надо (с т.з. сишника) завести структуру и кидать её в файл и из

Автор:  MrYuran [ Чт июл 23, 2009 12:34 ]
Заголовок сообщения: 

Mihail,
у вас случайно по BSL никаких наработок нет?
У меня просто прошивка идёт через BSL, туда же привинчен свободный UART (если такой имеется)
Было бы очень удобно из фортовой консоли прошивать и тут же тестировать.

На худой конец, как из-под форта запустить внешние приложения (сделать типа bat-ника на форте)

Страница 1 из 4 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/