Модераторы: PILOT, ManiaK, Mazzi
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Arduino UART, delphi com порт 
:(
    Опции темы
alcogol
Дата 20.10.2010, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 11.3.2008

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



Добрый день друзья, помогите пожалуйста новичку. Пытаюсь сконнектиться со своей ардуиной. Она шлёт данные мне в виртуальный COM порт, причем порой очень быстро, несколько отправок безо всяких пауз. Ардуиновскмй монитор(из проги, который вызывается) нормально реагирует, все передачи приходят отдельными строчками, все цело, хорошо и красиво.

Я в делфях написал прогу и уже 2 дня не могу победить прием данных. Он идет, но не так как надо. Так как я новичек и ещё не работал с СОМ портами, я поискал в инете примеры, скажем так, ничего на сто процентов рабочего не нашел, перечитал кучу статей и то же самое. С инициализацией порта проблем нет, чтение идет в отдельном потоке, так вот, сначала в exexcete потока у меня был такой код:

Код

ReadFile(CommHandle, BinBuf, sizeof(BinBuf),
              dwRead, Nil);
b := BinBuf;
if (length(b)>3) then// 
  begin
  Synchronize(addData);
  end;
end;



Он работает, но как-то не так. Устройство посылает одну команду в порт, а в программе ReadFile не останавливаясь читает его. То есть не один раз, а как бы зацикливается, пока не прийдет следующая команда и с ней то же самое. То есть чтение не останавливается.


Попробовал асинхронное чтение по событиям, все работает, события тоже, но при чтении строки(устройство каждые 5 секунд отправляет 1234ABCD). Процентов 90 принимается нормально, остальные 10 что-то вроде того 12ABCD или ABCD или 34ABCD. Не понимаю, почему так :( Ребят, не забывайте что я ещё не такой опытный, подскажите что не так. Может у кого-либо есть рабочий пример.

вот код второй моей попытки:

Код

FillChar(ReadOL, SizeOf(ReadOL), 0);
ReadOL.hEvent:= CreateEvent(nil, True, True, nil);

SetCommMask(CommHandle, EV_RXCHAR);


WaitCommEvent(CommHandle, Mask, @ReadOL);

Signaled:= WaitForSingleObject(ReadOL.hEvent, INFINITE);
if (Signaled  = WAIT_OBJECT_0) then
  begin
  if GetOverlappedResult(CommHandle, ReadOL, BytesTrans, False) then
    begin

    if (Mask and EV_RXCHAR) <> 0 then
      begin
      
      ClearCommError(CommHandle, ErrCode, @CurrentState);

      AvaibleBytes:= CurrentState.cbInQue;

      bReadable:= AvaibleBytes > 0;

      if bReadable then
        begin
        ReadFile(CommHandle, MyBuff, SizeOf(MyBuff), RealRead, @ReadOL);
        mm := string(MyBuff);

        Synchronize(addData);

        end;
      end;
    end;
  end;
end;



Это сообщение отредактировал(а) alcogol - 20.10.2010, 21:10
PM MAIL   Вверх
xvr
Дата 21.10.2010, 09:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 8
Всего: 223



  •  Настройте размеры буферов и таймауты COM порта (это то, что делается после CreateFile, но до ReadFile)
  •  Принимаемые байты НЕ БУДУТ формировать строку - у них нет завершающего 0 в конце. Т.ч. конструкция b := BinBuf; и mm := string(MyBuff); неправильны, строку надо формировать dwRead/RealRead байтов длинной
  •  ReadFile читает байты по мере поступления, при этом количество этих байтов определяется не тем, как их отправляло устройство, а тем, сколько их накопилось в приемном буфере (и таймаутами). RS232 очень медленное устройство (даже виртуальный через USB) по компьютерным меркам. Так что ваш 1234ABCD вообще может придти побайтово. (Или настройте таймаут секунды на 3)

PM MAIL   Вверх
alcogol
Дата 21.10.2010, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 11.3.2008

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



xvr, спасибо за ответ.

Цитата

Настройте размеры буферов и таймауты COM порта (это то, что делается после CreateFile, но до ReadFile)


С таймаутами порта попробую поиграть, а вот про буффер немного не понял

Цитата

конструкция b := BinBuf; и mm := string(MyBuff); неправильны, строку надо формировать dwRead/RealRead байтов длинной


это вроде тоже понятно

Цитата

ReadFile читает байты по мере поступления, при этом количество этих байтов определяется не тем, как их отправляло устройство, а тем, сколько их накопилось в приемном буфере (и таймаутами). RS232 очень медленное устройство (даже виртуальный через USB) по компьютерным меркам. Так что ваш 1234ABCD вообще может придти побайтово. (Или настройте таймаут секунды на 3)


3 секунды для моих задач это очень много :(


Странно, а ардуиновский монитор работает превосходно и ничего не теряет
PM MAIL   Вверх
UniBomb
Дата 21.10.2010, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



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

Репутация: 9
Всего: 97



Цитата(alcogol @  21.10.2010,  11:57 Найти цитируемый пост)
буффер немного не понял

Размеры входного и выходного буффера задаются функцией SetupComm. Так же было бы неплохо очищать буферы (входной после чтения и выходной перед записью) функцией PurgeComm.


--------------------
PM MAIL ICQ Skype   Вверх
xvr
Дата 21.10.2010, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 8
Всего: 223



Цитата(UniBomb @  21.10.2010,  13:44 Найти цитируемый пост)
Так же было бы неплохо очищать буферы (входной после чтения и выходной перед записью) функцией PurgeComm. 
А вот этого лучше не делать - данные в буферах просто так не появляются, они приходят от устройства. При очистке они будут потерянны.
Очищать буфера нужно только при полной инициализации/переинициализации устройства, когда нужно именно выкинуть все данные, пришедшие до сих пор


PM MAIL   Вверх
alcogol
Дата 21.10.2010, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 11.3.2008

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



UniBomb


xvr

спасибо

Увеличил таймауты до 100, буферы не трогал, все заработало, правда несколько передач сливаются в одну. На стороне устройства добавил добавку символов #13 и #10, считанный буфер передаю функции, которая "расцепляет" сообщения ориентируясь на эти "разделители". Вроде все работает, пока тестирую.

Нужна на сто процентов стабильная передача, потеря одного из сообщений - весь проект под угрозой, несмотря на то, что аппаратная часть, над которой и бился большую часть времени работает идеально.
PM MAIL   Вверх
UniBomb
Дата 21.10.2010, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



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

Репутация: 9
Всего: 97



xvr, вот тут я не соглашусь. Если не очищать буфферы, то есть возможность принять или передать какой-либо мусор. 

Это сообщение отредактировал(а) UniBomb - 21.10.2010, 22:47


--------------------
PM MAIL ICQ Skype   Вверх
xvr
Дата 21.10.2010, 23:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 8
Всего: 223



Цитата(UniBomb @ 21.10.2010,  22:47)
xvr, вот тут я не соглашусь. Если не очищать буфферы, то есть возможность принять или передать какой-либо мусор.

А если не очищать, то есть не только возможность, но и неизбежность потерять данные  smile 
А вообще вопрос чистить или не чистить всецело зависит от протокола обмена. Если железка по своей инициативе в РС ничего не посылает, и если РС использует чистый протокол запрос-ответ (без возможности наложения запросов на предыдущие ответы), то лучше чистить. Если же что то из перечисленного используется - то чистить нельзя ни в коем случае

PM MAIL   Вверх
UniBomb
Дата 22.10.2010, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



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

Репутация: 9
Всего: 97



Цитата(xvr @  22.10.2010,  00:53 Найти цитируемый пост)
А вообще вопрос чистить или не чистить всецело зависит от протокола обмена.

Это да. Я сначала не заметил фразы ТС о том, что железяка сама шлёт данные. Но и всё равно перед отправкой данных почистить буффер не будет лишним  smile 


Как бы то нибыло, а тема больше подходит для этого раздела (там уже даже кто-то зеркало сделал этой темы), т.к. вопроса по тематике этого раздела нет. Чистое делфи и винапи. Может стоит перенести?


--------------------
PM MAIL ICQ Skype   Вверх
xvr
Дата 22.10.2010, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 8
Всего: 223



Цитата(UniBomb @  22.10.2010,  09:38 Найти цитируемый пост)
Чистое делфи и винапи.
Пока дело не касается протокола обмена (а оно уже коснулось) - то да.

Цитата(UniBomb @  22.10.2010,  09:38 Найти цитируемый пост)
Может стоит перенести? 
Уже нет  smile 


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


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 11.3.2008

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



я просто сам сомневался куда засунуть темку smile

думал здесь правильнее
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Микроконтроллеры (MCU) и микропроцессоры (MPU)"
PILOT ManiaK
UniBomb Mazzi

На данный раздел помимо Правил форума распространяются текже следующие правила:


  • Прежде чем создать тему воспользуйтесь поиском или посмотрите в faq. Возможно на форуме уже есть ответ на ваш или близкий к вашему вопрос.
  • В заголовке темы в квадратных скобках обозначьте используемое семейство микроконтроллера: [avr],[pic],[arm].
  • При создании темы с вопросом указывайте участок кода с ошибкой, версию компилятора, схемы подключения, fuse биты и прочие данные, которые помогут найти правильный ответ. Для форматирования текста программ используйте кнопку код.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Для флуда, просьб выполнить задание, поиска партнёров или исполнителей существуют свои разделы.
  • Если вы заметили несовместимое с правилами сообщение, то можете уведомить об этом модератора раздела нажав кнопку Репорт у соответствующего сообщения.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, PILOT, ManiaK, UniBomb, Mazzi.

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


 




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


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

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