Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 24.03.2012, 17:41
Profmax Profmax вне форума
Прохожий
 
Регистрация: 24.03.2012
Сообщения: 4
Репутация: 10
По умолчанию Не принимает данные с Com-порта

Источник сигнала микроконтроллер , который каждые 500мс , посыалет 1 байт информации. На приеме комп , чтение данных в синхронном режиме , тоесть 1 поток . Проблема в том , что считать данные не могу , вроде и порт открывается и настройка проходит. но не читает данные. Листинг программы приложен.
Вложения
Тип файла: txt Otladka - копия.txt (2.9 Кбайт, 11 просмотров)
Ответить с цитированием
  #2  
Старый 24.03.2012, 20:55
Аватар для cotseec
cotseec cotseec вне форума
Активный
 
Регистрация: 16.07.2008
Сообщения: 353
Версия Delphi: D7,TDE06,RAD09
Репутация: 1443
По умолчанию

у вас
Цитата:
Код:
nToRead:=StrToInt(ByteForRead.Text); //считываем число байт для чтения
  ReadFile(Comport,RCBuf^,nToRead,nRead,nil);  //считываем данные
  ByteRead.Caption:=IntToStr(nRead);      //выводим на форму число прочитанных байт
  Buf.Caption:=RCBuf;
откуда в ByteForRead действительное значение количества байт в порту в данное время?
лучше определять количество "готовых к чтению" из порта байт так
Код:
var
  ComStat:TComStat; // состояние порта
  Errs:Dword; // значение ошибки

  RCBuf:PChar;        //Буфер данных для приема
  nToRead:Cardinal;   //Число байт для чтения
  nRead:Cardinal;     //Число прочитанных байт
begin
    ClearCommError(FHandlePort,Errs,@ComStat); // получаем состояние порта
    nToRead:=ComStat.cbInQue; // получаем число байт для чтения
    if nToRead>0 then
    begin     
      ReadFile(FHandlePort,RCBuf^[1],nToRead,nRead,nil);

      ByteRead.Caption:=IntToStr(nRead);      //выводим на форму число прочитанных байт
      Buf.Caption:=RCBuf;
    end;
end;
соответсвтенно, если ситема говорит, что в порту нуль байт, то это действительно так, значит у вас ошибки при подключении (не тот порт, не те настройки порта, в структуре CommTimeouts:TCommTimeouts; ошибка (для начала попробуйте не изменять таймауты), устройство ничего не посылает и т.д...)

Последний раз редактировалось cotseec, 24.03.2012 в 21:02.
Ответить с цитированием
  #3  
Старый 24.03.2012, 22:52
Profmax Profmax вне форума
Прохожий
 
Регистрация: 24.03.2012
Сообщения: 4
Репутация: 10
По умолчанию

Так не работает

Последний раз редактировалось Profmax, 24.03.2012 в 22:59.
Ответить с цитированием
  #4  
Старый 24.03.2012, 22:58
Profmax Profmax вне форума
Прохожий
 
Регистрация: 24.03.2012
Сообщения: 4
Репутация: 10
По умолчанию

Дело в том что, для корректной работы , мне нужн опринимать определенное кол-во байт , по крайней мере на данном этапе разработки, а в приведенном вами примере , при нажатии на кнопку (допустим) считываться будет весь буффер приема.
Изображения
Тип файла: jpg Работа.jpg (90.1 Кбайт, 7 просмотров)
Ответить с цитированием
  #5  
Старый 24.03.2012, 23:01
Аватар для cotseec
cotseec cotseec вне форума
Активный
 
Регистрация: 16.07.2008
Сообщения: 353
Версия Delphi: D7,TDE06,RAD09
Репутация: 1443
По умолчанию

для начала просто посмотрите, есть ли что-то в буфере приема, если есть, тогда и читайте необходимое вам количество байт (что станет с непрочитанными байтами в буфере после прихода новой порции данных - загадка), да.... и если вы работаете не в борландовской дельфи, а в рад студиях, то PChar у вас unicod, т.е. один символ занимает 2 байта, следовательно, если вы читаете в буфер (обратите внимание на чтение из буфера) в юникодную строку, а потом выводите, то может показать....ничего не показать

Последний раз редактировалось cotseec, 24.03.2012 в 23:32.
Ответить с цитированием
  #6  
Старый 24.03.2012, 23:12
Profmax Profmax вне форума
Прохожий
 
Регистрация: 24.03.2012
Сообщения: 4
Репутация: 10
По умолчанию

В том то и дело , что возвращает значение прочитанных байт равным нулю , тоесть в буффере ничего нет , данные не принимает , скорости одинаковые, таймауты выставленны на мгновенный прием. Делал по примеру , все работает в нем , хотя у меня все так же. Если не сложно посмотрите в чем у меня ошибка.
Вложения
Тип файла: rar prog.rar (175.2 Кбайт, 4 просмотров)
Ответить с цитированием
  #7  
Старый 24.03.2012, 23:33
Аватар для cotseec
cotseec cotseec вне форума
Активный
 
Регистрация: 16.07.2008
Сообщения: 353
Версия Delphi: D7,TDE06,RAD09
Репутация: 1443
По умолчанию

посмотрел, кое-что изменил, проверил - принимает (только 6 байт, как указано), прикрепляю архив
ошибка в том, что перед тем как куда-то считывать, надо это распределить в памяти (если PChar, то StrAlloc(nToRead), потом StrDispose)
Вложения
Тип файла: zip prog_new.zip (246.4 Кбайт, 44 просмотров)

Последний раз редактировалось cotseec, 24.03.2012 в 23:41.
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо cotseec за это полезное сообщение:
Misha_White (17.09.2018), Profmax (24.03.2012)
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 20:35.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter