QT如何使用QSerialPort类写串口

星辰韦 2015-10-31 06:00:49
先说我要输出串口的数据
协议为:0x84, channel number, target low bits, target high bits
假设需要第二信道输出值为6000(0101110 1110000)
协议的二进制则为10000100, 00000010, 01110000, 00101110
协议的十六进制则为0x84, 0x02, 0x70, 0x2E

官方给了个c的例子
serialBytes[0] = 0x84; // Command byte: Set Target.
serialBytes[1] = channel; // First data byte holds channel number.
serialBytes[2] = target & 0x7F; // Second byte holds the lower 7 bits of target.
serialBytes[3] = (target >> 7) & 0x7F; // Third data byte holds the bits 7-13 of target.
这里得target应该是十六进制的6000吧???

之后是重点,如何使用"QSerialPort::write(command)"
原来command定义成char,但是使用不了,貌似qt需要用个QByteArray来写串口,如何写这段程序???
...全文
3255 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Zeroonezeroone 2017-10-16
  • 打赏
  • 举报
回复
[quote=引用 10 楼 mqdsg 的回复:] QDebug 呀[/quot 怎么QDebug呢?还是qDebug?
星辰韦 2015-11-05
  • 打赏
  • 举报
回复
引用 7 楼 mqdsg 的回复:
是的,可将target 转成或者定义为char; 不太熟悉Ubuntu的串口监控,可以使用minicom;或者硬件连线后直接接到windows上查看则较为方便。
哎,实在搞不清楚写给串口的是什么数据了 有没有什么办法把char command[4]或是QByteArray按照十六进制打印出来??? 求代码
在飞的特拉斯 2015-11-05
  • 打赏
  • 举报
回复
QDebug 呀
在飞的特拉斯 2015-11-04
  • 打赏
  • 举报
回复
引用 6 楼 u010417757 的回复:
[quote=引用 5 楼 mqdsg 的回复:] 像这样子写即可:

            QByteArray res;
            res.append(0x01);
            res.append(0x02);
            res.append(0x03);
            res.append(0x04);
            serial.write(res);
试着写了个
QByteArray command;
    command.append(0x84);
    command.append(0x02);
    command.append(target & 0x7F);
    command.append((target >> 7) & 0x7F);
    myCom-> QSerialPort::write(command);
但是貌似串口发出的数据还是不对,target必须是十六进制的对吗? 有什么方法看串口到底写了什么数据吗? 在ubuntu下[/quote] 是的,可将target 转成或者定义为char; 不太熟悉Ubuntu的串口监控,可以使用minicom;或者硬件连线后直接接到windows上查看则较为方便。
星辰韦 2015-11-04
  • 打赏
  • 举报
回复
引用 7 楼 mqdsg 的回复:
是的,可将target 转成或者定义为char; 不太熟悉Ubuntu的串口监控,可以使用minicom;或者硬件连线后直接接到windows上查看则较为方便。
没明白该怎么转 网上查到个函数,但貌似是十六转十的 toInt(&ok, 16);
星辰韦 2015-11-04
  • 打赏
  • 举报
回复
引用 5 楼 mqdsg 的回复:
像这样子写即可:

            QByteArray res;
            res.append(0x01);
            res.append(0x02);
            res.append(0x03);
            res.append(0x04);
            serial.write(res);
试着写了个
QByteArray command;
    command.append(0x84);
    command.append(0x02);
    command.append(target & 0x7F);
    command.append((target >> 7) & 0x7F);
    myCom-> QSerialPort::write(command);
但是貌似串口发出的数据还是不对,target必须是十六进制的对吗? 有什么方法看串口到底写了什么数据吗? 在ubuntu下
在飞的特拉斯 2015-11-03
  • 打赏
  • 举报
回复
像这样子写即可:

            QByteArray res;
            res.append(0x01);
            res.append(0x02);
            res.append(0x03);
            res.append(0x04);
            serial.write(res);
星辰韦 2015-11-02
  • 打赏
  • 举报
回复
汗,用char也能用于写串口,,只是别的地方写错了 原问里还有个问题帮忙回答下,target应该是十六进制的6000吧??? 写完之后还有个问题,函数的调用,error: variable or field 'createSerialPort' declared void void createSerialPort(portName, baudRate); C++新手啊,求教导

//servocontroller.h
#ifndef SERVOCONTROLLER_H
#define SERVOCONTROLLER_H
#include <string>
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>
class ServoController
{
public:
    // Create a concrete platform-specific SerialInterface.
    // Return NULL if the interface couldn't be created and set the optional error message.
    void createSerialPort(const QString &portName, unsigned int baudRate);

    virtual ~ServoController();     // Destructor

    // Set the target position of a channel to a given value in 0.25 microsecond units
    void setTarget( unsigned char channelNumber, unsigned short target );

private:
    static const unsigned short mMinChannelValue = 3968;
    static const unsigned short mMaxChannelValue = 8000;
    //QByteArray byte;
    char command[4];
    //QString byte;
    QSerialPort* myCom;
};
#endif // SERVOCONTROLLER_H

//servocontroller.cpp

#include "servocontroller.h"
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>

void ServoController::createSerialPort( const QString &portName, unsigned int baudRate){
    myCom= new QSerialPort();
    myCom->setPortName(portName);
    myCom->open(QIODevice::ReadWrite);
    myCom->setBaudRate(baudRate);
    myCom->setDataBits(QSerialPort::Data8);
    myCom->setParity(QSerialPort::NoParity);
    //myCom->setStopBits(QSerialPort::OneStop);
    myCom->setFlowControl(QSerialPort::NoFlowControl);
}

ServoController::~ServoController(){
    myCom->close();
}

void ServoController::setTarget( unsigned char channelNumber, unsigned short target ){
    if (target<mMinChannelValue ){
        target=mMinChannelValue;
    }
    if(target>mMaxChannelValue){
        target=mMaxChannelValue;
    }
    command[0]=0x84;
    command[1]=channelNumber;
    command[2]=target & 0x7F;
    command[3]=(target >> 7) & 0x7F;
    //QByteArray byte(command);
    //byte = QByteArray(command);
    myCom-> QSerialPort::write(command);
}

// main.cpp
#include "servocontroller.h"
int main(){
    const QString portName = "/dev/ttyACM0";
    unsigned int baudRate=9600;
    void createSerialPort(portName, baudRate);
}
星辰韦 2015-11-02
  • 打赏
  • 举报
回复
这就要沉了吗,,难道没人明白吗
gldcpp 2015-10-31
  • 打赏
  • 举报
回复
1:串口设置 myCom=new QSerialPort("COM6"); myCom->open(QIODevice::ReadWrite); myCom->setBaudRate(QSerialPort::Baud38400); myCom->setParity(QSerialPort::NoParity); myCom->setDataBits(QSerialPort::Data8); myCom->setStopBits(QSerialPort::OneStop); myCom->setFlowControl(QSerialPort::NoFlowControl); (根据实际情况略有不同) 2:read函数 QByteArray temp;QString strhex; if(myCom->bytesAvailable()>=7) { temp=myCom->readAll(); //全部读取 QDataStream out(&temp,QIODevice::ReadWrite); while(!out.atEnd()) { qint8 outchar=0; out>>outchar; QString str=QString("%1").arg(outchar&0xFF,2,16,QLatin1Char('0')); strhex+=str; } qDebug()<<strhex; }
星辰韦 2015-10-31
  • 打赏
  • 举报
回复
引用 1 楼 gldcpp 的回复:
2:read函数
我要的是写串口啊

16,216

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧