Портал для радиолюбителей и разработчиков электроники · с 2003 годаРеклама на сайте
Найти компонент, схему или даташит

Даташиты, справочник отечественных приборов, схемы с разбором и живой форум

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

 
Опции темы

В Delphi принять байт по COM

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

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

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

Угу
http://www.remexpert.com/forum/topic1251-20.html
urry вне форума  
Непрочитано 18.03.2008, 23:51  
Muzicant
Прописка
 
Регистрация: 21.06.2003
Сообщений: 114
Сказал спасибо: 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.RUN
 
Регистрация: 05.10.2006
Сообщений: 625
Сказал спасибо: 21
Сказали Спасибо 137 раз(а) в 90 сообщении(ях)
LEAS на пути к лучшему
По умолчанию

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

Прикрепленный файл: 4523071.zip
__________________
Быть,а не казаться.
LEAS вне форума  
Непрочитано 19.03.2008, 22:42  
LEAS
Гражданин KAZUS.RUN
 
Регистрация: 05.10.2006
Сообщений: 625
Сказал спасибо: 21
Сказали Спасибо 137 раз(а) в 90 сообщении(ях)
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, время: 05:48.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.