首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从WriteFile转换为QtSerial写入

从WriteFile转换为QtSerial写入
EN

Stack Overflow用户
提问于 2017-01-05 03:21:02
回答 1查看 103关注 0票数 0

我正在尝试转换一些旧代码以使用QtSerial集成。

我有以下几点:

代码语言:javascript
复制
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来处理端口和读取/发送数据。我有点摸不着头脑了。对于我目前拥有的处理方式:

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

当我发送一个命令时,我使用(例如):

代码语言:javascript
复制
HANDLE RS232Handle;
    RS232Handle=OpenRS232(COM5, 9600);
    SendCmd(RS232Handle, 1, 5, 154, 5, 0);
    CloseRS232(RS232Handle);

我在QT中使用上面的代码时遇到了一些问题。比如异步读取问题。

我尝试修改上面的代码以使用QSerialPort

对于端口的句柄:

代码语言:javascript
复制
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发送的数据的实际写入,我不知道。任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2017-01-07 00:21:35

由于QSerialPort是从QIODevice扩展而来的,因此只需使用readwrite方法来发送和接收来自端口的数据。在这一点上,QSerialPort的作用就像你用Qt打开的任何其他文件一样。当您将数据写入串行端口时,最简单的方法就是将数据放入QByteArray,然后再将其写出。下面这样的代码应该是有效的:

代码语言:javascript
复制
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信号的插槽。当存在要从端口读取的某些数据时,发出该信号。一个简单的实现可能如下所示:

代码语言:javascript
复制
/* 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 */
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41471696

复制
相关文章

相似问题

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