Comport
От: balepa Казахстан  
Дата: 31.07.07 03:50
Оценка:
Сделал программу в 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();
}
Balepa
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.