Pull to refresh

Comments 17

Стесняюсь спросить, а о чем вообще статья?
Для вас стало открытием, что через Com-порт нужно пересылать Byte, а не char? Мне кажется, что любой человек, более-менее работавший с железом через Com-порт в курсе этого.
Содержание статьи даже не соответствует заголовку, имхо. Разве в ней описано общение? По-моему, вы просто описали проблему, с которой встретились лично вы, и написали ее решение. Конкретно к картридеру эта проблема не имеет никакого отношения. На его месте могла бы быть любая железка. Точно с такими же проблемами, вы бы столкнулись, если бы писали не на Паскале и C#, но и при работе с Qt, например.
Не мог решить проблему несколько дней. Провёл небольшой ресерч. Решил поделиться с интернетом, может кто-нибудь из таких же новичков как я наткнётся на такую проблему. Эта статья же не мой дипломный проект. И не диссертация. Я всего лишь написал в песочницу, за что такой хейт. Если вы за справедливость, то не подскажете мне, как стоило назвать сей топик? Я бы сменил его, чтоб не нервировать старожилов :)
Я могу ошибаться, но такие вещи обычно не в статьях пишутся, а максимум на форумах решаются.
Если перефразировать вас, то эта статья выглядит примерно так:
«Есть код:
int a = 10;
int b = 3;
float c = a / b;

Несколько дней не могу решить проблему, все время неправильно вычислялось значение. И мне пришло в голову написать так: float c = (float) a / (float)b.

Решил написать статью, может поможет новичкам.»

Вы ведь не будете спорить, что это частая ошибка новичка.

Я не против статей, но в последнее время Хабр становится похож на личные блоги с заметками.
а автору запретили во время работы использовать любые терминальные программы?
Странно, что автор не знает, что в его «родном» C# строки кодируются в utf и каждый символ занимает по два байта.

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

Вы цепляетесь к словам:) Хотя я и так выделил кавычками слово «родной». Просто он мне ближе других языков, пользуюсь им около двух ле. Я же не написал, что у меня пятнадцатилетний стаж в программировании на шарпе. А про кодировку utf спасибо — буду знать
ar[0]=170;

ну, это же не Pascal )))
вот Pascal:
ar[0] := 170;

к слову, идентично
ar[0] := $AA;

команды и данные таких протоколов удобнее для понимания писать в шестнадцатиричной форме

Спасибо, что поправили. Не было под рукой ничего, поэтому вписал в статью код «от руки». А на паскале не пишу, поэтому синтаксис в голове не «закрепился». Вот и забыл про присвоение

Без обид, но это одна из классических ошибок новичка, никак не связанных с кардридерами и ком-портами. Если у вас было в институте/школе программирование — то там наверняка упоминали текстовые и бинарные файлы, и запись в них, возможно, даже производилась разными функциями. Вот это оно самое (работать с бинарным файлом, как с текстовым — и так испортить его).


А в сети вы не нашли информацию просто потому, что искали в применении к RS232. А кто работает с RS232 — обычно уже давно на эти грабли не наступает.

Да, вы правы, это ошибки новичка. С ком-портами до этого не работал(только с виртуальными). В институте было упоминание про бинарники, но тогда была одна лабораторная на 1ом курсе, где надо было записать и считать данные в\из бинарного файла. Подумал, может тоже у кого будут проблемы похожие: новички, которые не могут разобраться и найти информацию. Уже даже не знаю, нужно ли было писать этот топик

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

Скорее всего проблема в том, что у c# нативные строки (ну и char тоже) — юникодовые (UCS-2). Поэтому карт-ридеру это и не нравится. Но я-бы для начала попробовал пообщатся с ним через какой-нибудь терминал для COM портов. И мучиться не надо, колдуя над строками, и сразу видно что отвечает…
мне нужно было перенести на Pascal в MS-DOS.

как будто окунулся, лет на 20 с хвостиком. Когда на Поиск1 читал первые карточки ISO7816 через LPT, с помощью паскаля.
У нас сейчас половина машин на предприятии работает на досе. Забавно понимать, что ломаешь голову над теми проблемами, которые волновали людей 20 лет назад
Статья не про RS232, а про serial port вообще.
Хотя и не про сериал порт, а про ввод-вывод вообще.
Да и не про ввод-вывод, а про базовый уровень понимания предмета)
Не стесняйся пользоваться StackOverflow и справкой по языку/библиотекам.
Если не получается — задавай вопросы на тематических форумах.

В паскале есть замечательные типы данных AnsiChar и AnsiString — это байт и строка байтов. Самое то для работы с железом. Для шестнадцатеричных чисел префикс $, для символов #, их можно совмещать:
var
  sData: AnsiString;
//...
  sData := #$AA + #$BB + #$06 + #$00 + #$00 + #$00 + #$06 + #$01 + #$07 + #$00;
  serialPort1.Write(sData);


Вариант с массивом лучше, но немного сложней.
Sign up to leave a comment.

Articles