远程连接旭日x3派

旭日x3派的cpu仅有1.2GHz,因此为了开发时的便利和效率,有些操作可以在PC电脑上预处理。且旭日x3派自带无线网卡,此时可以无线连接对旭日x3派进行操作,这就很香了。以我自己的开发环境:PC电脑+旭日x3派+destop版系统为例,说说配置流程。

首先,电脑需要有个软件MobaXterm,下载链接:https://mobaxterm.mobatek.net/download.html 。下载免费的home版本即可。

二,打开电脑的无线热点,将旭日派的无线网络连上热点。destop版直接在桌面右上网络图标那连接即可。server版本的可以先通过mobaxterm的串口连接操作,详细可以查看串口登录章节:https://developer.horizon.ai/api/v1/fileData/documents_pi/Quick_Start/Quick_Start.html#id8

在通过串口输入命令连接热点:

扫描热点

sudo nmcli device wifi rescan

列出热点

nmcli device wifi list

连接热点

sudo nmcli device wifi connect WiFi名 password WiFi密码

三,在x3派的终端输入“ifconfig”查看网络状态。查看“wlan0”的参数,可以看到我这里x3派的地址为192.168.137.168

有了ip地址后我们可以选择ssh连接,ssh连接速度快,但是只能使用命令行进行远程操作。另外也可以使用VNC连接,VNC可以远程桌面操作,但是弊端也很明显,卡顿明显。下图是VNC连接后的界面

另外,使用ssh连接时,我们可以非常方便的在界面左侧对x3派的文件进行操作

这样我们就可以方便的在pc机远程控制x3派了。

安装qt

在旭日x3派上安装qt进行开发。安装步骤如下:

打开终端输入 

sudo apt install qt5-default

安装qt5的包,有了qt5的包后,接下来需要安装编译器qtcreator

sudo apt install qtcreator

这样可以快速安装好qt相关的环境。至于cv库的安装建议通过apt install libopencv-dev命令安装编译好的4.2的opencv,可以避免不少繁杂的操作。

建立工程

这里以搭建一个最简单纯净的工程为例。首先打开qtcreator建立一个新工程,选择Non-qt project  中的C++ Application,当需要不同的库时可以自己再另行添加。

接下来需要在.pro文件中添加头文件的路径和库所在路径。

可以通过下面命令查看cv的安装路径

dpkg -L libopencv-dev

一般默认状态下opencv的库安装路径是/usr/lib/aarch64-linux-gnu/  打开这个路径发现确实有很多opencv的.so后缀文件,头文件路径是 /usr/include/。

所以打开qt工程下后缀为.pro的文件添加如下语段

INCLUDEPATH += /usr/include/opencv4 \
            /usr/include/opencv2 \
            /usr/include/opencv

LIBS += /usr/lib/aarch64-linux-gnu/libopencv_core.so \
        /usr/lib/aarch64-linux-gnu/libopencv_calib3d.so \
        /usr/lib/aarch64-linux-gnu/libopencv_features2d.so \
        /usr/lib/aarch64-linux-gnu/libopencv_flann.so \
        /usr/lib/aarch64-linux-gnu/libopencv_highgui.so \
        /usr/lib/aarch64-linux-gnu/libopencv_imgproc.so \
        /usr/lib/aarch64-linux-gnu/libopencv_ml.so \
        /usr/lib/aarch64-linux-gnu/libopencv_objdetect.so \
        /usr/lib/aarch64-linux-gnu/libopencv_photo.so \
        /usr/lib/aarch64-linux-gnu/libopencv_stitching.so \
        /usr/lib/aarch64-linux-gnu/libopencv_superres.so \
        /usr/lib/aarch64-linux-gnu/libopencv_video.so \
        /usr/lib/aarch64-linux-gnu/libopencv_videostab.so

此时,开发环境基本配置好,但是在main.cpp中会显示报错“ expected unqualified-id”,但是又可以正确运行程序,这种情况一般是头文件间的相互重复引用引起。就是a.h中引用了b.h,同时b.h也引用了a.h。这种情况一般不影响使用,但是也可以通过以下操作解决:

在工具栏中找到“help”,点击打开再打开其中的“About plugins”

将下图框选的clangcodemodel插件的勾勾去掉,再重启qtcreator就没有报错了。到此,环境配置已经完成。

串口通信

在东方红B类竞赛属于竞技比赛,其中有一点就是竞速,此时若是只使用旭日x3派作为控制板,是不够的。因此另外使用MCU去实现驱动电机与一些传感器的数据处理。此时旭日x3派与MCU间就需要进行通信,在这种短距离的通信串口是非常好用的,简单便捷。首先可以通过命令判断x3派的硬件串口对应哪个文件。

dmesg | grep ttyS

返回 : 00:05: ttyS0 at I/O 0x3f8 (irq = 4, base_baud = 115200) is a 16550A。可以看到x3派的串口对应ttyS0.接着即可让x3派和MCU进行串口通信了。示例代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>

#define BAUDRATE B115200 //波特率 : 115200

#define DEVICE "/dev/ttyS0"  //设置端口

int nFd = 0;
struct termios stNew;
struct termios stOld;

//Open Port & Set Port
int SerialInit()
{
    nFd = open(DEVICE, O_RDWR|O_NOCTTY|O_NDELAY);
    if(nFd == -1)
    {
        perror("Open Serial Port Error!\n");
        return -1;
    }
    if( (fcntl(nFd, F_SETFL, 0)) < 0 )
    {
        perror("Fcntl F_SETFL Error!\n");
        return -1;
    }
    if(tcgetattr(nFd, &stOld) != 0)
    {
        perror("tcgetattr error!\n");
        return -1;
    }
    stNew = stOld;
    cfmakeraw(&stNew);//设置终端以二进制处理数据
   
    cfsetispeed(&stNew, BAUDRATE);//115200
    cfsetospeed(&stNew, BAUDRATE);
    //设置数据位
    stNew.c_cflag |= (CLOCAL|CREAD);
    stNew.c_cflag &= ~CSIZE;
    stNew.c_cflag |= CS8;
    //关闭奇偶校验
    stNew.c_cflag &= ~PARENB;
    stNew.c_iflag &= ~INPCK;
    //设置1位停止位
    stNew.c_cflag &= ~CSTOPB;
    stNew.c_cc[VTIME]=0; //设置最少接收元素
    stNew.c_cc[VMIN]=1; //设置超时时间为 n*100ms  

if( tcsetattr(nFd,TCSANOW,&stNew) != 0 )
    {
        perror("tcsetattr Error!\n");
        return -1;
    }
    return nFd;
}

void send_u8(char* sendmsg)
{
    write(nFd, sendmsg, sizeof(sendmsg));
}

void receive_u8(char* receivemsg)
{
    int re_f = 0;
    re_f = read(nFd, receivemsg, sizeof(receivemsg));
    if(re_f == -1)
    {
        perror("Read Data Error!\n");
    }
}

使用前配置好波特率和串口设备号,再初始化下配置“SerialInit()”,接着就可以通过send_u8()进行发送数据和用receive_u8()接收数据了。

参考内容:https://www.xanthium.in/Serial-Port-Programming-on-Linux