Linux - 串口处理

14 篇文章 0 订阅
1 篇文章 0 订阅

Linux - 串口处理

一定注意 注意:conn.setTimeout(10); 否则默认设置为500ms读取数据一次

/*!
\fn void QextSerialBase::construct()
Common constructor function for setting up default port settings.
(115200 Baud, 8N1, Hardware flow control where supported, otherwise no flow control, and 0 ms timeout).
*/
void QextSerialBase::construct()
{
    Settings.BaudRate=BAUD115200;
    Settings.DataBits=DATA_8;
    Settings.Parity=PAR_NONE;
    Settings.StopBits=STOP_1;
    Settings.FlowControl=FLOW_HARDWARE;
    Settings.Timeout_Millisec=500;
	mutex = new QMutex( QMutex::Recursive );
	setOpenMode(QIODevice::NotOpen);
}
//setTimeout()作用是定时读取数据到缓冲区 setTimeout(ms)里面大小参数设置原则:越小越好,不过如果pc机一次性发送的数据比较庞大,应该增大参数大小

1.工程文件地址:

Posix_QextSerialPort:git@github.com:qextserialport/qextserialport.git

2.Linux-基本参考:

1初始化 Posix_QextSerialPort 类

//const QString & name ->表示所使用的USART号
Posix_QextSerialPort conn("/dev/ttyAMA3", QextSerialBase::Polling);

conn.open(QIODevice::ReadWrite);
conn.setBaudRate(BAUD9600);
conn.setDataBits(DATA_8);
conn.setParity(PAR_NONE);
conn.setStopBits(STOP_1);
conn.setFlowControl(FLOW_OFF);
conn.setTimeout(10);		//-->一定初始化10ms 如果不设置会默认为500ms中断一次

2发送方法 直接使用即可

qint64 write(const char *data, qint64 len);
qint64 write(const char *data);

3接收方法

qint64 read(char *data, qint64 maxlen);
QByteArray read(qint64 maxlen);
QByteArray readAll();
qint64 readLine(char *data, qint64 maxlen);
QByteArray readLine(qint64 maxlen = 0);

PS: 经过测试,readAll()效率比较低,延时较大 conn.setTimeout(500);的情况下测试的

readAll()接收的情况,建议使用这种接收方式:

        // 从串口获取数据
        QByteArray temp;
        int num1,num2;
        num1 = num2 = 0;
        do{
            num1 = myCom->bytesAvailable(); //第一次查看串口缓冲区的数据
            msleep(10);
            num2 = myCom->bytesAvailable(); //第二次查看串口缓冲区的数据
            msleep(10);
        }while((num1 != num2) || (num1 <=0) || (num2 <= 0));
        temp = myCom->readAll(); //读取串口缓冲区的所有数据给临时变量temp

详情见参考网址

自己使用的是read()单个字节接收方式

        if(conn.bytesAvailable())
        {
            char utemp = 0x00;
            while(conn.read(&utemp, 1))
            {
                buf.date[buf.wp % BUF_MAX] = utemp;
                buf.wp++;
            }
        }

**PS: 建议创建一个结构体, 设置 读写指针来写入和读出数据缓冲区 **

    typedef struct 
    {
        int wp;
        int rp;
        quint8 date[BUF_MAX];
    }ST_SR_DATE;

4QTimer发送和接收

//接收
time_rev = new QTimer();
time_rev->setInterval(30);
connect(time_rev,SIGNAL(timeout()),this,SLOT(read_serial_data()),Qt::DirectConnection);
time_rev->start();
//发送同理哦

创建一个QTimer进行定时器定时读取即可。


WARNNING

  • 接收方法read()或者写入方法write()都不能一直运行;比如在一个线程中一直进行接收或者发送操作;这样会造成另一个方法阻塞,无法使用;(绝对不能直接使用QTread线程一直查询的方式,会导致发送 write()方法阻塞

  • 一定设置setTimeout(10);具体值的大小,根据自身测试使用;

  • virtual qint64 readData(char * data, qint64 maxSize);
    virtual qint64 writeData(const char * data, qint64 maxSize);
    

    如何向使用上面的readData 和WriteData方法的话,需要将让他们从 posix_qextserialport.h 中的 protect 中移到 public 中声明,就可以使用了


待更新

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值