Конференция "WinAPI" » Чтение и запись в Com порт [WinXP]
 
  • menart (11.01.09 20:53) [0]
    Здраствйте мастера, может не совсем сюда, тк текст на c++builder

    bool ReadRegister(int NetAdr,int TypeReg,int StartAdr,int Count)
    {
    if ((TypeReg!=3)&&(TypeReg!=4)||(Count>125)) {
     return false;
    }
    bRead=false;
    Byte d[8],r[255],b;
    DWORD wb;
    DWORD mask;
    try {
    d[0]=NetAdr;//Адрес
    d[1]=TypeReg;//Тип регистра
    String tmp=IntToHex(StartAdr,4);//Начальный регистр
    d[2]=StrToInt("0x"+tmp.SubString(1,2));
    d[3]=StrToInt("0x"+tmp.SubString(3,2));
    tmp=IntToHex(Count,4);//Количество регистров
    d[4]=StrToInt("0x"+tmp.SubString(1,2));
    d[5]=StrToInt("0x"+tmp.SubString(3,2));
    tmp=IntToHex(CRC16(d,6),4);//Контрольная сумма
    d[6]=StrToInt("0x"+tmp.SubString(3,2));
    d[7]=StrToInt("0x"+tmp.SubString(1,2));
    tmp="";
    SetCommMask(hPort,0x0040);
    PurgeComm(hPort,PURGE_TXCLEAR | PURGE_RXCLEAR);
    Zapros="";Otvet="";
    for (int e = 0; e < 8; e++) {
     Zapros=Zapros+IntToHex(d[e],2);
    }
    if (WriteFile(hPort,d,8,&wb,&ovr) || (GetLastError() == ERROR_IO_PENDING)){
     while (!GetOverlappedResult(hPort, &ovr, &wb, FALSE));
    }
    else{
     RQueue.Error=0x15;
     return false;
    }
    SetCommMask(hPort,EV_RXCHAR);
    WaitCommEvent(hPort,&mask,&ovr);
    DWORD WaitReturn=WaitForSingleObject(ovr.hEvent,TimeOut);
    if (WaitReturn==WAIT_OBJECT_0)
    {
     DWORD rb=-1,k;
     do{
      ReadFile(hPort,&r[++rb],1,&k,&ovr);
     }while (k>0);
     RQueue.Error=0;
     if (rb>0) {
      for (int e = 0; e < rb; e++) {
       Otvet=Otvet+IntToHex(r[e],2);
      }
     }
     if ((RQueue.NetAdr!=r[0])&&(rb>0)) RQueue.Error=0x10;
     if ((r[1]&0x80)&&(!RQueue.Error)) RQueue.Error=r[2];
     if ((RQueue.TypeReg!=r[1])&&(rb>0)&&(!RQueue.Error)) RQueue.Error=0x10;
     if (((RQueue.Count*2+5)!=rb)&&(!RQueue.Error)) RQueue.Error=0x11;
     if ((rb!=5)&&(r[1]&0x80)) RQueue.Error=0x11;
     if (!RQueue.Error){
      tmp=IntToHex(CRC16(r,rb-2),4);
      if ((StrToInt("0x"+tmp.SubString(3,2))!=r[rb-2])&&(StrToInt("0x"+tmp.SubString(1,2))!=r[rb-1]))RQueue.Error=0x13;
     }
     if (RQueue.Error) return false;
     for (int c = 0; c < RQueue.Count; c++) {
      RQueue.Value[c]=r[3+c*2]*256+r[4+c*2];
     }
    }
    if (WaitReturn==WAIT_TIMEOUT) {
     RQueue.Error=0x12;
     return false;
    }
    // CloseHandle(ovr.hEvent);
    return true;
    }
    catch (...) {
     RQueue.Error=0x14;
     return false;
    }

    }

    Проблема такова, при первом проходе читает отлично, при втором проходе считывает первый байт при выполнении функции writefile, что это может быть и как с этим бороться?
    Спасибо за помощь.
 
Конференция "WinAPI" » Чтение и запись в Com порт [WinXP]
Есть новые Нет новых   [134435   +35][b:0][p:0]