Внешняя компонента для работы с COM портом (RS232) + исходники
это кросс-пост моей статьи с инфостарта.
Итак, моя примитивная реализация внешней компоненты для работы с COM портом (RS232) на
- Visual C++ (MS Visual Studio 2010) написанная на основе шаблона внешней компоненты (3632 Загрузки) AmoreMe, за что ему огромное спасибо!
- Delphi 6, на взятом остюда (спасибо товарищу romix) и переделанном исходнике.
Код ни в коем случае не претендует на универсальность, слабо проработана обработка исключений. Буду благодарен за указание в комментариях всех замечаний, пожеланий и найденных ошибок.
Ссылки для скачивания:
- компонента и исходный код на Visual CPP (3360 Загрузок) ; примеры работы для 1С 7.7 (2170 Загрузок) и 1C 8.1 (2366 Загрузок) ;
- компонента и исходный код на Delphi 6 (3344 Загрузки) ; примеры работы для 1C 7.7 (1509 Загрузок) и 1С 8.1 (2559 Загрузок) ;
Важно! Под управлением 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, сырцы, внешней компоненты, модем, весы, сканер штрих-кодов, шк
не забываем подписываться на новые мои проделки 🙂
Спасибо за отличную компоненту. есть маленький вопрос.
Пишу обработку для отправки смс через подключенный телефон.
Затупка на моменте
Весы.ЗаписатьСтроку(«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: ..> ..>
Дальше все… молчок… настройки порта оставил те которые были в примере.
И ещё —
из этой строки IRP_MJ_READ TIMEOUT Length 8: ..> ..>
я понимаю что не завершеаю ввод сообщения и соотв следующее начинается тоже с ..> ..>
Как закончить ввод сообщения? Он прерываетсяне вводом а ^Z — как это програмно сделать
попробуйте в конце сообщения добавить Символ(26)
Уже все работает — спасибо.. Так и есть — не хватало этого символа.
В 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, если вы заметили
Блин а как скрин то закинуть
ну, на файлообменник какой-нить, например imageshack.us
Под 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 — как будто нормально все тогда
ну так помог widestring?
да
только нужно потом 2х байтовые символы перевести в одно (кассовый апарат только однобайтовые понимает).
Спасибо за компоненту. Небольшой вопрос: пишу обработку читающую данные с весового терминала Flintec FT-11. Вот какой интересный момент. ВнешнееСобытие 1С получает данные «нарастающим итогом» с начала запуска обработки, т.е. обработчик ВнешнееСобытие в параметр Данные, грубо говоря, получает сначала 12345, потом 1234512345, потом 123451234512345 и т.д. Не пойму это связано с тем что шлет терминал или все таки в компоненте где-то не очишается буфер?
Пожалуйста 🙂
По всей видимости так шлет именно терминал. В документации к нему ничего про это не сказано?
http://www.flintec.com/hres/FT-11%20%20FT-11D%20Technical%20Manual%20V.1.35%20GB.pdf
страница 17. «Auto Clear Tare» — не оно? Или же, возможно, весам нужно посылать код очищения результата каждый раз после приема данных.
Я так понимаю, что Auto Clear Tare переводит весы в режим взвешивания брутто, т.е. очищает то, что было запомнено как «вес тары»
тогда без понятия
День добрый,
доп.вопрос от человека мола шарящего в программировании:
1. Изменилась ли ситуация для win 7 & 8.2?
2. Как можно понять используется ли Ваша компонента у нас?:) С семеркой проблема прям 1 в 1…