Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 18.03.2008, 16:52  
Muzicant
Прописка
 
Регистрация: 21.06.2003
Сообщений: 118
Сказал спасибо: 0
Сказали Спасибо 19 раз(а) в 19 сообщении(ях)
Muzicant на пути к лучшему
По умолчанию В Delphi принять байт по COM

Подскажите пожалуйста, как в Delphi можно принять байт от микроконтроллера по COM-порту? Нашел в нете похожее решение, но условие приема - какой либо байт. Только после него отрабатывает прием. А зачастую нужно принять один или несколько байт со значениями от 0 до 255 с условием завершения посылки по таймауту. Подскажитие пожалуйста как в этом случае настроить API-функцию, или ,если можете, выложите кусочек кода. Спасибо!
Реклама:
Muzicant вне форума  
Непрочитано 18.03.2008, 17:55  
urry
Почётный гражданин KAZUS.RU
 
Аватар для urry
 
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
urry на пути к лучшему
По умолчанию

Делфи - не делфи, какая разница.. Когда стартуешь прием, какие - то прерывания в компе отключаются, чтобы можно было принять нормально байт. Если Вы запустите таймер, то на время приема байт он остановится. Если не будет входной инфы, то выходить в таком случае можно будет из проги только комбинацией из 3 пальцев. Чтобы этого не было, Вы должны ограничить время приема каким - то значением, так ?
Код:
COMMTIMEOUTS rCommTimeouts;
rCommTimeouts.ReadTotalTimeoutConstant =4000; // 4000 миллисекунд
rCommTimeouts.ReadTotalTimeoutMultiplier = 1;
port.SetTimeouts(rCommTimeouts);
 if( port.Read(rBuf,2)!=2) // количество принятых байт (2) за время Timeout
//не соответствует ожидаемому 
 {
	port.Close();
	MessageBox("Контроллер не подключен !","Ответ отсутствует или искажен!",MB_OK)
Ну, это си, правда..
urry вне форума  
Непрочитано 18.03.2008, 18:38  
Muzicant
Прописка
 
Регистрация: 21.06.2003
Сообщений: 118
Сказал спасибо: 0
Сказали Спасибо 19 раз(а) в 19 сообщении(ях)
Muzicant на пути к лучшему
По умолчанию

Ну хотя бы на СИ, а где настройки порта, т.с. инициализация - port.Open()? И что этот фрагмент под XP работает?
Muzicant вне форума  
Непрочитано 18.03.2008, 19:03  
urry
Почётный гражданин KAZUS.RU
 
Аватар для urry
 
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
urry на пути к лучшему
По умолчанию

Угу
http://www.remexpert.com/forum/topic1251-20.html
urry вне форума  
Непрочитано 18.03.2008, 23:51  
Muzicant
Прописка
 
Регистрация: 21.06.2003
Сообщений: 118
Сказал спасибо: 0
Сказали Спасибо 19 раз(а) в 19 сообщении(ях)
Muzicant на пути к лучшему
По умолчанию

Все в принципе похоже как я нашел. Не могу найти изюминку (это нашел в нете - работает, но принимает только с символом возврата коретки):


procedure PortInit;
var
ThreadID:dword;
begin
//создание и иницализация порта
KolByte:=0;

//создание порта и получение его хэндла
CommHandle := CreateFile('COM1',GENERIC_READ or GENERIC_WRITE,0,nil,OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL or FILE_FLAG_OVERLAPPED,0);

//ставим маску - "по пришествии определенного символа"
//SetCommMask(CommHandle,EV_RXFLAG);
SetCommMask(CommHandle,EV_RING + EV_RXCHAR + EV_RXFLAG + EV_TXEMPTY);
//построение DCB
GetCommState(CommHandle,DCB);
DCB.BaudRate:=CBR_9600;
DCB.Parity:=NOPARITY;
DCB.ByteSize:=8;
DCB.StopBits:=OneStopBit;
DCB.EvtChar:=chr(13);//задание символа для флага
//устанавливаем DCB
SetCommState(CommHandle,DCB);
//создаем паралельный поток
//там будет вертеться процедура приема строки
//с порта - ReadComm
CommThread := CreateThread(nil,0,@ReadComm,nil,0,ThreadID);
end;
end.
---------------------------------
procedure ReadComm;
var
Resive:array [0..255] of char;
bool:boolean;
begin

bool:=true;

while true do
begin

TransMask:=0;
WaitCommEvent(CommHandle,TransMask,@Ovr); //ждем
if (TransMask and EV_RXFLAG)=EV_RXFLAG then //проверяем нужное событие
begin

ClearCommError(CommHandle,Errs,@Stat);//сбрасываем флаг
Kols := Stat.cbInQue;
ReadFile(CommHandle,Resive,Kols,Kols,@Ovr);//читаем
//тут должна идти обработка принятой информации из Resive
Form1.Panel1.Caption:=string(Resive);
//не очень хороший вариант вывода, но для примера подойдет
end;//mask
end;//while
end;
---------------------------------
Muzicant вне форума  
Непрочитано 19.03.2008, 08:49  
stri
Прописка
 
Аватар для stri
 
Регистрация: 11.07.2006
Адрес: Ru, Nsk
Сообщений: 249
Сказал спасибо: 1
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
stri на пути к лучшему
По умолчанию

я пользую готовую компоненту для дэльфей... http://sourceforge.net/projects/tpapro
stri вне форума  
Непрочитано 19.03.2008, 11:41  
ant_
Прописка
 
Регистрация: 21.09.2006
Сообщений: 195
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
ant_ на пути к лучшему
По умолчанию

я использую Async32- простая и очень эффективная весчь.
Просто установите его как компонент - на вкладке появится компонент TComm. Дальше разберетесь

Прикрепленный файл: 960130.zip
ant_ вне форума  
Непрочитано 19.03.2008, 21:19  
vadavad
Прохожий
 
Регистрация: 13.04.2007
Сообщений: 3
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
vadavad на пути к лучшему
По умолчанию Принять и отправить по COM в Delphi

Я одно время тоже мучался с этим, но потом подглядел кое у кого и вот что получилось. Привожу выдержку из своего модуля (если лишние переменные не убрал - спешил, при переваривании "фильтруйте"). Тут все предельно ясно. Надо открыть сначала порт, рекомендую потом прочитать перед использованием. Читать можно в любое время или когда ждете, можно также отправлять в любое время. В конце лучше закрывайте порт. Сталкивался с одной фишкой, юэсбишные ком-переходники не могут быть долго открытыми. С ними чего-то происходит и потом не туда не сюда и не закрывается. А писиай-платой и нормальными портами все работает четко.
При открытии ИК-порта, что-то надо изменить в ComOpen, что сейчас не вспомню. С контролером в режиме RXD-TXD ничего можно не изменять - использовать как есть (не для любителей оптимизировать.

Unit ForCom;
Interface
uses Windows, SysUtils, Forms;
var
TecSPD: DWORD = CBR_9600;
ComError: integer = 0;
mstp: byte = ONESTOPBIT;
mbprt: byte = NOPARITY;
k, b: single;

function ComOpen(Port: string): THandle;
procedure ComClose(var ComHndl: THandle);
procedure ComWrite(ComHndl: THandle; S: string);
function ComRead(ComHndl: THandle): string;
function ErrToStr(i: integer): string;

implementation

var
DataControl: TDCB;
DataWait: TCOMMTIMEOUTS;
st: string[250];
StBUF: array [0..250] of byte absolute st;
MS: array [0..250] of byte;


function ComOpen(Port: string): THandle;
label
ll5, ll6, ll21;
var
Resultf: THandle;
begin
ComError:=0;
Result:=0;
Resultf:=CreateFile(PChar(Port+#0),GENERIC_READ+GE NERIC_WRITE,0,NIL,OPEN_EXISTING,0,0);
if Resultf=INVALID_HANDLE_VALUE then goto ll5;
if GetFileType(Resultf)‹›FILE_TYPE_CHAR then goto ll21;
if not SetupComm(Resultf,$100,$100) then goto ll6;
DataControl.DCBlength:=SizeOf(DataControl);
DataControl.BaudRate:=TecSPD;
DataControl.ByteSize:=5;
DataControl.Parity:=mbprt; //NOPARITY
DataControl.StopBits:=mstp; //ONESTOPBIT;
DataControl.wReserved:=0;
DataControl.XonLim:=0;
DataControl.XoffLim:=0;
DataControl.Flags:=1+16+4096;
DataControl.XonChar:=CHR($11);
DataControl.XoffChar:=CHR($13);
DataControl.ErrorChar:=CHR(0);
DataControl.EofChar:=CHR(0);
DataControl.EvtChar:=CHR(0);
if not SetCommState(Resultf,DataControl) then goto ll6;
DataControl.ByteSize:=8;
if not SetCommState(Resultf,DataControl) then goto ll6;
DataWait.ReadIntervalTimeout:=4294967295;
DataWait.ReadTotalTimeoutMultiplier:=0;
DataWait.ReadTotalTimeoutConstant:=0;
DataWait.WriteTotalTimeoutMultiplier:=1;
DataWait.WriteTotalTimeoutConstant:=0;
if not SetCommTimeouts(Resultf,DataWait) then goto ll6;
if not EscapeCommFunction(Resultf,SETRTS) then goto ll6;
if not EscapeCommFunction(Resultf,SETDTR) then goto ll6;
if not EscapeCommFunction(Resultf,CLRBREAK) then goto ll6;
PurgeComm(Resultf,PURGE_RXCLEAR);
Result:=Resultf;
exit;

ll5:
ComError:=5; {Нельзя открыть COM-порт}
exit;

ll6:
CloseHandle(Resultf);
ComError:=6; {Ошибка установок COM-порта}
exit;

ll21:
CloseHandle(Resultf);
ComError:=21; {Открытый файл не является СОМ-портом}
exit;
end;

procedure ComClose(var ComHndl: THandle);
begin
if ComHndl‹›0 then CloseHandle(ComHndl);
ComHndl:=0;
end;

function ErrToStr(i: integer): string;
begin
case i of
0: ErrToStr:='Порт успешно настроен!';
5: ErrToStr:='Нельзя открыть COM-порт';
6: ErrToStr:='Ошибка установок COM-порта';
7: ErrToStr:='Неправильный ответ';
9: ErrToStr:='Нет ответа';
10: ErrToStr:='Неизвестный прибор';
15: ErrToStr:='Ошибочная длина строки';
16: ErrToStr:='Невозможно записать в COM-порт';
17: ErrToStr:='Досрочное завершение операции'; // DwrdStop‹›0
18: ErrToStr:='Невозможно считать из COM-порта';
21: ErrToStr:='COM-порт не существует';
19: ErrToStr:='Не вce записали в COM-порт';
else ErrToStr:='Неизвестная ошибка '+IntToStr(i);
end;
end;

procedure ComWrite(ComHndl: THandle; S: string);
var
W: DWORD;
Le: DWORD;
begin
ComError:=0;
st:=S;
Le:=length(st);
Application.ProcessMessages;
if Le‹1 then exit;
if not WriteFile(ComHndl, StBUF[1], Le, W, NIL) then ComError:=16;
if W=0 then ComError:=16;
if W‹›Le then ComError:=19;
end;

function ComRead(ComHndl: THandle): string;
var
i, W: DWORD;
st: string;
begin
ComError:=0;
st:='';
Application.ProcessMessages;
if ReadFile(ComHndl, MS, 240, W, NIL) then
if w›=1 then
for i:=0 to W-1 do
st:=st+Chr(MS[i])
else
ComError:=9 {Нет ответа}
else
ComError:=18;
Result:=st;
end;

end.
vadavad вне форума  
Непрочитано 19.03.2008, 22:30  
LEAS
Гражданин KAZUS.RU
 
Регистрация: 05.10.2006
Сообщений: 628
Сказал спасибо: 21
Сказали Спасибо 165 раз(а) в 92 сообщении(ях)
LEAS на пути к лучшему
По умолчанию

Все, что наработано тупым мозгом(не путать с нажитым непосильным трудом) и в Delphi, с исходником мутным. Версия 7, но 6-й тоже жует. Free совсем...

Прикрепленный файл: 4523071.zip
__________________
Быть,а не казаться.
LEAS вне форума  
Непрочитано 19.03.2008, 22:42  
LEAS
Гражданин KAZUS.RU
 
Регистрация: 05.10.2006
Сообщений: 628
Сказал спасибо: 21
Сказали Спасибо 165 раз(а) в 92 сообщении(ях)
LEAS на пути к лучшему
По умолчанию

Извинения,(Экскьюз me). Чтото-сегодня, как и мое творчество все через...

Прикрепленный файл: 387321.rar
__________________
Быть,а не казаться.
LEAS вне форума  
 

Закладки
Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как из VMLab`а послать байт в com-порт? FxMODE Микроконтроллеры, АЦП, память и т.д 4 12.02.2009 14:58
Помогите принять строку по usart от АТ модема kasper37 Микроконтроллеры, АЦП, память и т.д 10 03.01.2009 16:21
delphi sport7 Микроконтроллеры, АЦП, память и т.д 6 27.12.2005 00:14
COMпорт+Delphi URY Микроконтроллеры, АЦП, память и т.д 7 12.12.2005 08:38
Как в IAR выделить из ИНТ младший старший байт? prottoss Proteus, KiCAD и другие ECAD 2 25.07.2005 22:57


Часовой пояс GMT +4, время: 04:36.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot