2

在尝试使用 WindowsAPI 时,我的应用程序出现了一点问题......我正在尝试以一种可以正常工作的方式连接到句柄,但是如果我更改代码,它就不再工作了......

有效的代码:

   handle_t porta; // Global var
   COMMTIMEOUTS tempos;  // Global var
   DCB configuracao; // Global var

   wchar_t pcCommPort[]= TEXT("COM1");
   //gate address to be accessed (COM1)

我正在尝试执行的代码:

   handle_t porta; // Global var
   COMMTIMEOUTS tempos;  // Global var
   DCB configuracao; // Global var

   String GATE = "COM" + Label1->Text;
   wchar_t pcCommPort[]= TEXT(GATE);
   //gate address to be accessed (Any gate)

我也试过了:

   handle_t porta; // Global var
   COMMTIMEOUTS tempos;  // Global var
   DCB configuracao; // Global var

   wchar_t pcCommPort[]= TEXT("COM" + Label1->Text);
   //gate address to be accessed (Any gate)

它:

   handle_t porta; // Global var
   COMMTIMEOUTS tempos;  // Global var
   DCB configuracao; // Global var

   String GATE = "COM" + Label1->Text;
   wchar_t pcCommPort[]= GATE;
   //gate address to be accessed (Any gate)

无论如何,或者它说我没有正确的语法或错误:无法将 unicode 字符串转换为 wchar_t。

编辑:

完整源码(功能):

void abrirporta(){
   wchar_t pcCommPort[]= TEXT("COM1");
   //endereço da porta a ser acessada (COM1)
   //porta foi declarado como HANDLE na seção private da declaração de classe Form
   //HANDLE porta
   porta = CreateFile(pcCommPort,GENERIC_READ+GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
   if(porta == INVALID_HANDLE_VALUE){
        log(7);
        throw Exception("Não foi possível abrir a porta COM.\nPor favor, tente novamente!");
    }

   //Tempo máximo entre o recebimento de 2 bytes (ms)
   tempos.ReadIntervalTimeout = 20;

   //Multiplicador de tempo de recebimento por byte
   tempos.ReadTotalTimeoutMultiplier = 0;
   tempos.ReadTotalTimeoutConstant = 100;
   tempos.WriteTotalTimeoutMultiplier = 0;
   tempos.WriteTotalTimeoutConstant = 100;
   if(!SetCommTimeouts(porta ,&tempos))
   {
      CloseHandle(porta);
      frmPrincipal->spLig->Visible = False;
      frmPrincipal->spStatusInd->Visible = False;
      log(6);
      throw Exception("Erro na configuração de Timeout");
   }

   GetCommState(porta, &configuracao);

   configuracao.BaudRate = 19200;
   configuracao.ByteSize = 8;
   configuracao.Parity = NOPARITY;
   configuracao.StopBits = ONESTOPBIT;

   if(!SetCommState(porta,&configuracao))
   {
        CloseHandle(porta);
        frmPrincipal->spLig->Visible = False;
        frmPrincipal->spStatusInd->Visible = False;
        log(5);
        throw Exception("Erro na Configuração da porta");
   }
    frmPrincipal->spLig->Visible = True;
    frmPrincipal->spStatusInd->Visible = False;
    log(3);
    frmPrincipal->btEnviar->Enabled = true;
    frmPrincipal->swSaida1->Enabled = true;
    log(8);
}

我希望你能帮助我......从现在开始感谢XD。

4

1 回答 1

4

您正在使这变得更加困难,而不是需要。 System::String是 的别名System::UnicodeString,它保存wchar_tWindows 上的数据。您不需要将UnicodeString数据复制到wchar_t[]缓冲区中。UnicodeString::c_str()当您需要将 a 传递String给需要参数的函数时,您可以使用该方法wchar_t*,例如:

void abrirporta()
{
    String pcCommPort = L"COM" + Label1->Text;
    porta = CreateFile(pcCommPort.c_str(), ...);
    ...
}
于 2014-09-18T00:30:11.070 回答