2010-05-08 100 views
0

我寫程序與調制解調器(它使用海耶斯命令)通信,這是行得通的。 GUI是用QT編程的,但是與COM端口的通信是用winapi庫編寫的。當我想將我的程序消息從一臺計算機發送到另一臺計算機時,我遇到了問題,我無法發送波蘭字符(它們被'?'重新填滿),我該如何解決它?有沒有人有想法?而且我還有一個問題,我無法從我的程序發送消息給Microsoft HyperTerminal,HyperTerminal收到了一些東西,但不是我發送的內容。 THX對於任何幫助:)與超級終端通信[QT和WINApi]

重要的部分代碼: 與連接端口:

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); 

發送味精:

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)); 

} 

接收味精:

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; 

} 

回答

1

你是將16位QChar打入8位鑽孔。您需要爲每個字符發送和接收2個字節,或將自己限制爲8位字符編碼。

+0

如何將QChar轉換爲char以便能夠正確接收? – javaAmator 2010-05-09 11:15:41

+1

你不能,沒有足夠大的錘子。如果您不想自己編碼,請使用某種QT或操作系統函數對utf-8進行編碼。閱讀:http://www.joelonsoftware.com/articles/Unicode.html – 2010-05-09 11:51:15