Сделал программу в Delphi которая работает, затем решил сделать в VC++2005 написал все то же самое (в плане приема и передачи и т.д.) неработает ничего неприходит на порт, собственно вопрос в том как заставить это работать в VC++?
Код Delphi:
TTx = packed record
ADDR: Word;
CMD: Byte;
param: Byte;
CRC: Word;
end;
TRx = packed record
ADDR: Word;
CMD: Byte;
nnnn: array[0..3] of BYTE;
CODE: Byte;
CRC: Word;
end;
MW: Pointer
procedure TComThread.Execute;
begin
hComm:= CreateFile('\\.\COM1',GENERIC_READ or GENERIC_WRITE,0,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
if hComm<>INVALID_HANDLE_VALUE then begin
GetcommState(hComm,ComDCB);
ComDCB.DCBlength:= sizeof(ComDCB);
ComDCB.BaudRate:= CBR_9600;
ComDCB.StopBits:= OneStopBit;
ComDCB.Parity:= 0;
ComDCB.ByteSize:= 8;
ComDCB.Flags:= ComDCB.Flags xor ComDCB.Flags;
ComDCB.Flags:= ComDCB.Flags or $00000001 or ($00000030 xor $00000020) or $00004000 or $00003000;
//RTS_CONTROL_TOGGLE
SetCommState(hComm,ComDCB);
GetCommTimeouts(hComm,ComTimeouts);
ComTimeouts.ReadIntervalTimeout:= 0;
ComTimeOuts.ReadTotalTimeoutMultiplier:= 0;
ComTimeOuts.ReadTotalTimeoutConstant:= 0;
ComTimeOuts.WriteTotalTimeoutMultiplier:= 0;
ComTimeouts.WriteTotalTimeoutConstant:= 0;
SetCommTimeouts(hComm,ComTimeouts);
while ComThread.Terminated <> true do begin
ClearCommError(hComm,errors,@stat);
SetCommMask(hComm,EV_TXEMPTY);
WriteFile(hComm,Tx,6,RWBytes,nil);
WaitCommEvent(hComm,mask,nil);
sleep(6);
ReadFile(hComm,Rx,10,RWBytes,nil);
CRC:= CalculateCRC16(@Rx,8);
Rx.nnnn[0]:= Rx.nnnn[0] xor Rx.nnnn[3];
Rx.nnnn[3]:= Rx.nnnn[0] xor Rx.nnnn[3];
Rx.nnnn[1]:= Rx.nnnn[1] xor Rx.nnnn[2];
Rx.nnnn[2]:= Rx.nnnn[1] xor Rx.nnnn[2];
MW:= @Rx.nnnn[0];
PurgeComm(hComm,PURGE_RXCLEAR or PURGE_TXCLEAR);
Synchronize(ShowMW);
sleep(50);
end;
CloseHandle(hComm);
end
else begin
CloseHandle(hComm);
ComThread.Terminate;
end;
Код VC++:
struct TTx {
WORD addr;
BYTE cmd;
BYTE param;
WORD crc;
} Tx;
struct TRx {
WORD addr;
BYTE cmd;
float nnnn;
BYTE code;
WORD crc;
} Rx;
VOID ThreadProc(void *lp)
{
char d[20];
TCHAR dd[20];
DWORD rxtx = 0, mask, errors,k;
HANDLE hComm;
DCB dcb;
COMMTIMEOUTS timeouts;
float mw;
COMSTAT stat;
LoadString(hInst,szCom,dd,MAX_LOADSTRING);
hComm = CreateFile(dd,GENERIC_WRITE | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
if (hComm!=INVALID_HANDLE_VALUE)
{
GetCommState(hComm,&dcb);
dcb.DCBlength = sizeof(dcb);
dcb.BaudRate = CBR_9600;
dcb.StopBits = ONESTOPBIT;
dcb.Parity = 0;
dcb.ByteSize = 8;
dcb.fBinary = 1;
dcb.fParity = NOPARITY;
dcb.fDsrSensitivity = 1;
dcb.fOutxCtsFlow = 0;
dcb.fOutxDsrFlow = 0;
dcb.fTXContinueOnXoff =0;
dcb.fOutX = 0;
dcb.fInX = 0;
dcb.fErrorChar = 0;
dcb.fNull = 0;
dcb.fRtsControl = RTS_CONTROL_TOGGLE;
dcb.XoffLim = 512;
dcb.XonChar = 0;
dcb.XoffChar = 0;
dcb.XonLim = 2048;
//RTS_CONTROL_TOGGLE
if SetCommState(hComm,&dcb);
GetCommTimeouts(hComm,&timeouts);
timeouts.ReadIntervalTimeout = 0;
timeouts.ReadTotalTimeoutMultiplier = 0;
timeouts.ReadTotalTimeoutConstant = 0;
timeouts.WriteTotalTimeoutMultiplier = 0;
timeouts.WriteTotalTimeoutConstant = 0;
SetCommTimeouts(hComm,&timeouts);
Tx.addr = 1190;
Tx.cmd = 0x40;
Tx.crc = 44370;
Tx.param = 0;
do
{
Sleep(1000);
ClearCommError(hComm,&errors,&stat);
SetCommMask(hComm,EV_TXEMPTY);
WriteFile(hComm,&Tx,6,&rxtx,NULL);
WaitCommEvent(hComm,&mask,NULL);
Sleep(6);
ReadFile(hComm,&Rxx,10,&rxtx,NULL);
mw = float(Rx.nnnn);
if (mw!=0) _gcvt_s(d, 20, mw, 7);
else {
d[0] = '0';
d[1] = '\0';
}
OemToChar((LPCSTR) &d,(LPTSTR) &dd);
SendMessage(hWndStatic,WM_SETTEXT,0,(LPARAM) &dd);
PurgeComm(hComm,PURGE_RXCLEAR | PURGE_TXCLEAR);
} while (!stop);
}
CloseHandle(hComm);
_endthread();
}