Arm Qt 实战一:简单使用Arm设备的串口

1、Arm串口驱动程序

创建Serial类:serial.h、serial.cpp

#include "serial.h"
#include <QDebug>

#define printf qDebug

Serial::Serial()
{
}
bool Serial::opend(QString dev,BAUD_RATE buad,char nEvent)
{
    fd = open(dev.toLocal8Bit().data(), O_RDWR);
    if(fd < 0)
    {
        printf("open device = %s false!!",dev.toLatin1().data());
        return false;
    }
    else
    {
        printf("open device = %s ok!!",dev.toLatin1().data());
        switch(buad)
        {
            case BAUD115200:
                printf("open set baud rate = 115200");
                init(fd, B115200, &sendFd, &reciveFd);
            break;
            case BAUD38400:
                printf("open set baud rate = 38400");
                init(fd, B38400, &sendFd, &reciveFd);
            break;
            case BAUD19200:
                printf("open set baud rate = 19200");
                init(fd, B19200, &sendFd, &reciveFd);
            break;
            case BAUD9600:
                printf("open set baud rate = 9600");
                init(fd, B9600, &sendFd, &reciveFd);
            break;
        }
        return true;
    }
}
void Serial::closed()
{
    close(fd);
}

bool Serial::init(int i_fd, speed_t i_baud, fd_set* i_sendSet, fd_set* i_rcvSet)
{
    int i;

    struct termios newtio;

    printf("init");

    FD_ZERO(i_rcvSet);									// Çå¿Õ´®¿Ú½ÓÊն˿ڼ¯
    FD_ZERO(i_sendSet);									// Çå¿Õ´®¿Ú·¢ËͶ˿ڼ¯
    FD_SET(i_fd,i_rcvSet);								// ÉèÖô®¿Ú½ÓÊն˿ڼ¯
    FD_SET(i_fd,i_sendSet);								// ÉèÖô®¿Ú·¢ËͶ˿ڼ¯

    bzero(&newtio, sizeof(newtio));
    tcgetattr(i_fd, &newtio);							// µÃµ½µ±Ç°´®¿ÚµÄ²ÎÊý
    cfsetispeed(&newtio, i_baud);						// ÉèÖÃÊäÈ벨ÌØÂÊÉè
    cfsetospeed(&newtio, i_baud);						// ÉèÖÃÊä³ö²¨ÌØÂÊÉè
    newtio.c_cflag |= (CLOCAL | CREAD);					// ʹÄܽÓÊÕ²¢Ê¹Äܱ¾µØ״̬
    newtio.c_cflag &= ~PARENB;							// ÎÞУÑé 8λÊý¾Ýλ1λֹͣλ
    newtio.c_cflag &= ~CSTOPB;
    newtio.c_cflag &= ~CSIZE;
    newtio.c_iflag &= ~(ICRNL | IXON);
    newtio.c_cflag |= CS8;
    newtio.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);	// ԭʼÊý¾ÝÊäÈë
    newtio.c_oflag &= ~(OPOST);

    newtio.c_cc[VTIME]    = 0;   						// ÉèÖõȴýʱ¼äºÍ×îС½ÓÊÕ×Ö·ûÊý
    newtio.c_cc[VMIN]     = 0;

    tcflush(i_fd, TCIFLUSH);							// ´¦Àíδ½ÓÊÕµÄ×Ö·û
    tcsetattr(i_fd,TCSANOW,&newtio); 					// ¼¤»îÐÂÅäÖÃ

    //this->start();
}

bool Serial::writed(char *data,int len)
{
    write(fd, data, len);
}
bool Serial::writed(char *data)
{
    write(fd, data, sizeof(data));
}

int Serial::readData(unsigned char *data,int len)
{
    return read(fd,data,len);
}

int Serial::readData(char *data,int len)
{
    int ret = read(fd,data,len);
    return ret;
}


#ifndef SERIAL_H
#define SERIAL_H

#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <linux/types.h>
#include <linux/fb.h>
#include <stdio.h>
#include <sys/wait.h>
#include <pthread.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <unistd.h>
#include <time.h>
#include <termios.h>
#include <sys/select.h>

#include <QString>
#include <QThread>

class Serial
{
public:
    Serial();

    enum BAUD_RATE
    {
        BAUD115200,
        BAUD38400,
        BAUD19200,
        BAUD9600,
    };


    bool opend(QString dev,BAUD_RATE buad,char nEvent);
    bool init(int i_fd, speed_t i_baud, fd_set* i_sendSet, fd_set* i_rcvSet);
    void closed();
    bool writed(char *data,int len);
    bool writed(char *data);
    int readData(unsigned char *data,int len);
    int readData(char *data,int len);

private:
    int fd;
    char writeBuf[50];
    char reciveBuf[50];
    fd_set sendFd,reciveFd;
    void debug(QString str);
};

#endif // SERIAL_H

2、使用Serial操作串口

创建一个Rs485sender线程类,操作Serial进行数据的发送

rs485sender.cpp

#include "rs485sender.h"
#include <stdio.h>
#include <stdlib.h>

Rs485sender::Rs485sender(QObject *parent) :
    QThread(parent)
{
    com = new Serial();
    com->opend("/dev/ttyO1",Serial::BAUD115200,'n');

    moveToThread(this);
    this->start();
}
void Rs485sender::run()
{
    printf("Rs485sender::run\r\n");
    char comInput[100];

    while(true)
    {
        this->msleep(1000);
        memset(comInput,0,sizeof(comInput));
        QString comCmd = "send com2";
        com->writed(comCmd.toLatin1().data(),comCmd.length());
       printf("Rs485sender::send ----- \r\n");
    }
}

rs485sender.h

#ifndef RS485SENDER_H
#define RS485SENDER_H


#include <QThread>
#include <QtCore>
#include <QString>
#include <QMap>
#include <QMutex>
#include <QTimer>

#include "../../util/serial.h"

class Rs485sender : public QThread
{
    Q_OBJECT
public:
    explicit Rs485sender(QObject *parent = 0);

private:
    QMutex qmutex;
    Serial *com;

protected:
    void run();
    QString getValue(QString in,QString cut);
    void deal(char *in,int len);

signals:

public slots:

};

#endif // RS485SENDER_H

创建Rs485resver1进行数据的接收

rs485resver1.cpp

#include "rs485resver1.h"
#include <stdio.h>
#include <stdlib.h>

Rs485resver1::Rs485resver1(QObject *parent) :
    QThread(parent)
{
    com = new Serial();
    com->opend("/dev/ttyO3",Serial::BAUD115200,'n');

    moveToThread(this);
    this->start();
}
void Rs485resver1::run()
{
    printf("Rs485resver1::run\r\n");
    char comInput[100];

    while(true)
    {
        this->msleep(1000);
        memset(comInput,0,sizeof(comInput));
//        String com1Cmd = "read com2";
        //com1Input->writed(com1Cmd.toLatin1().data(),com1Cmd.length());
        int len = com->readData(comInput,sizeof(comInput));
        printf("Rs485resver1::%s \r\n",comInput);
    }
}

rs485resver1.h

#ifndef RS485RESVER1_H
#define RS485RESVER1_H


#include <QThread>
#include <QtCore>
#include <QString>
#include <QMap>
#include <QMutex>
#include <QTimer>

#include "../../util/serial.h"

class Rs485resver1 : public QThread
{
    Q_OBJECT
public:
    explicit Rs485resver1(QObject *parent = 0);

private:
    QMutex qmutex;
    Serial *com;

protected:
    void run();
    QString getValue(QString in,QString cut);
    void deal(char *in,int len);

signals:

public slots:

};

#endif // RS485RESVER1_H

Main方法中调用

    Rs485resver1 *rs485resver1;
    Rs485resver2 *rs485resver2;
    Rs485sender *rs485sender;
    
    /*485总线测试*/
    rs485resver1 = new Rs485resver1();
    rs485resver2 = new Rs485resver2();
    rs485sender = new Rs485sender();

3、ARM设备进行线缆连接

1、将板卡上的485线缆进行连接,串口1的A和串口2的A连接,串口1的B和串口2的B连接,485不是AB交叉连接的,A对A,B对B
2、我的板卡有4个485口,我使用了1个发送,2个接收。

4、运行代码测试:

可以看到,Rs485sender发送数据Rs485resver1、Rs485resver2收到数据。

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值