Comments 17
Для вас стало открытием, что через Com-порт нужно пересылать Byte, а не char? Мне кажется, что любой человек, более-менее работавший с железом через Com-порт в курсе этого.
Содержание статьи даже не соответствует заголовку, имхо. Разве в ней описано общение? По-моему, вы просто описали проблему, с которой встретились лично вы, и написали ее решение. Конкретно к картридеру эта проблема не имеет никакого отношения. На его месте могла бы быть любая железка. Точно с такими же проблемами, вы бы столкнулись, если бы писали не на Паскале и C#, но и при работе с Qt, например.
Если перефразировать вас, то эта статья выглядит примерно так:
«Есть код:
int a = 10;
int b = 3;
float c = a / b;
Несколько дней не могу решить проблему, все время неправильно вычислялось значение. И мне пришло в голову написать так: float c = (float) a / (float)b.
Решил написать статью, может поможет новичкам.»
Вы ведь не будете спорить, что это частая ошибка новичка.
Я не против статей, но в последнее время Хабр становится похож на личные блоги с заметками.
хранение в данном случае не имеет значения.
кодировка по умолчанию для строковых операций SerialPort это ASCII, итого все что выше кода 127 обрезано в знак вопроса.
косяк автора в попытке применять строки вместо байт.
ar[0]=170;
ну, это же не Pascal )))
вот Pascal:
ar[0] := 170;
к слову, идентично
ar[0] := $AA;
команды и данные таких протоколов удобнее для понимания писать в шестнадцатиричной форме
Без обид, но это одна из классических ошибок новичка, никак не связанных с кардридерами и ком-портами. Если у вас было в институте/школе программирование — то там наверняка упоминали текстовые и бинарные файлы, и запись в них, возможно, даже производилась разными функциями. Вот это оно самое (работать с бинарным файлом, как с текстовым — и так испортить его).
А в сети вы не нашли информацию просто потому, что искали в применении к RS232. А кто работает с RS232 — обычно уже давно на эти грабли не наступает.
Да нормально, мир не из одних зубров состоит, и на эти грабли новички регулярно наступают (правда, обычно им везёт больше, чем вам — пишут в файл, а не в устройство, и могут посмотреть, что же записалось, так что ошибку видят почти сразу). Если б ещё заголовок придумать такой, чтобы отражал суть проблемы...
мне нужно было перенести на Pascal в MS-DOS.
как будто окунулся, лет на 20 с хвостиком. Когда на Поиск1 читал первые карточки ISO7816 через LPT, с помощью паскаля.
Хотя и не про сериал порт, а про ввод-вывод вообще.
Да и не про ввод-вывод, а про базовый уровень понимания предмета)
Если не получается — задавай вопросы на тематических форумах.
В паскале есть замечательные типы данных AnsiChar и AnsiString — это байт и строка байтов. Самое то для работы с железом. Для шестнадцатеричных чисел префикс $, для символов #, их можно совмещать:
var
sData: AnsiString;
//...
sData := #$AA + #$BB + #$06 + #$00 + #$00 + #$00 + #$06 + #$01 + #$07 + #$00;
serialPort1.Write(sData);
Вариант с массивом лучше, но немного сложней.
Одна из возможных проблем при работе с RS232