Конференция "WinAPI" » Реализация асинхронного(!) доступа к COM-порту [D7, WinXP]
 
  • MBo © (22.04.13 14:26) [20]
    Пять бит данных, два стоповых и произвольную скорость Cport поддерживает.
    Насчет срабатывания на каждый принятый байт - это, возможно, зависит от виндового драйвера порта.

    Вот, например, что про дотнетовский класс SerialPort в MSDN написано:
    The DataReceived event is not guaranteed to be raised for every byte received. Use the BytesToRead property to determine how much data is left to be read in the buffer.
    т.е. склоняют к беззастенчивому поллингу порта
  • Германн © (23.04.13 01:56) [21]

    > То есть сами байты - все приходят, но байт отправленный
    > ранее, может прочитаться только в момент прихода следующего
    > и так далее - по цепочке. а для моей задачи критично чтоб
    > байт немедленно читался. какие-нибудь идеи? может прямой
    > доступ?

    Прямой доступ конечно поможет, но без своего драйвера СОМ-порта не обойтись.
    Что гарантировано поможет, причём без всякой головной боли, то это - микроконтроллер. Он сможет легко принимать те данные, которые
    > передаются путем перемены полярности напряжения в линии
    > с двумя стоп-битами и в пятибитной кодировке

    хотя я это описание не понял.
  • Германн © (23.04.13 02:03) [22]

    > MBo ©   (22.04.13 14:26) [20]
    >
    > Насчет срабатывания на каждый принятый байт - это, возможно,
    >  зависит от виндового драйвера порта.
    >

    Именно драйвер СОМ-порта и определяет когда ему нужно генерить событие EV_RXCHAR. Определяет это он по некоему своему алгоритму в соответствии с таймаутами установленными в DCB.Но имхо и baudrate в том алгоритме учитывается. Хотя лично я на таких низких скоростях никогда не работал.
  • pihter © (23.04.13 05:06) [23]

    > Что гарантировано поможет, причём без всякой головной боли,
    >  то это - микроконтроллер

    что ты имеешь в виду, не распарсил. Какой микроконтроллер?


    >  передаются путем перемены полярности напряжения в линии
    >  с двумя стоп-битами и в пятибитной кодировке

    ну е-мое. как в СОМ-порту данные передаются? прямоугольные сигналы 5-12в переменной полярности, то плюс, то минус. стоп-биты нужны для синхронизации
  • pihter © (23.04.13 05:07) [24]

    > Именно драйвер СОМ-порта и определяет когда ему нужно генерить
    > событие EV_RXCHAR

    А если слушать порт в отдельном потоке в блокирующем режиме?
  • Вариант (23.04.13 06:51) [25]
    Давайте начнем с MSDN- а что там про DCB есть?

    А там есть -

    The use of 5 data bits with 2 stop bits is an invalid combination, as is 6, 7, or 8 data bits with 1.5 stop bits.
  • Вариант (23.04.13 07:46) [26]
    А вот посмотрев на код  в
    > pihter ©   (22.04.13 09:14) [15]


    > // Стоп-биты
    >  DCB.StopBits := 1;//[константа, определяющая кол-во стопбитов];
    >

    вижу, что выбирается 1,5 стоповых бит
    (
    ONE5STOPBITS = 1;

    )
    , что нормально. А потому дам  такой совет - начни с настроек порта, определись с тем что ты хочешь и что реально устанавливаешь,проверь, что все функции настройки порта возвращают  не ошибочный результат.
    Если все с настойками  ок, смотрим дальше...
  • pihter © (23.04.13 10:58) [27]
    да с количеством стоп-бит я уже игрался и так и так, но все равно спасибо.

    как видишь, код возврата от каждой API-функции проверяется. ошибок он не выдавал.

    и мой код - это уже второстепенно. у меня уже есть работающий пример, единственная проблема - иногда не генерируется событие прихода байта в порт, что не позволяет их своевременно получать...
  • Вариант (23.04.13 12:37) [28]

    > pihter ©   (23.04.13 10:58) [27]



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


    Если ты никогда не получаешь данных о пришедшем байте, значит ошибка в коде  или настройке порта, или порт не может корректно поддерживать заданный тобой режим работы. (считаем, что все оборудование исправно). Ошибки могут быть и в несовпадении параметров приемного и передающего оборудования - при этом у тебя должны возникнуть ошибки на порту - какие маски событий ты задал порту анализируешь ли ты ошибки порта?

    Попробуй может все же компонент, который рекомендовал MBO

    PS:
    Кстати я работал с телеграфным аппаратом через  RS232 вполне успешно.
  • Вариант (23.04.13 12:51) [29]

    > Вариант   (23.04.13 12:37) [28]

    Одним словом, как тут пишут - код в студию...
  • pihter © (23.04.13 13:31) [30]

    > Если ты никогда не получаешь данных о пришедшем байте

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


    > Кстати я работал с телеграфным аппаратом через  RS232 вполне
    > успешно.

    Я не с телеграфным аппаратом работаю, я сам создаю телеграфный аппарат, а СОМ-порт использую для ввода-вывода данных. причем я даже формат не меняю, просто делаю усилитель в линию (он же - гальваническая развязка)


    > Одним словом, как тут пишут - код в студию...

    Взят из книги, разбросан по нескольким файлам и приделан к элементам интерфейса чтоб быть настраиваемым. Все это не нужно и затрудняет чтение, найду время, все лишнее выкину, оставлю функцию инициализации и функцию приема данных, тогда и опубликую так, а то там черт ногу сломит
  • Вариант (23.04.13 13:54) [31]

    > pihter ©   (23.04.13 13:31) [30]


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


    Причин может быть несколько, без кода -  это гадание на кофейной гуще.

    И да, тебе уже говорили - событие может возникнуть на N - байт одно. А Т может быть равен не только 1
  • Германн © (24.04.13 02:26) [32]

    > pihter ©   (23.04.13 05:06) [23]
    >
    >
    > > Что гарантировано поможет, причём без всякой головной
    > боли,
    > >  то это - микроконтроллер
    >
    > что ты имеешь в виду, не распарсил. Какой микроконтроллер?

    Ты же сам упомянул некий "прямой доступ". Тогда только два варианта. Либо свой драйвер СОМ-порта, либо внешняя железяка на любом микропроцессоре. своя самодельная или купленная - это уже не мне решать.
  • Германн © (24.04.13 02:30) [33]

    > Я не с телеграфным аппаратом работаю, я сам создаю телеграфный
    > аппарат, а СОМ-порт использую для ввода-вывода данных. причем
    > я даже формат не меняю, просто делаю усилитель в линию (он
    > же - гальваническая развязка)
    >

    А ну тогда другое дело. :)
 
Конференция "WinAPI" » Реализация асинхронного(!) доступа к COM-порту [D7, WinXP]
Есть новые Нет новых   [119101   +92][b:0][p:0.001]