Oтзывы и предложения для stranichko.org.ua

Внешняя компонента для работы с COM портом (RS232) + исходники

это кросс-пост моей статьи с инфостарта.

Итак, моя примитивная реализация внешней компоненты для работы с COM портом (RS232) на

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

Ссылки для скачивания:

Важно! Под управлением Windows 7, а возможно, и под Vista, компоненты не работают!

Не смог запустить даже с отключенным UAC из-под учетной записи администратора. Буду признателен за любую информацию по поводу!

ключевые слова: исходники, внешняя компонента, вк, COM, СОМ, порт, port, RS232, Visual C++, Visual Studio, CPP, Delphi 6, 7.7, 8, 8.0, 8.1, 8.2, 1С, 1C, vk_rs232, Borland, Delphi, исходный код, скачать, бесплатно, source, сырцы, внешней компоненты, модем, весы, сканер штрих-кодов, шк

не забываем подписываться на новые мои проделки 🙂

VN:F [1.8.8_1072]
Rating: 4.9/5 (7 votes cast)
Внешняя компонента для работы с COM портом (RS232) + исходники4.957
114 289 просмотров

32 комментария на “Внешняя компонента для работы с COM портом (RS232) + исходники”

  • Zona:

    Спасибо за отличную компоненту. есть маленький вопрос.
    Пишу обработку для отправки смс через подключенный телефон.
    Затупка на моменте
    Весы.ЗаписатьСтроку(«AT» + Символ(13) + Символ(10));
    Весы.ЗаписатьСтроку(«AT+CMGF=1» + Символ(13) + Символ(10));
    Весы.ЗаписатьСтроку(«AT+CMGS=»mobile»» + Символ(13) + Символ(10));
    Весы.ЗаписатьСтроку(message + Символ(13) + Символ(10));
    ——————————————————————
    После ввода AT+CMGS=+380001234567 идет приглашение к вводу сообщения —
    как это правильно реализовать с твоей компонентой?
    Так как в примере — результат такой
    IRP_MJ_WRITE SUCCESS Length 4: AT..
    IRP_MJ_WRITE SUCCESS Length 11: AT+CMGF=1..
    IRP_MJ_READ TIMEOUT Length 12: ..OK….OK..
    IRP_MJ_WRITE SUCCESS Length 22: AT+CMGS=»0500000000″..
    IRP_MJ_WRITE SUCCESS Length 23: Message send..
    IRP_MJ_READ TIMEOUT Length 8: ..> ..>
    Дальше все… молчок… настройки порта оставил те которые были в примере.

  • Zona:

    И ещё —
    из этой строки IRP_MJ_READ TIMEOUT Length 8: ..> ..>
    я понимаю что не завершеаю ввод сообщения и соотв следующее начинается тоже с ..> ..>
    Как закончить ввод сообщения? Он прерываетсяне вводом а ^Z — как это програмно сделать

  • Zona:

    Уже все работает — спасибо.. Так и есть — не хватало этого символа.

  • Димон:

    В windows7 попробуй зарегить компаненту из CMD причем набери в запуске CMD а когда система предложит выбор подходящих команд правой кнопкой запустить от имени амдинистратор. Потом как учили regsvr32 …..

    Мне очень надо этот компонент

    • хм.. так не пробовал, но не думаю, что поможет. Хотя и на том спасибо, попробую

      • Димон:

        Хочу прикрутить компненту на 8.2 причем на тонком клинте. Пока нифига не получается. Ошибка при ЗагрузитьВнешнююКомпоненту ,а если делать ПодключитьВнешнююКомпонету то при создании Новый(«AddIn…..») Объект не найден ил что то вэтом роде.
        Если есть каиенибудь мысли или свежие исходники — поделись плиз -)

        • а с этого места поподробнее: что за ошибка? скрин в студию, что за тонкий клиент? как раз и не представляю себе как идет работа с COM-портом в терминале, возможно никак, поэтому и ошибка.

          Можно в аську/скайп

  • Димон:

    Вроде добился чтобы работало, но по внешнему событию от сканра прилетают символы какието иероглефы. (Если проверяю порт к которму сканер приеплен (считываю сканкод с пачки сигарет)) а если в модем пытаюсь послать что то типа ATDT 888888 в лучшем случае возвращает ADTD + иероглифы. Хотелось бы увдеть что то типа NO DIALTONE или ее чтонибудь вразумитеьное. Вообще мне надо автомобильные весы прикрутить.

    Тонкий клиент — это клиентская часть 1С 8.2. (Типа весь кастрировный (без лишнего функционала так сказать облегченный), но внешние компаненты должен понимать). Сейчас задача хотябы в обычном режиме получить внятный ответ с порта. Запускаю на локальной машине WIndows 7 как раз.

    Вечером постараюсь скрины доставить в студию

    • а как добились чтобы работало?

      я так понял иероглифы приходят только под Windows 7 ? или же что-то с типами не так… или же иероглиф — это как раз символьный код передаваемого цифрового значения

      • Димон:

        Сейчас добился чтобы циры заходили нормально. Правда при поворном считывание сканером кода видимо буфер порта не отчищается или черт его знает что ему надо. Возвращает сплюсованную строку (правда сразделителем строк) штрихкодов.
        По поводу иероглифов видимо что то с типом данных и кодиокой связано.
        Если хочеш пульну исходники (напиши куда). Компилил на Delfi 2009 Lite.
        P.S. Исходня DLL которую скачивал вроде нормально обрабатовала (после перекомпелирования нчиналась бодяга с иероглифами)

        • ха.. я вижу-то что вы использовали за основу таки исходники от romix’а, у меня немного по-другому пишется в порт. Во-вторых я компилировал на Delphi 6, подозреваю что это важно.

          И после каких именно действий все это дело заработало?

          Также может следует таки посмотреть на шестнадцатиричные коды присылаемых символов? 😉

          • Димон:

            Я гдето менял тип Char на AnsiChar или WideChar Точно не помню потом вроде взвращалназад, возможно не везде. Короче зпутался и так и не понял как оно заработало. Есть еще один вопрос по инструкции Весы должны отдавать двухбайтные данные в десятках кг. — что это за хрень в каком интересно виде они считаются с порта.

            • ну, я думаю будут возвращаться по два символа, шестнадцатиричные коды которых вместе и будут давать вес. Так было у меня, когда я подключал весы — возвращались кракозяберы, потом я их сразу же в компоненте переводил в вес. Там еще остались функции hextoint, inttohex, если вы заметили

  • Димон:

    Блин а как скрин то закинуть

  • ax:

    Под Win 7 так и не сделали???

  • Димон:

    Вроде работает но возвращает что попало. Сейчас ншел исходники другие пробую. Со сканера вроде отдает по человечески. Пытаю дальше.

  • Димон:

    исходники и тестовая база http://ifolder.ru/19323857

  • ярослав:

    1С8 использует кодировку утф8
    кассовый аппарат ОЕМ
    проблема при пересылке русских символов и символов chr(253) и chr(254)
    как решить?

    • попробовать в MyClass.cpp (для сишного варианта) увеличить константу MAX_BUFFER_SIZE в функции ReaderThread

      • ярослав:

        да размера буфера хватает
        просто когда получаем переданную строку (в utf8) из SafeArray она почему то не корректно переводиться в string
        например chr(253) — переводится в chr(121)

        пробывал указать что переменная типа widestring — как будто нормально все тогда

  • ярослав:

    только нужно потом 2х байтовые символы перевести в одно (кассовый апарат только однобайтовые понимает).

  • OkeyYar:

    Спасибо за компоненту. Небольшой вопрос: пишу обработку читающую данные с весового терминала Flintec FT-11. Вот какой интересный момент. ВнешнееСобытие 1С получает данные «нарастающим итогом» с начала запуска обработки, т.е. обработчик ВнешнееСобытие в параметр Данные, грубо говоря, получает сначала 12345, потом 1234512345, потом 123451234512345 и т.д. Не пойму это связано с тем что шлет терминал или все таки в компоненте где-то не очишается буфер?

  • OkeyYar:

    Я так понимаю, что Auto Clear Tare переводит весы в режим взвешивания брутто, т.е. очищает то, что было запомнено как «вес тары»

  • Илья:

    День добрый,
    доп.вопрос от человека мола шарящего в программировании:
    1. Изменилась ли ситуация для win 7 & 8.2?
    2. Как можно понять используется ли Ваша компонента у нас?:) С семеркой проблема прям 1 в 1…

Добавить комментарий для ярослав

(обязательнo)