2010-05-08 30 views
0

J'écris un programme pour communiquer avec un modem (il utilise des commandes Hayes) et cela fonctionne. L'interface graphique est programmée avec QT, mais la communication avec le port COM est écrite avec la bibliothèque winapi. J'ai un problème quand je veux envoyer avec mon message de programme d'un ordinateur à l'autre, je ne peux pas envoyer des caractères polonais (ils sont remplacés par '?'), Comment puis-je le réparer? Quelqu'un at-il idée? Et j'ai un autre problème, je ne peux pas envoyer de message de mon programme à Microsoft HyperTerminal, HyperTerminal recevoir quelque chose, mais pas ce que j'envoie. Thx pour toute aide :)Communication avec HyperTerminal [QT et WINApi]

pièces importantes de code: Connect avec port:

portHandle = CreateFile (portName, GENERIC_WRITE | GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); 

GetCommState (portHandle, &dcb); 
switch(ui->comboBox->currentIndex()) 
{ 
     case 0 : dcb.BaudRate=CBR_110; break; 
     case 1 : dcb.BaudRate=CBR_300; break; 
     case 2 : dcb.BaudRate=CBR_600; break; 
     case 3 : dcb.BaudRate=CBR_1200; break; 
     case 4 : dcb.BaudRate=CBR_2400; break; 
     case 5 : dcb.BaudRate=CBR_4800; break; 
     case 6 : dcb.BaudRate=CBR_9600; break; 
     case 7 : dcb.BaudRate=CBR_14400; break; 
     case 8 : dcb.BaudRate=CBR_19200; break; 
     case 9 : dcb.BaudRate=CBR_38400; break; 
     case 10 : dcb.BaudRate=CBR_56000; break; 
     case 11 : dcb.BaudRate=CBR_57600; break; 
     case 12 : dcb.BaudRate=CBR_115200; break; 
     case 13 : dcb.BaudRate=CBR_128000; break; 
     case 14 : dcb.BaudRate=CBR_256000; break; 
} 

dcb.fBinary = TRUE; 
dcb.fParity = TRUE; 
dcb.fOutxCtsFlow = FALSE; 
dcb.fOutxDsrFlow = FALSE; 
dcb.fDtrControl = DTR_CONTROL_ENABLE; 
dcb.fDsrSensitivity = FALSE; 
dcb.fTXContinueOnXoff = TRUE; 
dcb.fOutX = FALSE; 
dcb.fInX = FALSE; 
dcb.fErrorChar = FALSE; 
dcb.fNull = FALSE; 
dcb.fRtsControl = RTS_CONTROL_ENABLE; 
dcb.fAbortOnError = FALSE; 
//dcb.ByteSize = dataBits; 
dcb.DCBlength = sizeof (DCB); 

switch(ui->comboBox_3->currentIndex()) 
{ 
    case 1 : dcb.Parity = EVENPARITY; break; 
    case 3 : dcb.Parity = MARKPARITY; break; 
    case 2 : dcb.Parity = ODDPARITY; break; 
    case 4 : dcb.Parity = SPACEPARITY; break; 
    case 0 : dcb.Parity = NOPARITY; break; 
} 

switch (ui->comboBox_4->currentIndex()) 
{ 
    case 0 : dcb.StopBits = ONESTOPBIT; break; 
    case 1 : dcb.StopBits = ONE5STOPBITS;break; 
    case 2 : dcb.StopBits = TWOSTOPBITS; break; 
} 

switch (ui->comboBox_2->currentIndex()) 
{ 
    case 0 : dcb.ByteSize = 5; break; 
    case 1 : dcb.ByteSize = 6;break; 
    case 2 : dcb.ByteSize= 7; break; 
    case 3 : dcb.ByteSize = 8; break; 
} 

SetCommState (portHandle, &dcb); 

GetCommTimeouts (portHandle, &CommTimeouts); 
CommTimeouts.ReadIntervalTimeout = MAXDWORD; 
CommTimeouts.ReadTotalTimeoutMultiplier = 0; 
CommTimeouts.ReadTotalTimeoutConstant = 0; 
CommTimeouts.WriteTotalTimeoutMultiplier = 10; 
CommTimeouts.WriteTotalTimeoutConstant = 1000; 
SetCommTimeouts (portHandle, &CommTimeouts); 

Envoyer MSG:

void MainWindow::Send(char c) 
{ 
    do 
     {WriteFile(portHandle, &c, 1, &cbWritten, NULL); 
     } 
    while (!(cbWritten)); 
} 

void MainWindow::on_pushButton_clicked() 
{ 
    QString str = ui->lineEdit->text(); 
    std::string str2; 
    ui->lineEdit->clear(); 
    str2 = str.toStdString(); 
    for(int i=0; i < str2.size();i++) 
    { 
     Send(str2[i]); 
     //qDebug()<< str2[i]; 
    } 
    Send(char(13)); 

} 

Recevez MSG:

void ReaderThread::run() 
{ 

    char c; 
    while(1) 
    { 

     c = Receive(); 
     if(c==13) 
     { 
      emit insertPlainText("\n"); 
     } 
     else 
     { 
      emit insertPlainText(QString(c)); 

     } 

    } 
} 

char ReaderThread::Receive() 
{ 
    char c; 
    do{ 
     ReadFile(portHandle, &c, 1, &cbRead, NULL); 
    } 
    while (!(cbRead)); 
    return c; 

} 

Répondre

1

Vous êtes marteler un QChar de 16 bits dans un trou de 8 bits. Vous devrez envoyer et recevoir 2 octets par caractère ou vous limiter à un encodage de caractères de 8 bits.

+0

Comment puis-je convertir QChar en caractère pour pouvoir le recevoir correctement? – javaAmator

+1

Vous ne pouvez pas, aucun marteau n'est assez grand. Si vous ne voulez pas l'encoder vous-même, utilisez une fonction de QT ou de système d'exploitation pour encoder, par exemple, utf-8. Lisez ceci: http://www.joelonsoftware.com/articles/Unicode.html –