Qt中串口发送HEX数据

             在lineEdit输入数据的类型是QString类型,以往我在发送的时候是ASCII方式发送,这会儿突然遇到一个是十六进制发送/接受的下位机,就需要将QString 转化为十六进制,本来直接用toHex进行转化,但考虑到在输入的的时候有间隔符之类的,我就写了个转化的函数;

              以下是转化单个字符的函数:

char  MainWindow::convertHexFromChar(char ch)
{
    if((ch>='0')&&(ch<='9'))
    {
        return(ch-0x30);
    }
    else if((ch>='A')&&(ch<='F'))
    {
        return(ch-'A'+10);
    }
    else if((ch>='a')&&(ch<='f'))
    {
        return(ch-'a'+10);
    }
    else
    {
       return(-1);
    }
}

将lineEdit中的数据挨个转化发送的完整程序如下,switch语句是我为了可以兼有可以发送ASCII设置的,看case 1部分即可;

void MainWindow::on_transmitPushButton_clicked()
{
    char cDataHigh,cDataLow;
    QByteArray sendData;
    int iSendDataSize = 0;
    int iSize = ui->lineEdit->text().size();
    switch(ui->modeSelectComboBox->currentIndex())
    {
        case 1:
        {
            for(int i = 0;i<iSize-1;)
            {
                char tempByte_h = ui->lineEdit->text().at(i).toAscii();
                if(tempByte_h == ' ')
                {
                    i+=1;
                    continue;
                }
                else
                {
                    char tempByte_l = ui->lineEdit->text().at(i+1).toAscii();//转化成ASCII码的形式,便于符号之间的运算
                    i+=2;
                    cDataHigh = MainWindow::convertHexFromChar(tempByte_h);
                    cDataLow  = MainWindow::convertHexFromChar(tempByte_l);
                    char sendChar =(char)((cDataHigh<<4)+cDataLow);
                    sendData[iSendDataSize]=sendChar;
                    iSendDataSize++;
                }
            }
            Com->write(sendData);//write是一个重载函数,参考QIODevice类
           
        }break;
        case 0:
        {
             //Com->write(ui->lineEdit->text().toAscii());
             Com->write((ui->lineEdit->text()+"\r").toAscii());
             qDebug()<<ui->lineEdit->text();

        }break;
        default:
        {
              Com->write(ui->lineEdit->text().toAscii());
        }break;
    }
}

### 使用Qt进行串口通信发送Hex数据Qt框架下实现通过串口发送十六进制(Hex数据的功能涉及多个方面,包括设置串口参数、打开指定端口以及编写用于转换和传输Hex字符串的具体逻辑。下面提供一段基于`QSerialPort`类的示例代码来展示这一过程[^1]。 ```cpp #include <QCoreApplication> #include <QSerialPort> #include <QSerialPortInfo> #include <QDebug> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // 创建串口对象实例 QSerialPort serial; // 设置串口号 serial.setPortName("/dev/ttyUSB0"); // Linux下的路径;Windows上可能是COM3等 // 配置波特率及其他属性 serial.setBaudRate(QSerialPort::Baud9600); serial.setDataBits(QSerialPort::Data8); serial.setParity(QSerialPort::NoParity); serial.setStopBits(QSerialPort::OneStop); serial.setFlowControl(QSerialPort::NoFlowControl); // 打开端口 if (!serial.open(QIODevice::ReadWrite)) { qDebug() << "Failed to open port"; return -1; } // 准备要发送数据包,这里假设我们要发送'FF AA BB CC' QByteArray sendData = QByteArray::fromHex("FFAABBCC"); // 发送数据串口 int bytesWritten = serial.write(sendData); // 确认写入操作完成 if(serial.waitForBytesWritten(500)) qDebug()<<"Data sent successfully."; else qDebug()<<"Error writing data."; // 关闭串口连接 serial.close(); return a.exec(); } ``` 上述程序展示了怎样利用Qt中的`QSerialPort`库来进行基本的串行通讯配置,并且实现了向目标设备发送特定格式的Hex命令序列。注意,在实际应用环境中可能还需要处理更多细节问题,比如错误检测与恢复机制、超时管理或是更复杂的协议解析等功能。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值