Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Cardinal to binary / 25 сообщений из 25, страница 1 из 1
12.02.2018, 09:53
    #39600411
Ддэкки
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cardinal to binary
Здравствуйте
По RS232 порту принимаю 10 байт.
В Hex формате вижу это как FF FF FF FF FF.

Как мне из этих данных получить то, что хочу, а именно:
Откинуть из 40 разрядов 8 правых и 7 левых (еще один разряд - контрольный)?

Получается все только целиком.
Буфер типа Cardinal.

Спасибо.
...
Рейтинг: 0 / 0
12.02.2018, 11:02
    #39600460
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cardinal to binary
Ддэкки,

В Cardinal - никак, это число туда не влезет.
...
Рейтинг: 0 / 0
12.02.2018, 11:32
    #39600485
DesWind
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cardinal to binary
Ддэкки,
Код: pascal
1.
2.
3.
4.
5.
  TPacket=packed record
      B1: byte;
      I: Int64;
      B2: byte;
   end;
...
Рейтинг: 0 / 0
12.02.2018, 12:05
    #39600507
SOFT FOR YOU
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cardinal to binary
Ддэкки,

10 байт это не 40 разрядов )
...
Рейтинг: 0 / 0
12.02.2018, 12:26
    #39600521
Ддекки
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cardinal to binary
В школе такого не говорили.
В буфере 40 разрядов в двоичном коде, он типа кардинал.
Может поэтому и не получается считать, чтоне все влезло.

Второй вариант - 16 разрядов и вторая посылка тоже 16 разрядов.

Как мне из 16 разрядов выкинуть первый только и три последних?

Спасибо.
...
Рейтинг: 0 / 0
12.02.2018, 12:30
    #39600522
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cardinal to binary
Придется почитать про битовые операции...
Именно тут помогут AND SHL SHR .
...
Рейтинг: 0 / 0
12.02.2018, 12:33
    #39600525
Ддекки
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cardinal to binary
Если посылка 69 00 00 00 00,
То первые две цифры вижу как 1001 0110
Вроде так
Получается 10 * 4 разряда
Спасибо
Но надо откинуть еще по бокам
...
Рейтинг: 0 / 0
12.02.2018, 12:42
    #39600536
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cardinal to binary
ДдэккиПо RS232 порту принимаю 10 байт.

COM-порт отдает данные по одному байту.
В зависимости от настройки передающего компьютера, в байте от 5 до 8 битов.

В любом случае ты принимаешь по одному байту.
Вот и клади каждый байт в то место буфера, куда оно попаде
т
...
Рейтинг: 0 / 0
12.02.2018, 12:44
    #39600538
s62
s62
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cardinal to binary
ДдэккиЗдравствуйте
По RS232 порту принимаю 10 байт.
В Hex формате вижу это как FF FF FF FF FF.
Как уже написали, это не 10 байт, а 5.
Про битовые операции можно почтитать например вот здесь:
http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=838
...
Рейтинг: 0 / 0
12.02.2018, 13:33
    #39600594
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cardinal to binary
Ддэкки,

И, да, это 5 8-ми битных байт.
авторОткинуть из 40 разрядов 8 правых и 7 левых
Если 'откинуть' - это обнулить, то делай AND с данными. Второй операнд AND'а называется маска, в ней устанавливаешь биты, которые нужно сохранить в 1, те, которые сбросить - в 0. Делаешь AND, получаешь результат. Если тебе, конечно, не подвинуть биты надо. С задачей, в общем, нужно разобраться вначале. Прежде чем её решать. С данными, с результатом. Что было и что нужно что бы стало.
...
Рейтинг: 0 / 0
12.02.2018, 13:41
    #39600597
СССпасибо
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cardinal to binary
Спасибо, буду смотреть.
Используется функция fileRead и один из параметров buffer , типа Cardinal. Она из модуля system
Так туда влезает 5 байт?
И читает она за раз, не знаю как реализована.
То есть по брейку вижу, что число есть в буфере.

Спасибо
...
Рейтинг: 0 / 0
12.02.2018, 13:57
    #39600604
Vizit0r
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cardinal to binary
открой для себя инфу
http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Simple_Types_(Delphi)

чтобы не возникало в будущем вопросов, влазит ли 5 байт в Кардинал или нет.
...
Рейтинг: 0 / 0
12.02.2018, 13:59
    #39600605
Ддэкки
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cardinal to binary
Ссулку посмотрел, понятно...

Ну вот не понял как мне указать в каком из байтов я хочу что-то делать.
Например, переключить бит 2 о втором байте, или проверить состояние 5 бита в 3 байте.

Спасибо!
...
Рейтинг: 0 / 0
12.02.2018, 14:02
    #39600607
Vizit0r
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cardinal to binary
{ val := val or (1 shl N); // установка бита
val := val and not (1 shl N); // сброс бита
val := val xor (1 shl N); // инверсия бита
if (val and (1 shl N)) <> 0 then проверка установленного бита
где val - само число,
а N - номер бита (от 0 и до ...) }
...
Рейтинг: 0 / 0
12.02.2018, 14:16
    #39600613
SLab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cardinal to binary
СССпасибоСпасибо, буду смотреть.
Используется функция fileRead и один из параметров buffer , типа Cardinal. Она из модуля system
Так туда влезает 5 байт?
И читает она за раз, не знаю как реализована.
То есть по брейку вижу, что число есть в буфере.

Спасибо
Я давно на делфях не писал, но параметр buffer по идее должен быть указателем на область памяти куда считывать данные, что там у вас за функция, где buffer типа cardinal не понятно.
...
Рейтинг: 0 / 0
12.02.2018, 14:16
    #39600614
Ддэкки
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cardinal to binary
Да, влезет только 32 разряда, 4 из 5 байт
...
Рейтинг: 0 / 0
12.02.2018, 14:20
    #39600615
SLab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cardinal to binary
SLabСССпасибоСпасибо, буду смотреть.
Используется функция fileRead и один из параметров buffer , типа Cardinal. Она из модуля system
Так туда влезает 5 байт?
И читает она за раз, не знаю как реализована.
То есть по брейку вижу, что число есть в буфере.

Спасибо
Я давно на делфях не писал, но параметр buffer по идее должен быть указателем на область памяти куда считывать данные, что там у вас за функция, где buffer типа cardinal не понятно.
Ну вот так и есть
Код: pascal
1.
2.
function FileRead(Handle: THandle; var Buffer; Count: LongWord): Integer;
function FileRead(Handle: THandle; var Buffer: TBytes; Offset, Count: LongWord): Integer;



http://docwiki.embarcadero.com/Libraries/Tokyo/en/System.SysUtils.FileRead
...
Рейтинг: 0 / 0
12.02.2018, 14:21
    #39600617
Vizit0r
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cardinal to binary
он видимо подумал, что Buffer тоже имеет тип Cardinal.
...
Рейтинг: 0 / 0
12.02.2018, 14:51
    #39600631
Ддэкки
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cardinal to binary
Я сейчас еще в школе, но насколько помню, параметр там был точно cardinal....

Код не мой конечно, просто скачал с инета, но он работает.
Хотя и показывает немного не то, что я ожидал (как будто отрезана часть данных).

Если у кого есть рабочий пример, буду признателен.
...
Рейтинг: 0 / 0
12.02.2018, 15:06
    #39600640
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cardinal to binary
ДдэккиКод не мой конечно, просто скачал с инета, но он работает.

без комментариев....

Кстати, интересно, в каком порядке байты возвращает Windows через FileRead ?

сначала старшие, потом младшие ?
наоборот ?
Или какими-то кусками, типа сначала младшие 4 байта от старшего к младшему, потом следующие 4 байта?



Ддэкки, открой для себя указатели.
Выставляешь указатель на нужное тебе место буфера.
Читаешь из порта один байт.
Кладешь этот байт по указателю.
Ставишь указатель на следующее место, и т.д.

ДдэккиОткинуть из 40 разрядов 8 правых и 7 левых

и вот тут и начинается веселье, что такое "8 правых" - это тот байт, который ПЕРВЫМ придет в порт ,или который ПОСЛЕДНИМ ?
можешь отдать этот выбор Windows, с вероятностью 50% угадаешь
...
Рейтинг: 0 / 0
12.02.2018, 15:43
    #39600678
Ддекки
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cardinal to binary
В теории я понимаю как это должно быть, но не думаю, что смогу реализовать.

Затыкаюсь на том, как послать запрос на получение ответа.
Если послать надо x40, то шлю 'A' вроде, и т.д.
В это случае получаю всегда один байт. И тут все работает гладко.

Но мне надо послать x41 и получить пять байт.
Тут и начинается свистопляска.
Есть куча исходников, но не получается послать этот один байт. Строой 'А' правда не пробовал.
Ну нет ответа и все...

Спасибо.
...
Рейтинг: 0 / 0
12.02.2018, 15:45
    #39600681
Vizit0r
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cardinal to binary
может стоит почитать другие примеры, вместо того, чтобы тыкаться в стену без всякого толку?
...
Рейтинг: 0 / 0
12.02.2018, 15:58
    #39600690
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cardinal to binary
Ддекки,

ты как принимаешь данные от последовательного порта ?
...
Рейтинг: 0 / 0
12.02.2018, 16:23
    #39600703
SLab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cardinal to binary
defecatorДдекки,

ты как принимаешь данные от последовательного порта ?
Похоже как фишка ляжет, и посылает также.
...
Рейтинг: 0 / 0
12.02.2018, 17:27
    #39600733
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cardinal to binary
Ддэкки,

авторНу вот не понял как мне указать в каком из байтов я хочу что-то делать.
Например, переключить бит 2 о втором байте, или проверить состояние 5 бита в 3 байте.


Смотри самое начало. Что такое байты, их последовательность, как они нумеруются (старший/младший), как раскладываются на биты, и так далее.
По битам смотри битовые операции, их не так много, и суть, в целом, думаю, будет понятна. Есть таблица соответствий (таблица истинности) для каждой операции.
Проще всего (хотя не обязательно именно так): переключать биты XOR'ом, проверять состояние AND'ом, устанавливать (присваивать биту единицу) OR'ом, сбрасывать (присваивать 0) AND'ом. Первый операнд - данные. Второй операнд - маска. В маске устанавливаешь (то есть присваиваешь им единицу) те биты, которые тебе нужно обработать. Остальные оставляешь как есть. Если маска 'чистая', в ней будут сброшены (то есть равны 0) все биты.
Остальное - смотри по таблицам. Там всё довольно просто.

Еще. Пользуясь кодом из интернета, важно иметь в виду то, что написано в статье:

http://www.gunsmoker.ru/2010/05/90.html
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Cardinal to binary / 25 сообщений из 25, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]