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 ] |
Заголовок сообщения: | |
извиняюсь конечно за глупые вопросы Как кинуть в СОМ-порт значение с вершины стека и 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/ |