Местный Сусанин Опубликовано 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 и в таблице искать его нужно не будет Кстати, всё работает уже, быстро и точно. Цитата Или что-то случилось, или одно из двух. Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.