Местный Сусанин Опубликовано 21 ноября, 2016 Жалоба Опубликовано 21 ноября, 2016 Я дико извиняюсь что влажу в беседу.... А нахрена это вообще надо? Какой практический толк от этого дела? Цитата
FreeLSD Опубликовано 21 ноября, 2016 Автор Жалоба Опубликовано 21 ноября, 2016 Напишите немножко отладочного кода:не берите от компоненты строку из N байт, а примите N однобайтных переменных,Как? :) Именно этого я и хотел бы. Но компонента отдает именно строку, а 1С сама не умеет "готовить" ТСР Нужна таблица преобразования ANSI -> Unicode? вернее, наоборот, из Unicode -> ANSI -> (byte-code)?А вот таблицу, видимо, придется какую-то использовать, только какую, не знаю. Дело в том, что и то и то - юникод. Только, как выясняется, раскладки разные. Какой практический толк от этого дела?Чтение информации с весов. Цитата Или что-то случилось, или одно из двух.
urix Опубликовано 21 ноября, 2016 Жалоба Опубликовано 21 ноября, 2016 все-таки, что возвращает компонента?Приходят, естессно, байты. Причем и телнет, и компонента, которой я пользуют, эти байты показывает в виде строки. Вот последний пример: компонента говорит, что пришло 5 байт. И показывает мне строку из 10 символов! Т.е. компонента умеет возвращать 5 байт? 5 байт - это 10 символов. или возвращает преобразованные в строку?Компонента говорит, что приходит 5 байт.Показывает строку "Ђ› "Или это уже 1С преобразовывает?Но как бы там ни было, данные надо будет доставать из 1С?, а там строка. И, похоже, это строка в ansi (win-1251). Хорошо, если прибор не должен возвращать спецсимволы, которые <20h (надо смотреть в документации). Иначе надо будет "переучивать" 1С хранить / принимать не "строку", а "байты". Как вы достаете коды символов? Почему/зачем получаете коды unicode? Часть таблицы перевода Unicode - cp1251 (русская) Цитата
CIBAS Опубликовано 21 ноября, 2016 Жалоба Опубликовано 21 ноября, 2016 (изменено) В мануалах по 1С посмотрите - нет ли там функции c_str() Она даёт доступ (указатель) на байты (именно байты "в чистом виде" без всяких учётов раскладок и кодировок) объектов типа AnsiString. Компоненты обмена по tcp при помощи сокетов как правиловозвращают именно AnsiString. Указанное справедливо для всяческих С++, в Вашем случае AnsiString,возможно, называется по-другому, но метод тот же. Изменено 21 ноября, 2016 пользователем CIBAS Цитата
_sv_ Опубликовано 21 ноября, 2016 Жалоба Опубликовано 21 ноября, 2016 Чтение информации с весов.Настоящий Telnet при установлении соединения передает дополнительные символы управления. Определяет тип терминала, раскладку клавиатуры и т.д.Putty решает эту проблему тем, что открывает сетевой порт (или COM порт) в режиме RAW.С передачей сложных символов будут проблемы у любого клиента.В дополнение к этому надо учесть, что не будет работать Backspace.Проще всего написать свою программку в 200-300 строк и обрабатывать данные уже оттуда. Цитата Сергей.
Rumlin Опубликовано 22 ноября, 2016 Жалоба Опубликовано 22 ноября, 2016 Проще всего написать свою программку в 200-300 строк и обрабатывать данные уже оттуда.Этот "прокси" где-то надо не забыть запустить и правильно настроить на адрес. Скорее всео что делать программу, что сразу нужную библиотеку - одно и тоже. Цитата Я детей вообще то боюсь, милостивый мой государь, - шумливы, жестоки и себялюбивы, а коли дети правят державой? ©Юлиан Семёнов Ничего не делается к лучшему © Борис РаушенбахЛюди, люди — это самое главное. Люди дороже даже денег. © Ф.М. Достоевский
FreeLSD Опубликовано 22 ноября, 2016 Автор Жалоба Опубликовано 22 ноября, 2016 Компонента выдает строку. Во всяком случае, 1С получает данные уже в виде строки. Дальше проблема в том, что функция КодСимвола() работает только для unicode. Но возможности преобразовать кодировку текста вроде имеются. В крайнем случае можно нарисовать свою. Сейчас буду пробовать Писать программку (да и заменять компоненту) - это крайний случай, если уж совсем ничего не получится. Дело в том, что накопили уже разборы протоколов для почти десятка разных весов, все это при замене компоненты переделывать придется. Просто у всех значения веса передаются "as is", там неважно, в какой анси/шманси цифры идут. А тут, блин, "...в прямом коде в двоичной системе счисления ..." да еще с обратным порядком байтов (а знак там потом отдельным битом в следующем байте). Цитата Или что-то случилось, или одно из двух.
_sv_ Опубликовано 22 ноября, 2016 Жалоба Опубликовано 22 ноября, 2016 (изменено) блин, "...в прямом коде в двоичной системе счисления ..." да еще с обратным порядком байтов а знак там потом отдельным битом в следующем байте.Ну нормально. С такими ситуациями рано или поздно, но приходится сталкиваться.Преобразование такой строки в Unicode может давать самые разные результаты в зависимости от того, в какой локализации работать программа.Самый удобный способ это расширить строку нулями. Получив эдакий "не настоящий" Unicode.Типа "0", "Старший байт данных", "0", "Младший байт", "0", "Знаковый байт".Тогда пара "0" + байт будет пониматься как отдельный символ Unicode.За некоторыми исключениями. Типа 00 - конец строки и т.д.В целом самое правильное решение это преобразование данных перед обработкой. Ибо не сомневайтесь, что встретятся еще более экзотические варианты. Изменено 22 ноября, 2016 пользователем _sv_ Цитата Сергей.
FreeLSD Опубликовано 22 ноября, 2016 Автор Жалоба Опубликовано 22 ноября, 2016 самое правильное решение это преобразование данных перед обработкойТаким путем и пошел. Учитывая, что 1С умеет менять кодировку текста только через файл (!), пришлось загнать таблицу кодов в структуру и искать в ней символы (ищу только если КодСимвола() получается больше 255). Вроде пока работает ) Цитата Или что-то случилось, или одно из двух.
Rumlin Опубликовано 22 ноября, 2016 Жалоба Опубликовано 22 ноября, 2016 только через файлБедный HDD. Дырку протрет :) Цитата Я детей вообще то боюсь, милостивый мой государь, - шумливы, жестоки и себялюбивы, а коли дети правят державой? ©Юлиан Семёнов Ничего не делается к лучшему © Борис РаушенбахЛюди, люди — это самое главное. Люди дороже даже денег. © Ф.М. Достоевский
FreeLSD Опубликовано 22 ноября, 2016 Автор Жалоба Опубликовано 22 ноября, 2016 Ну не столько жалко диск, сколько время на файловые операции. В структуре найти буковку проще и быстрее, чем писать/читать, к тому же за кадром 1С наверняка похожую операцию выполняет Так что не поленился забить таблицу символов. Тем более что встретятся еще более экзотические варианты. ;) Цитата Или что-то случилось, или одно из двух.
Rumlin Опубликовано 22 ноября, 2016 Жалоба Опубликовано 22 ноября, 2016 https://imgur.com/gallery/rtOD6 Цитата Я детей вообще то боюсь, милостивый мой государь, - шумливы, жестоки и себялюбивы, а коли дети правят державой? ©Юлиан Семёнов Ничего не делается к лучшему © Борис РаушенбахЛюди, люди — это самое главное. Люди дороже даже денег. © Ф.М. Достоевский
_sv_ Опубликовано 22 ноября, 2016 Жалоба Опубликовано 22 ноября, 2016 пришлось загнать таблицу кодов в структуру и искать в ней символы. Вроде пока работает С 1С я не знаком. Поэтому деталей не знаю. Но решение все равно кажется уж очень странным.Т.е. бинарные данные удается записать напрямую в файл? Т.е. при общении с весами удается получить файл размером в 3 байта?Если "да", то можно было бы преобразовать файл в читабельный вид прежде, чем преобразовывать его в строку.Грубо говоря: Читаем в бинарный файл "А", запускаем конвертилку, получаем файл "Б", преобразовываем "Б" в Unicode строку. Цитата Сергей.
FreeLSD Опубликовано 22 ноября, 2016 Автор Жалоба Опубликовано 22 ноября, 2016 Не совсем так. В файл пришлось бы писать мне, если бы я хотел изменить кодировку одной строкой кода, т.к. 1С умеет это делать только с текстовыми файлами. Строка, которая пришла с устройства - она в памяти. Поэтому, чтобы не грузить систему медленными операциями, пришлось писать свою функцию преобразования, тем более что это не так трудно. Время реакции критично - если на мониторе вес обновляется визуально позже, чем на дисплее весов, это плохо А поиск по упорядоченной коллекции времени практически не отнимает, тем более что вызываю я его только при необходимости - если код символа вылазит за пределы байта. Цитата Или что-то случилось, или одно из двух.
urix Опубликовано 22 ноября, 2016 Жалоба Опубликовано 22 ноября, 2016 Компонента говорит, что приходит 5 байт.Показывает строку "Ђ› "Получаю коды символов: 1026 4 8250 0 0Перевожу их в двоичный вид: 10000000010 00000100 10000000111010 00000000 00000000Ну и какие же это байты? Длина должна быть 40 бит.Кстати, в строке не все символы отобразились как есть, браузер, похоже, не умеет.Надо иметь контрольные примеры, в которых заранее будем знаем ответы.Из-за искажения в браузере строки "Ђ› " у вас было, что-то похожее на "Ђ┘› "?У меня получились первые 3 байта такие же как у вас: в юникоде 1026 4 8250, что соответствует 80h 04h 9Bh в однобайтовой кодировке. С двумя последними символами непонятно. Либо это нули, как у вас, либо пробелы 20h, либо остается один байт A0h с, вероятно, символом удаления 7Fh.Т.о. варианты:10000000 00000100 10011011 00000000 00000000 (Ваш) 10000000 00000100 10011011 00100000 00100000 или 10000000 00000100 10011011 10100000 01111111Если это так, то остается только написать функцию преобразования кода юникода в код анси.для код_юникод от 0 до 127 код_а = код_юникоддля код_юникод от 1040 до 1103 код_а = код_юникод - 848 //русские символыи еще 64 индивидуальных преобразования.Таблицу можно сделать в Экселе, или могу скинуть, если надо.А, ну еще и функцию преобразования десятичные_в_двоичные. Цитата
Gennadyi Опубликовано 22 ноября, 2016 Жалоба Опубликовано 22 ноября, 2016 Что за весы и где на них описание можно увидеть ?зыЗачем нужно приводить байт в соответствие с каким-то печатным символом (буквой)? Цитата Не любо - не слушай, а врать не мешай !"Величайшей ошибкой было бы думать, " © В. И. ЛЕНИН ПСС том 34, стр. 244.", было бы величайшей ошибкой думать," © В. И. ЛЕНИН ПСС том 42, стр. 74."поругаешь власть — попадаешь под закон об оскорблении, похвалишь власть — попадаешь под закон о фейковых новостях" © В. Матвиенко
_sv_ Опубликовано 22 ноября, 2016 Жалоба Опубликовано 22 ноября, 2016 Зачем нужно приводить байт в соответствие с каким-то печатным символом (буквой)?Полагаю, что это какое-то выкаблучивание 1С и/или тех "компонент", которые уже написаны. Что за весы?Та с подобными проблемами сталкиваются все, кто пишет подобные универсальные программы. Цитата Сергей.
Gennadyi Опубликовано 22 ноября, 2016 Жалоба Опубликовано 22 ноября, 2016 http://kb.mista.ru/article.php?id=77 Цитата Не любо - не слушай, а врать не мешай !"Величайшей ошибкой было бы думать, " © В. И. ЛЕНИН ПСС том 34, стр. 244.", было бы величайшей ошибкой думать," © В. И. ЛЕНИН ПСС том 42, стр. 74."поругаешь власть — попадаешь под закон об оскорблении, похвалишь власть — попадаешь под закон о фейковых новостях" © В. Матвиенко
Gennadyi Опубликовано 22 ноября, 2016 Жалоба Опубликовано 22 ноября, 2016 http://infostart.ru/public/165023/ Цитата Не любо - не слушай, а врать не мешай !"Величайшей ошибкой было бы думать, " © В. И. ЛЕНИН ПСС том 34, стр. 244.", было бы величайшей ошибкой думать," © В. И. ЛЕНИН ПСС том 42, стр. 74."поругаешь власть — попадаешь под закон об оскорблении, похвалишь власть — попадаешь под закон о фейковых новостях" © В. Матвиенко
urix Опубликовано 22 ноября, 2016 Жалоба Опубликовано 22 ноября, 2016 Что за весы и где на них описание можно увидеть ?зыЗачем нужно приводить байт в соответствие с каким-то печатным символом (буквой)?Например, нашел такое https://www.mera-device.ru/upload/iblock/233/pvm_nastolnye_red_07.13.02.pdfПередача производится после стабилизации показаний массы. Данныепередаются дважды, в виде двух одинаковых посылок. Каждая посылка содержит5 байт: Префикс Вес Знак 055h 0AAh LSB MSB SGNгде:- 1 и 2 байты – код начала посылки;- 3 и 4 байты – значение веса в граммах в двоичной системе счисления(4 байт – старший);- 5 байт – знак веса (00h — плюс, 080h — минус).Но если это тот же протокол, что и у автора темы, то, похоже, драйвер что-то не то "прочитал". Цитата
FreeLSD Опубликовано 23 ноября, 2016 Автор Жалоба Опубликовано 23 ноября, 2016 остается только написать функцию преобразования кода юникода в код анси.Да, собственно, уже. Вопрос только с одним символом - который в анси = AD. Таблицы с интернетов его не включают, т.к. браузеры его не отображают (. Вот думаю, как его влепить. Остальное вроде нормально работает.еще и функцию преобразования десятичные_в_двоичные.Я таблицу делал в hex'е, так что шестнадцатиричные в двоичные - ну так это еще проще. Цитата Или что-то случилось, или одно из двух.
FreeLSD Опубликовано 23 ноября, 2016 Автор Жалоба Опубликовано 23 ноября, 2016 Что за весы Масса-К, описание на сайте Зачем нужно приводить байт в соответствие с каким-то печатным символом (буквой)?Еще раз - так байты выдаются компонентой, которая читает порт. Других вариантов не предусмотрено, самому писать "велосипед" неохота.Но если это тот же протокол, что и у автора темыФишка в том, что свой протокол у каждого производителя, иногда еще на разные модели отличаются. Стандарта никакого нет. Поэтому каждого нового приходится вносить отдельно. Чаще они достаточно просто выглядят, отличия в нюансах, но встречаются разные приколы. А конкретно этого нельзя игнорировать, это очень популярные весы. Цитата Или что-то случилось, или одно из двух.
FreeLSD Опубликовано 23 ноября, 2016 Автор Жалоба Опубликовано 23 ноября, 2016 http://infostart.ru/public/165023/Это та самая компонента, стандарт де-факто для работы с TCP из 1С и не только ) http://kb.mista.ru/article.php?id=77А это хорошее решение, но пройденный этап - чтобы с ним работать, надо TCP порты сделать виртуальными COM-портами, а это дополнительная "прокладка", понижает производительность (проверено) и с определенного количества (примерно три десятка портов) начинает глючить (проверено). Поэтому сейчас ориентируемся на работу с TCP портами напрямую.Кстати, vk_rs232 написана довольно давно энтузиастом и до сих пор повсеместно используется, потому что 1) бесплатна 2) проста 3) функциональна.Пока работали с ней, горя не знал - у нее есть вариант, который как раз выдает байты в шестнадцатиричном виде. Цитата Или что-то случилось, или одно из двух.
urix Опубликовано 23 ноября, 2016 Жалоба Опубликовано 23 ноября, 2016 Да, собственно, уже. Вопрос только с одним символом - который в анси = AD. Таблицы с интернетов его не включают, т.к. браузеры его не отображают (. Вот думаю, как его влепить. Остальное вроде нормально работает.Какой с ним вопрос? без изменений, такой же код как и в Юникоде - AD (173)."173 AD 173 0"173 - AD - 173 0 Вы же код этого символа из строки прочитали? Цитата
FreeLSD Опубликовано 23 ноября, 2016 Автор Жалоба Опубликовано 23 ноября, 2016 А, ну если он в юникоде такой же, то вопрос снимается. Он и так меньше 255 и в таблице искать его нужно не будет Кстати, всё работает уже, быстро и точно. Цитата Или что-то случилось, или одно из двух.
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.