Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Com Port и буфер 
V
    Опции темы
кмс
Дата 6.8.2014, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 12.2.2009
Где: Казахстан

Репутация: 1
Всего: 2



Здравствуйте.
Столкнулся с непонятным явлением smile
Использую для работы с ком портом готовый компонент.
Имеется такой код:

Код

...
var
ByteArray: array of Byte;
begin
..............

SetLength(ByteArray, 16);
ComPort1.Read(ByteArray, 15);

if (ByteArray[1] = 0) and (ByteArray[2] = 0) and (ByteArray[3] = 0) then
begin
  Result := false;
  Exit;
end;

...............

Выдает ошибку Access violation. Протрассировал в отладчике, после задания размера массива, массив как и положено имеет заданный размер.
Но дальше интересное, доходит до чтения с ком порта, даже не пытается читать, сразу без задержки пролетает и тут сразу массив становится как бы не с нулевым размером или как правильно назвать не знаю. Ну вообщем как будто я ему не задавал размер через SetLength.
Ну и сообсно при проверки массива вылетает ошибка.

Если массив обьявляю как 
Код

ByteArray: array[0..15] of Byte;

то все норм.
В чем может быть проблема?

PS: Delphi XE

PM MAIL   Вверх
Romikgy
Дата 6.8.2014, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 4
Всего: 146



в том что данных для чтения нет в ComPort1, и метод Read отдает пустой массив .... а обращаться к пустому месту нельзя!


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
кмс
Дата 6.8.2014, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 12.2.2009
Где: Казахстан

Репутация: 1
Всего: 2



Цитата(Romikgy @  6.8.2014,  17:56 Найти цитируемый пост)
в том что данных для чтения нет в ComPort1

Тут как раз наоборот, если данных для чтения нету, то и ошибки нету и Comport1.Read честно пытается прочитать данные.
А вот если данные есть то тут и выскакивает ошибка.

Вообщем динамический массив мне не особо нужен был, так как его размер всегда одинаков, решил использовать его только для того что бы он перед чтением из порта всегда нулями был забитый.
Сделал его статистическим и просто в цикле заполняю его нулями.
Просто интересно стало, в чем такая проблема. Но скорее всего компонент для работы с портом просто не может работать с динамическим массивом. Хотя почему не знаю.
 
PM MAIL   Вверх
northener
Дата 6.8.2014, 18:45 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 12
Всего: 20



Вместо
Цитата(кмс @  6.8.2014,  17:36 Найти цитируемый пост)
ComPort1.Read(ByteArray, 15);

надо 
Код

ComPort1.Read(ByteArray[0], 15);

Иначе принятые байты записываются совсем не туда, куда нужно.


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
кмс
Дата 6.8.2014, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 12.2.2009
Где: Казахстан

Репутация: 1
Всего: 2



northener, так работает smile
А у меня все работало и как ComPort1.Read(ByteArray, 15); 
Ну кроме этого случая smile
Спасибо, сейчас везде переделаю smile

PM MAIL   Вверх
northener
Дата 6.8.2014, 19:22 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 12
Всего: 20



Цитата(кмс @  6.8.2014,  18:59 Найти цитируемый пост)
А у меня все работало и как ComPort1.Read(ByteArray, 15); 

Со статическим массивом да. В случае статического массива функция Read(ByteArray, 15) получает первым параметром именно адрес первого байта самого массива. В случае же динамического массива функция Read(ByteArray, 15) получает первым параметром адрес переменной, которая хранит адрес первого байтп массива.



--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
кмс
Дата 7.8.2014, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 12.2.2009
Где: Казахстан

Репутация: 1
Всего: 2



Ясно, спасибо. Как оказалось мне и исправлять нечего, это было единственное место с Comport.Read остальное читалось как Comport.ReadStr

PM MAIL   Вверх
kami
Дата 7.8.2014, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 22
Всего: 72



Цитата(кмс @  7.8.2014,  10:03 Найти цитируемый пост)
остальное читалось как Comport.ReadStr

Непрааально ты, Дядя Федор, бутерброд ешь smile (с)

Не стоит бы использовать ReadStr, особенно в D2009 Up. Потому что (скорее всего - не знаю, что за компонент используется) этот метод вернет данные в AnsiString, а в своем коде идет работа со string. Всего-навсего одно неявное преобразование, а получаем отличное искажение принятых данных.
PM MAIL WWW   Вверх
кмс
Дата 7.8.2014, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 12.2.2009
Где: Казахстан

Репутация: 1
Всего: 2



Я давно работу с портом писал, уже и забыл что там точно, но проблем не было, а данных там много гоняется туда-сюда.
Но думаю сейчас самое время пересмотреть что я там понаписал и если нужно исправить smile
А делал работу со строками именно по тому что мне нужно строковые данные из порта, показалось что проще сразу строки читать чем байты а потом преобразовывать в строки smile

PM MAIL   Вверх
northener
Дата 8.8.2014, 01:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 12
Всего: 20



Цитата(kami @  7.8.2014,  11:25 Найти цитируемый пост)
Не стоит бы использовать ReadStr, особенно в D2009 Up.

ReadStr в любом случае не стоит использовать. Хоть в Д2009-Плюс, хоть в Д7-Минус.
Имхо, неправильно работать с СОМ-портом в синхронном режиме, а процедуры такого типа как правило в этом режиме и работают.
При том что и микросхема СОМ-порта (нынче зашитая в материнку) и его драйвер имеют все возможности для асинронного режима.

Цитата(кмс @  7.8.2014,  14:48 Найти цитируемый пост)
А делал работу со строками именно по тому что мне нужно строковые данные из порта,

Нужны строковые данные - мспользуй в качесиве буфера строку.



--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0969 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.