Вниз
Скачать: CL | DM;

Срочно нужна помощь, трабла с COM портом...   Найти похожие ветки 

 
ComPort   (2005-04-15 22:26) [0]

Есть устройство, оно общается с одной программой черег COM порт.
никак не получается добиться от этой чертовой железяки ответа....
вот что родная прога "пишет" в порт(смотрел портмониторм):

IRP_MJ_CREATE                   Serial0 SUCCESS Options: Open
IOCTL_SERIAL_SET_TIMEOUTS       Serial0 SUCCESS RI:1 RM:0 RC:20 WM:0 WC:20
IOCTL_SERIAL_SET_QUEUE_SIZE     Serial0 SUCCESS InSize: 32 OutSize: 32
IOCTL_SERIAL_SET_BAUD_RATE      Serial0 SUCCESS Rate: 10417
IOCTL_SERIAL_SET_LINE_CONTROL   Serial0 SUCCESS StopBits: 1 Parity: SPACE WordLength:8
IOCTL_SERIAL_SET_CHAR           Serial0 SUCCESS EOF:0 ERR:0 BRK:0 EVT:0 XON:11 XOFF:1
IOCTL_SERIAL_SET_HANDFLOW       Serial0 SUCCESS Shake:1 Replace:c0 XonLimit:600
XoffLimit:150
IOCTL_SERIAL_SET_WAIT_MASK      Serial0 SUCCESS Mask: TXEMPTY
IOCTL_SERIAL_PURGE              Serial0 SUCCESS Purge: TXCLEAR RXCLEAR

я делаю так (взято из местного примера):

 //создание и иницализация порта
 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);

 //построение DCB
  GetCommState(CommHandle,DCB);
  DCB.BaudRate:=CBR_10417;
  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);

не знаю только как выставить все указаные выше параметры...
буду очень благодарен за помощь! :)


 
ComPort   (2005-04-16 06:47) [1]

:-(


 
GanibalLector ©   (2005-04-16 13:06) [2]

>Parity: SPACE
А ты пишешь : DCB.Parity:=NOPARITY;


 
ComPort   (2005-04-16 22:04) [3]

RI:1 RM:0 RC:20 WM:0 WC:20

а как это сделать?


 
GanibalLector ©   (2005-04-17 01:28) [4]


var
 TOut:TCommTimeouts;
begin
 if (TimeC=0) AND (TimeM=0) then
   TOut.ReadIntervalTimeout       := MAXDWORD
 else TOut.ReadIntervalTimeout    := 0;
 TOut.ReadTotalTimeoutMultiplier  := TimeM;
 TOut.ReadTotalTimeoutConstant    := TimeC;
 TOut.WriteTotalTimeoutMultiplier := 0;
 TOut.WriteTotalTimeoutConstant   := 0;
 Result:=SetCommTimeOuts(Handle, TOut);
end;

Надеюсь смысл понятен.Варьируй значениями.


 
ComPort   (2005-04-18 10:09) [5]

а не подскажешь как решить проблему с установкой нужной скорости?
нужно 10417? в набор CBR_ она не входит...


 
wal ©   (2005-04-18 16:16) [6]

Пиши прямо цифирью, без CBR_


 
wal ©   (2005-04-18 16:21) [7]

Тока сама железяка (СОМ-порт) всеравно на этой скорости работать не будет, а будет на 10472, но это мелочи, допускается +-5%


 
comport   (2005-04-18 21:34) [8]

wal
надеюсь что будет работать :)


 
ComPort   (2005-04-19 15:13) [9]

Сделал так:

TOut:TCommTimeouts;
dcb:_DCB;
cto:TCommTimeOuts;
begin
FHandle:= CreateFile(PChar("COM1"), GENERIC_READ or GENERIC_WRITE,
          0, nil, OPEN_EXISTING,
          FILE_ATTRIBUTE_NORMAL or FILE_FLAG_OVERLAPPED, 0);
GetCommState(FHandle, dcb);
dcb.BaudRate:=10417;
dcb.ByteSize:=8;
dcb.Parity:=SPACEPARITY;
dcb.StopBits:=OneStopBit;
dcb.XonLim:=600;
dcb.XoffLim:=150;
SetCommState(FHandle, dcb);
GetCommTimeouts(FHandle, cto);
cto.ReadIntervalTimeout:=1;
cto.ReadTotalTimeoutMultiplier:=0;
cto.ReadTotalTimeoutConstant:=20;
cto.WriteTotalTimeoutMultiplier:=0;
cto.WriteTotalTimeoutConstant:=20;
SetCommTimeOuts(FHandle, cto);
SetupComm(FHandle, 32,32);
PurgeComm(FHandle, PURGE_TXCLEAR);

Теперь трабла в том что не могу читать, вот так ничего не выходит:
var
 Received: DWORD;
begin
ReadFile(FHandle, Buffer, Size, Received, nil);

Help me...:)


 
wal ©   (2005-04-19 15:17) [10]

>FILE_ATTRIBUTE_NORMAL or FILE_FLAG_OVERLAPPED, 0);
Это к чему?


 
tesseract   (2005-04-20 09:56) [11]

>> FILE_ATTRIBUTE_NORMAL or FILE_FLAG_OVERLAPPED - не забудь что работать будет только в отложенном режиме

>> После Createfile
if (hCom=INVALID_HANDLE_VALUE) or (hcom=ERROR_ALREADY_EXISTS) then
begin
 fLog:=fLog+#13#10+" Порт не существует или занят";
 fLastError:=ErrInterfaceError;
 exit;
end;



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.48 MB
Время: 0.022 c
1-1116949818
Karlson
2005-05-24 19:50
2005.06.14
Как Hintу в Comboboxе присвоить текущее активное значение?


1-1117600097
ORMADA
2005-06-01 08:28
2005.06.14
Drag n Drop + Ctrl


1-1117486903
NQ34
2005-05-31 01:01
2005.06.14
Закрытие модальной формы


14-1117085786
yk
2005-05-26 09:36
2005.06.14
Хороший стиль программирования


14-1117146909
jcrush
2005-05-27 02:35
2005.06.14
У кого есть готовые решения по работе с RSS ?




   Наверх