работа с com портами

Предыдущая тема Следующая тема Перейти вниз

работа с com портами

Сообщение  electrik в Ср Окт 08, 2008 9:44 pm

привет. можно ли на FreeBasic, программировать com порты по протоколам xon/xoff. у меня на работе специальная машина для печати текста на матрицах, работает под dos, прога написана на c. мне не составит труда перевести ее на Freebasic, но мне нужно обязательно после готовности машины считать статус порта, потом в порт засылать текст. в нашей программе не используется протокол xon/xoff, но машиной он поддерживается. все сделано примитивно, засылается в машину шесть страниц, после того как она их отпечатает, приходиться нажимать на компе клавишу, чтоб она еще шесть заслала. цель, научится программировать xon/xoff, и портировать под windows и linux. если во FreeBasic читать статусы, работать по xon/xoff невозможно, я знаю точно, что можно открыть com порт winapi функцией "CreateFile, но я незнаю, что нужно подготавливать для этой функции. заранее всем огрооомное спасибо!

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 36
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: работа с com портами

Сообщение  justar в Чт Окт 09, 2008 9:54 am

Непосредственно указанный протокол, как и прочие другие протоколы, FB, как и все подобные неспециализированные ЯВУ, не знает - последовательность данных согласно протоколу должна обеспечивать твоя программа. Для чтения/записи текущего байта данных в порт принтера используются команды "INP &h3e8, value" и "value = OUT (&h3e8)" (если я не ошибся с номером порта - уточни в сетапе BIOSа твоей машины)

justar

Сообщения : 135
Дата регистрации : 2008-05-12
Возраст : 43
Откуда : Кишинёв, Республика Молдоа

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: работа с com портами

Сообщение  electrik в Чт Окт 09, 2008 4:32 pm

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

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 36
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: работа с com портами

Сообщение  justar в Чт Окт 09, 2008 4:55 pm

Ты же писал, что тебе надо под dos - там проблем точно не будет.
А под виндой если есть проблемы с правами пользователя, то они обходятся путём настройки параметра "Запускать от имени..." в свойствах программы.

justar

Сообщения : 135
Дата регистрации : 2008-05-12
Возраст : 43
Откуда : Кишинёв, Республика Молдоа

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: работа с com портами

Сообщение  electrik в Чт Окт 09, 2008 5:04 pm

да нет, мне как раз и надо под windows и linux портировать dos программу..

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 36
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: работа с com портами

Сообщение  electrik в Чт Окт 09, 2008 5:46 pm

ну вот, нашол. работа с последовательными портами в win32
http://www.citforum.idknet.com/hardware/articles/comports/

Работа с коммуникационными портами (COM и LPT) в программах для Win32
http://www.codingclub.net/Modules/Articles/Default.aspx?cat=2&id=474


как я и думал, все обращения происходят через winApi функцию "CreateFile". статьи расчитаны под c, но под FreeBasic 100% можно переписать.

Работа с СОМ-портом в Windows (W9x, W2k)
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1126
ну а это уже под delphi, кто знает разберется.

Работа с Com портом под Windows
http://www.realcoding.net/article/view/169
совсем кратенько про порты, лишь только подробно описываются параметры winApi функции "CreateFile.

http://www.cyberguru.ru/cpp-sources/hardware/rabota-s-com-i-lpt-portom-createfile.html
еще про com порты, походу на этом сайте, много чего полезного.

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 36
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Кстати :-)

Сообщение  ShenZN в Чт Окт 09, 2008 5:54 pm

Кстати, один из самых молодых разделов на официальном форуме Hardware Interfaces / Communication (For issues with communication ports, protocols, etc.) Что в переводе Аппаратные интерфейсы / Связь (Для вопросов по коммуникационным портам, протоколам и т.д.)
Много интересной информации можно почерпнуть Very Happy

Electrik спасибо за ссылки Very Happy

ShenZN

Сообщения : 155
Дата регистрации : 2008-02-18
Откуда : Ukraine

Посмотреть профиль http://lodestar-game.narod.ru

Вернуться к началу Перейти вниз

Re: работа с com портами

Сообщение  Замабувараев в Пт Окт 10, 2008 10:45 am

Извините, но в документации по FreeBASIC'у, которую можно скачать http://downloads.sourceforge.net/fbc/FB-manual-0.20.0-chm.zip всё написано, я не буду копировать оттуда текст, ищите по ссылке Open COM. Никаких WinAPI не нужно, приложение будет кроссплатформенным.
А за ссылки спасибо, я много чего узнал, о некоторых вещах даже не подозревал.
avatar
Замабувараев

Сообщения : 99
Дата регистрации : 2008-08-20
Возраст : 33
Откуда : Красноярск

Посмотреть профиль http://www.freebasic.su

Вернуться к началу Перейти вниз

Re: работа с com портами

Сообщение  electrik в Пт Окт 10, 2008 5:02 pm

да я знаю, что FreeBasic поддерживает ком порты функцией open com. но я не уверен, что при помощи FreeBasic, можно реализовать мою задачу, по этому, я и открыл тему ком портов. но вообще спасибо, почитаю по подробней мануал, может в новых версиях что-нибудь появилось.

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 36
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: работа с com портами

Сообщение  electrik в Сб Ноя 14, 2009 6:01 pm

решился я взяться снова за эту программу. переписал код под dos, забил пока на винды и линукс. столкнулся с проблемой.
не как не считать статус порта. пока забил на xon/xoff, но даже перед засылкой символяа в порт, надо прочитать пятый бит регистра порта.
на пример, у порта com1, адрес 3f8, адрес регистра статуса 3fd.
родная программа написана на turbo c, я переписал под freebasic, не
фига не работает, тоесть не приходит пятый ьбит. блин, почемуж во FreeBasic, так все криво сделано.
может кто-нибудь с этим заморачивался. пойду на оф сайт.

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 36
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: работа с com портами

Сообщение  tux в Сб Ноя 14, 2009 7:22 pm

а если через ассемблеровскую вставку, тоже самое?
avatar
tux

Сообщения : 365
Дата регистрации : 2008-04-06
Возраст : 29
Откуда : Сибирь

Посмотреть профиль http://tux.nsk.ru/

Вернуться к началу Перейти вниз

Re: работа с com портами

Сообщение  electrik в Сб Ноя 14, 2009 9:25 pm

попробовать можно. а в linux, на прямую к порту сработает? вот какая тема. мы хотим с dos перейти на linux. почему я и переписываю прогу, так мне удобней. хотя, если под линукс прямое обращение к порту разрешено, я могу оставить и сишную прогу, просто переписать код на прямую. в программе используются функции из bios.h. под windows, в mingw такого заголовочного файла нет.

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 36
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: работа с com портами

Сообщение  electrik в Сб Ноя 14, 2009 9:56 pm

блин, какой синтаксис чтения и запись в порты у gas. такая хрень как:
in al,61h ;получим значение порта 61h в al
or al,3 ;инициализируем динамик и подаем ток в порт 61h
out 61h,al
не прокатывает. мне казалось, что раньше я пробовал мудрить, хотя, может и не с gas.
может там типа
inport
outport
попробовал, не работает.

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 36
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: работа с com портами

Сообщение  electrik в Вс Ноя 15, 2009 1:28 am

Программирование на аппаратном уровне RS-232
http://bugtraq.ru/library/programming/rs232.html
после прочтения данной статьи, мне сразу много чего открылось.
оказывается, я программировал не тот регистр, вот так бывает.
мало того, и не тот бит проверял. это моя ошибка. плохо читал. там написано бит 5, а я проверял бит 5, только с учетом битов от 1 до 8, а не от 0 до 7.
вот такие глюки ловлю, хотя знаю, что так биты надо считать. ох как ржать охото!
но все-равно остается вопрос. если использовать стандартные функции FreeBasic, get#, put#, состояние порта, когда некое устройство посылает информацию о том, что оно отдает байт, придется читать на прямую.

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 36
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: работа с com портами

Сообщение  tux в Вс Ноя 15, 2009 7:08 am

В линухе можно сделать примерно так...
Во первых, все устройства в нем размещаются в файловой системе (для меня по первой это было странно), размещены обычно в /dev/, и драйвера ядра позволяют общаться с устройствами также как и с файлами.
Во вторых, надо иметь права, на работу с устройством, но во время испытаний мона с етим пока не заморачиваться и делать все из под рута, у него везде прав хватит Smile
В итоге, чтобы сделать нечто на порте, мы должны сделать следующее: открыть как обычный файл в бинарном режиме устройство /dev/port, спеститься на 378 (иль скок надо) байт seek-ом и записать/прочитать нужный байт. Вот както так это должно выглядеть. Однако помимо /dev/port обычно создают устройство /dev/lp0 - которое и есть уже сам lpt порт, как с ним работать я незнаю, но подозреваю, что аналогично, тока в нем ограниченное адресное пространство под один порт.
avatar
tux

Сообщения : 365
Дата регистрации : 2008-04-06
Возраст : 29
Откуда : Сибирь

Посмотреть профиль http://tux.nsk.ru/

Вернуться к началу Перейти вниз

Re: работа с com портами

Сообщение  electrik в Пт Ноя 20, 2009 8:02 pm

наконец, у меня заработала машина пума. но вот такая ерунда. к примеру, открываю я ком порт на 9600, соответственно, я должен засылать символы в порт именно с этой скоростью. я думал, что во FreeBasic, функция put, сама обрабатывает этот случай, а нет. покрайней мере под dos- не пашет. символы летят в порт со злющей скоростью, следовательно, машина захлебывается. ставлю слееп 2, тоже не прокатывает. видимо это проблема dos, слееп может работать только 1/18, тоесть начиная с 55 мс.
где-то, когда я учил ассемблер, было написано как под dos увеличить частоту прерывания таймера. но там через прерывания dos.
можно попробовать не слееп, а сверяться с таймером. может он настроен по нармальному.
короче, во FreeBasic, работа с ком портами, реализована не очень. не возможно проверить состояние регистров, приходиться на прямую обращатся к портам. конечно если юзать модем, в самый раз, а вот мудрить с приборами-, приходится применять низкий уровень.
хорошо, что они сделали обращения к портам через дрова,. тоесть под dos, линукс и windows, можно писать на низком уровне. правда в linux, прогу, наверное, придется запускать с особыми правами, но это фигня.
тукс, ты пробовал под linux, запускать программу следующего содержания:

Код:

'speakersound.bas
Sub Sound(ByVal freq As UInteger, dur As UInteger)
  Dim t As Double,f1 As Unsigned Short
    f1 = 1193181 \ freq
    Out &h61,Inp(&h61) Or 3
    Out &h43,&hb6
    Out &h42,LoByte(f1)
    Out &h42,HiByte(f1)
    t=Timer
    While ((Timer - t) * 1000) < dur
      Sleep 0,1
    Wend
    Out &h61,Inp(&h61) And &hfc
End Sub

Sound(523, 60)  'C5
Sound(587, 60)  'D5
Sound(659, 60)  'E5
Sound(698, 60)  'F5
Sound(784, 60)  'G5
Sound(880, 60)  'A5
Sound(988, 60)  'B5
Sound(1046, 60) 'C6

она работает из любого пользователя, или только из root?
просто я в линухе, не спец, а прогу надо продумать, чтоб она работала.
заработает нормально под dos, поставлю linux и буду портировать. я не просто так, заморочился с портами, ведь это единственный способ, который портируемый. а поповоду таймеров, ну там вы сами знаете
#ifdef __FB_DOS__
всякая фигня под \dos
#endif
просто хочется сделать так, чтоб было минимальное изменение кода.
пойду, погляжу wiki, хотя там уже все перешуршено.

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 36
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: работа с com портами

Сообщение  electrik в Пт Ноя 20, 2009 10:02 pm

повнимательней прочитав про sleep и таймер, выяснилось следующее:
The accuracy of Sleep is variable depending on the OS cycle time (Windows NT/2K/XP: 15 ms, 9x/Me: 50 ms, Linux 10ms, DOS 55 ms).
что означает:
Точность sleep зависит от времени цикла OS. (Windows NT/2K/XP: 15 мс, 9x/ме: 50 мс, Linux 10ms, DOS 55 мс).
так что в dos, sleep можно применять как:
print"нажмите любую клавишу"
sleep
с такой большой задержкой, ни чего не замутить.
а про таймер, написано:
If the processor has a precision timer (as the Performance Counter Pentium processors from
Intel have) and the OS uses it, the precision is linked to the processor clock and microseconds can be expected. With older processors (386, 486), and
always in DOS, the resolution is 1/18 second.
если у тебя процессор intel пентиум с прецизионным таймером, все отсчитывается, вплодь до одной мс. с процессором 386, 486, и всегда в dos, отсчет идет 1/18- тоесть, 55 мс.
неужели, под dos, мне придется использовать функции bios. кстати, я так пробовал, все работает нормально. эти функции сами знают, сколько ждать после засылки символа в порт и т.д.
кстати, от куда они это знают. не ужели, включают более большую скорость прерывания таймера.
может кто-нибудь знает, чем можно заменить функции из файла bios.bi, или для языка си - bios.h
в mingw, этих заголовков нет. в линуксовом gcc, я думаю тоже.
но ведь народ как-то портирует свои старые проги. не ужели, сами в ручную переписывают через функции ос.
вот блин, заморочился, но все-таки интересно. надо добить. впринципе, на работе меня об этом не просили, просто мне надоело нажимать каждые 6 страниц, любую клавишу. вот я и решил переписать прогу на FreeBasic, и работать по xon/xoff. пума это поддерживает.

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 36
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: работа с com портами

Сообщение  tux в Сб Ноя 21, 2009 5:45 pm

тукс, ты пробовал под linux, запускать программу следующего содержания:
с правами работает, пиликает Smile
avatar
tux

Сообщения : 365
Дата регистрации : 2008-04-06
Возраст : 29
Откуда : Сибирь

Посмотреть профиль http://tux.nsk.ru/

Вернуться к началу Перейти вниз

Re: работа с com портами

Сообщение  electrik в Вс Ноя 22, 2009 10:36 pm

Tux, огромное спасибо, будем пробовать.
когда-то я выкладывал свою колекцию справочников по ассемблеру, вот советую почитать от туда:
Справочник программиста на персональном компьютере фирмы IBM
вся информация по ком портам и вообще по всему компу. не каких задержек делать не надо. я читал дешевые статейки, в которых не сказана важная вещь.
помимо проверки бита 4 регистра &h3f8+6, статус модема, надо проверять пятый бит статуса линии, регистр &h3f8+5.
только когда статус линии готов, тоесть буфер порта пуст, тогда можно слать байт.
в этом справочнике все рассказывается как писать на бейсике, функциями dos, функциями bios, работа на прямую с портами и прямое обращение к памяти, к адресам портов. тоесть, приводится программа на бейсике, а потом на ассемблере.
справочник очень древний, тогда еще pentium в проекте небыло, но это азы, которые очень полезны, если хочешь писать на прямую в железо.
как здорово, что такое есть и на русском.

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 36
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: работа с com портами

Сообщение  electrik в Ср Ноя 25, 2009 8:27 pm

у меня, наконец то заработала машина по протоколу xon/xoff.
правдо, в dos при закрытии ком порта есть глюк.
короче, говорю все последовательно.
включаю комп, пока он грузится включаю пуму.
после загрузки операционки, запускаю прогу на печать- все работает
завершаю программу, запускаю снова, а она не работает, постоянно получает xoff.
перегружаю пуму, запускаю прогу, так-же все не работает.
перезапускаю комп, после загрузки dos, запускаю прогу, все работает.
видимо, как-то по левому закрывается порт. закрываю порт командой close без параметров. в документации, написано что так можно. close, закрывает все открытые файлы и устройства.
завтра попробую закрыть с параметром, мож глюк пройдет.
а вообще, надо порытся по инету, и узнать, как правильно закрыть порт.
если кто-нибудь встречался с такой проблемой, напишите.
так же в документации к freeBasic'у сказано, что в dos поддержка com портов эксперементальна от com1, до com4
блин, как не охото самому писать функцию инициализации порта. если глюк не выяснится, придется.

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 36
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: работа с com портами

Сообщение  electrik в Вт Дек 08, 2009 11:57 pm

ну все, проблема решена, но только под dos. программа работает и после перезагрузки машины. вот только через функции биос это решилось.
если надо, расскажу как с com работать через биос.
короче, почему-то на прямую с портами, не как не получить статус того, что пришел байт.
через биос прокатывает. но мне от этого радости мало.
задумка была сделать многоплатформенную программу, а получилась зависит от биос, причем только в dos.
сегодня попробовал опять, переписать функциями FreeBasic,
print #
и т.д.
но почему-то символы летят в порт не с скоростью с которой я его открыл, а влет.
пытался искать универсальную библиотеку, пока безуспешно.
правда что-то видел для c++, но там с шаблонами и т.д.
понятно, что на c++ написать можно все, но моя цель, добится управление пумой полностью на FreeBasic.
у меня пока наработе нет машины с windows, некак не проверить, может там будет все нормально. раз в винде нормально, в линуксе, надеюсь, тоже будет работать.
ух уж этот com порт. а если потом придется так-же с usb, еще ьбольше намучаюсь.
хотя, в винде и linux, с этим все впорядке.

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 36
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: работа с com портами

Сообщение  tux в Ср Дек 09, 2009 3:55 am

с usb какраз по моему все проще, тк ща есть куча контроллеров, превращающих его в обычный параллельный порт, ну соответственно дрова или библиотеки для работы с ними, но ет конечно если делать нечто под свое устройство, а не уже для готового
avatar
tux

Сообщения : 365
Дата регистрации : 2008-04-06
Возраст : 29
Откуда : Сибирь

Посмотреть профиль http://tux.nsk.ru/

Вернуться к началу Перейти вниз

Re: работа с com портами

Сообщение  Спонсируемый контент


Спонсируемый контент


Вернуться к началу Перейти вниз

Предыдущая тема Следующая тема Вернуться к началу


 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения