2017-01-04 3 views
0

QtSerial統合を利用するために古いコードを変換しようとしています。WriteFileからQtSerialへの変換

私は次があります。

void SendCmd(HANDLE Handle, UCHAR Address, UCHAR Command, UCHAR Type, UCHAR Motor, INT Value) 
{ 

    UCHAR TxBuffer[9]; 
    DWORD BytesWritten; 
    int i; 

    TxBuffer[0]=Address; 
    TxBuffer[1]=Command; 
    TxBuffer[2]=Type; 
    TxBuffer[3]=Motor; 
    TxBuffer[4]=Value >> 24; 
    TxBuffer[5]=Value >> 16; 
    TxBuffer[6]=Value >> 8; 
    TxBuffer[7]=Value & 0xff; 
    TxBuffer[8]=0; 
    for(i=0; i<8; i++) 
     TxBuffer[8]+=TxBuffer[i]; 

    //Send the datagram 

    WriteFile(Handle, TxBuffer, 9, &BytesWritten, NULL); 
} 

私はデータの送信/ポートの取り扱いや読書のためQTSerialを使用したいです。私の頭の上の少しのIm。

HANDLE OpenRS2322(const wchar_t* ComName, DWORD BaudRate) 
{ 
    HANDLE ComHandle; 
    DCB CommDCB; 
    COMMTIMEOUTS CommTimeouts; 
    ComHandle=CreateFileW(ComName, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 
    if(GetLastError()!=ERROR_SUCCESS) return INVALID_HANDLE_VALUE; 
    else 
    { 
     GetCommState(ComHandle, &CommDCB); 

     CommDCB.BaudRate=BaudRate; 
     CommDCB.Parity=NOPARITY; 
     CommDCB.StopBits=ONESTOPBIT; 
     CommDCB.ByteSize=8; 

     CommDCB.fBinary=1; //Binary Mode only 
     CommDCB.fParity=0; 
     CommDCB.fOutxCtsFlow=0; 
     CommDCB.fOutxDsrFlow=0; 
     CommDCB.fDtrControl=0; 
     CommDCB.fDsrSensitivity=0; 
     CommDCB.fTXContinueOnXoff=0; 
     CommDCB.fOutX=0; 
     CommDCB.fInX=0; 
     CommDCB.fErrorChar=0; 
     CommDCB.fNull=0; 
     CommDCB.fRtsControl=RTS_CONTROL_TOGGLE; 
     CommDCB.fAbortOnError=0; 

     SetCommState(ComHandle, &CommDCB); 

     //Set buffer size 
     SetupComm(ComHandle, 100, 100); 

     //Set up timeout values (very important, as otherwise the program will be very slow) 
     GetCommTimeouts(ComHandle, &CommTimeouts); 

     CommTimeouts.ReadIntervalTimeout=MAXDWORD; 
     CommTimeouts.ReadTotalTimeoutMultiplier=0; 
     CommTimeouts.ReadTotalTimeoutConstant=0; 

     SetCommTimeouts(ComHandle, &CommTimeouts); 

     return ComHandle; 
    } 
} 

を、私は私が(たとえば)を使用するコマンドを送信するとき:取り扱いについて私は現在持っている

HANDLE RS232Handle; 
    RS232Handle=OpenRS232(COM5, 9600); 
    SendCmd(RS232Handle, 1, 5, 154, 5, 0); 
    CloseRS232(RS232Handle); 

私はQTで上記のコードを使用して、いくつかの問題に実行しています。非同期に読む問題と同様です。

QSerialPortを使用するために上記のコードを修正するための私のラメの試み:

ポートのハンドルの場合:

QSerialPort serial; 
    serial.setPortName("COM5"); 
    serial.open(QIODevice::ReadWrite); 
    serial.setBaudRate(QSerialPort::Baud115200); 
    serial.setDataBits(QSerialPort::Data8); 
    serial.setParity(QSerialPort::NoParity); 
    serial.setStopBits(QSerialPort::OneStop); 
    serial.setFlowControl(QSerialPort::HardwareControl); 
    if (serial.isOpen() && serial.isWritable()) 
    { 
    qDebug() << "Serial is open"; 
     } 

と以前WriteFileを経由して送信されているデータの実際の書き込みのために、私はわからない。どんな助けもありがとう。

答えて

0

QSerialPortQIODeviceから拡張されているため、readwriteの方法を使用してポートからデータを送受信します。この点に関して、QSerialPortは、あなたがQtで開く他のファイルと同じように動作します。シリアルポートに何かを書くときは、単にデータをQByteArrayに入れ、それを書いておくのが最も簡単な方法です。次のようなものは動作するはずです:この時点では、データはおそらく(コントロールはメインループに戻ったら、それが起こる)デバイスに書き込まれていないことを

void SendCmd(QSerialPort* port, UCHAR Address, UCHAR Command, UCHAR Type, UCHAR Motor, INT Value) 
{ 

QByteArray ba; 
UCHAR checksum = 0; 

ba.append(Address); 
ba.append(Command); 
ba.append(Type); 
ba.append(Motor); 
ba.append(Value >> 24; 
ba.append(Value >> 16); 
ba.append(Value >> 8); 
ba.append(Value & 0xff); 
for(i=0; i<8; i++) 
    checksum += ba[i]; 
ba.append(checksum); 

//Send the datagram 
port->write(ba); 
} 

注意を。

データを読み取るには、シリアルポートのreadyRead信号に接続するスロットを作成します。この信号は、ポートから読み取るべきデータがあるときに出力されます。簡単な実装は次のようになります。

/* When the seral port is made */ 
/* (using new signal/slot syntax) */ 
connect(serialPort, &QSerialPort::readyRead, 
     this, &MyClass::readyRead); 

/* ... other initialization code ... */ 

void MyClass::readyRead(){ 
    QByteArray data = serialPort.readAll(); 

    /* Data processing here */ 
} 
関連する問題