首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与HyperTerminal的通信[ QT和WINApi ]

与HyperTerminal的通信[ QT和WINApi ]
EN

Stack Overflow用户
提问于 2010-05-09 02:55:22
回答 1查看 1.5K关注 0票数 0

我写的程序与调制解调器通信(它使用海斯命令),这是工作。图形用户界面使用QT编写,而与串口的通信则使用winapi库编写。当我想把我的程序消息从一台计算机发送到另一台计算机时,我有问题,我不能发送波兰语字符(它们由‘?’重复),我如何解决它?有谁有主意吗?我还有一个问题,我不能从我的程序发送消息到微软的HyperTerminal,HyperTerminal接收一些东西,但不是我发送的东西。Thx需要任何帮助:)

重要代码:连接端口:

代码语言:javascript
复制
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);

发送消息:

代码语言:javascript
复制
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));

}

接收消息:

代码语言:javascript
复制
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;

}
EN

回答 1

Stack Overflow用户

发布于 2010-05-09 03:40:10

您正在将一个16位的QChar敲入一个8位的洞中。您需要发送和接收每个字符2个字节,或者将自己限制为8位字符编码。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2795242

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档