Linux串口调试工具--minicom

Linux串口调试工具--minicom,第1张

安装完成后,请不要着急打开软件。需先进行配置。具体步骤如下:

查看串口设备及文件权限

linux下的所有 *** 作面向用户的都是文件 *** 作,在对串口 *** 作之前,我们应该先确认自己对该文件有没有读写权限。

linux下的usb串口命名为ttyUSB*,运行上面命令,可以看到有几个设备挂载。

我们这里是:

只有ttuUSB0.再用lsusb查看:

usb 004正是我们挂上去的usb转串口线缆,使用的芯片是PL2303。

但是正如上面显示,ttyUSB0这个设备是root所有的,所以,我们以普通用户身份打开minicom是没法访问该文件的。

运行sudo minicom -s便进入了minicom的配置界面,使用上下键选择Serial port setup,回车。此时光标在“change which setting”后面停留,它的上面有如下菜单:

我们只需输入上面对应的字母,就可以进如相应的菜单进行设置。设置完成,回车,光标会回到“change which setting”后面,如此重复。完成按回车返回主菜单即可。

返回主菜单后,选择“Save setup as df1”,将其保存为默认设置,然后选择 Exit退出。需退出后重新打开minicom,软件才会使用上述参数进行初始化。

注意:如果没有使用USB转串口,而是直接使用串口,那么Serial Device要配置为/dev/ttyS0。

如果上面设置顺利,打开minicom

重新给设备上电后,此时,窗口里就有信息打印出来了。

1)需使用Ctrl+a 进入设置状态

2)按z进入设置菜单

(1)O键:打开配置选项;

(2)W键:自动卷屏。当显示的内容超过一行之後,自动将後面的内容换行。这个功能在查看内核的启动信息时很有用。

(3)C键:清除屏幕的显示内容;

(4)B键:浏览minicom的历史显示;

(5)X键:退出minicom,会提示确认退出。

Ctrl + A -->O

选择"Filenames and paths"

更多的参数,参见"man minicom"的输出。

如果不加这个项,那么在minicom和pc交互的时候中键入命令超过一行时候会被截断,(这时候可以通过 <C-a>w 来开和关切换截断行功能).

这样,启动之后我们会发现显示的内容不是黑白的了。

这样,启动之后,所在minicom的输出都会在<filename>中保留一份,如果原来文件存在,则追加,不存在则创建一个。

这样,我们可以取代用 <C-a>* 发送命令的方式,将 <C-a>替换成 [Alt] 或者 [ESC] .

这里,<filename>是你的脚本文件的名字,应该指定绝对路径,否则就会在你启动minicom的路径下寻找。

Minicom是基于窗口的。要d出所需功能的窗口,可按下 Ctrl-A (以下使用C-A来表示Ctrl-A),然后再按各功能键(a-z或A-Z)。先按C-A,再按'z',将出现一个帮助窗口,提供了所有命令的简述。配置 minicom(-s 选项,或者C-A、O)时,可以改变这个转义键,不过现在我们还是用Ctrl-A吧。

这里,只给出很少的命令,更多的交互命令参见"<C-a>z"的帮助输出。

minicom -s 或启动minicom之后运行 <C-a>o 来进行配置。

C:脚本文件的存放位置: <C-a>g 运行脚本时的路径 。

D:选择脚本程序: 默认 runscript ,也可以选择 bash 脚本格式。

可以参考man手册 man runscript .交互命令中可以运行" <C-a>G "来运行脚本。

参考资料

内核工具KGDB调试环境需要为Linux 内核加上 kgdb补丁,补丁实现GDB远程调试所需要的功能,包括命令处理、陷阱处理及串口通信3个主要的部分。KGDB补丁的主要作用是在Linux 内核中添加了一个调试Stub。调试Stub是Linux 内核中的一小段代码,是运行GDB的开发机和所调试内核之间的一个媒介。GDB和调试stub之间通过GDB串行协议进行通信。GDB串行协议是-种基于消息的ASCII 码协议,包含了各种调试命令。当设置断点时,KGDB将断点的指令替换为一条 trap指令,当执行到断点时控制权就转移到调试 stub中去。此时,调试stub 的任务就是使用远程串行通信协议将当前环境传送给GDB,然后从GDB处接收命令。GDB命令告诉stub 下一步该做什么,当stub收到继续执行的命令时,将恢复程序的运行环境,把对 CPU的控制权重新交还给内核。KGDB补丁给内核添加以下3个部件:

(1 ) GDB stub

GDB stub被称为调试插桩(简称为stub),是KGDB调试器的核心。它是Linux内核中的一小段代码,用来处理主机上: GDB发来的各种请求并且在内核处于被调试状态时,控制目标机板上的处理器。

(2)修改异常处理函数

当这个异常发生时,内核将控制权交给KGDB调试器,程序进入KGDB提供的异常处理函数中。在里面,可以分析程序的各种情况。

(3)串口通信

GDB和 stub之间通过GDB串行协议进行通信。它是一种基于消息的ASCII 码协议,包含了各种调试命令。除串口外,也可以使用网卡进行通信。以设置内核断点为例说明KGDB与GDB之间的工作过程。设置断点时,KGDB修改内核代码,将断点位置的指令替换成一条异常指令(在ARM中这是一条未定义的指令)。当执行到断点时发生异常,控制权转移到stub 的异常处理函数中。此时,stub的任务就是使用GDB串行通信协议将当前环境传送给GDB,然后从GDB处接收命令,GDB命令告诉stub下一步该做什么。当stub收到继续执行的命令时,将恢复原来替换的指令、恢复程序的运行环境,把对CPU的控制权重新交还给内核。

ui

正点原子Linux开发板——Qt串口上位机实验

门牙会稍息

原创

关注

3点赞·53人阅读

前言:

最近在学习嵌入式qt开发,然后跟着教程编写了一个简单的串口上位机程序,在编写的时候还算比较顺利,但在调试的时候花了点功夫,折腾了一下午。最后还是理清了思路,解决了问题,特写此博客进行记录和总结。

串口上位机界面设计:

整个软件的界面我都是用ui来设计的,其实也可以用代码,但是想了想有好多布局相互嵌套比较麻烦。最后就使用了ui界面来设计。

ui界面设计

串口上位机程序功能设计:

然后像串口对象初始化,槽函数,一些逻辑关系都用代码来实现,头文件就只有一些变量、槽的定义。

头文件

#include "widget.h"

#include "ui_widget.h"

#include <QMessageBox>

Widget::Widget(QWidget *parent)

: QWidget(parent)

, ui(new Ui::Widget)

{

ui->setupUi(this)

//lcd屏的分辨率是1024X600

this->setFixedSize(QSize(1024, 600))

//new 一个QSerialPort对象

serialPort = new QSerialPort(this)

//通过foreach语句将windows或imx6ull可用串口识别出来,并添加至对应的下拉选择框

QStringList serialList

foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts()){

serialList += info.portName()

}

ui->comboBox->addItems(serialList)

//设置串口的信号与槽

connect(serialPort, SIGNAL(readyRead()), this, SLOT(readData()))

}

Widget::~Widget()

{

delete ui

}

void Widget::on_radioButton_clicked(bool checked)

{

//点击“打卡串口”button之后的一些串口配置 *** 作,和一些逻辑关系

if(checked){

//设置串口端

serialPort->setPortName(ui->comboBox->currentText())

//设置波特率

serialPort->setBaudRate(ui->comboBox_2->currentText().toInt())

//设置停止位

serialPort->setStopBits(QSerialPort::StopBits(ui->comboBox_4->currentText().toInt()))

//设置数据位

serialPort->setDataBits(QSerialPort::DataBits(ui->comboBox_6->currentText().toInt()))

//设置校验位

switch(ui->comboBox_5->currentIndex()){

case 0:

serialPort->setParity(QSerialPort::Parity::NoParity)

break

case 1:

serialPort->setParity(QSerialPort::Parity::EvenParity)

break

case 2:

serialPort->setParity(QSerialPort::Parity::OddParity)

break

case 3:

serialPort->setParity(QSerialPort::Parity::SpaceParity)

break

case 4:

serialPort->setParity(QSerialPort::Parity::MarkParity)

break

default:

break

}

serialPort->setFlowControl(QSerialPort::NoFlowControl)

if(!serialPort->open(QSerialPort::ReadWrite)){

QMessageBox::about(this, "串口打开错误提示", "可能被占用了")

return

}

//打开串口之后其他的选择按钮设置成不可用

ui->comboBox->setEnabled(false)

ui->comboBox_2->setEnabled(false)

ui->comboBox_4->setEnabled(false)

ui->comboBox_5->setEnabled(false)

ui->comboBox_6->setEnabled(false)

ui->radioButton->setText("关闭串口")

}

else{

serialPort->close()

ui->comboBox->setEnabled(true)

ui->comboBox_2->setEnabled(true)

ui->comboBox_4->setEnabled(true)

ui->comboBox_5->setEnabled(true)

ui->comboBox_6->setEnabled(true)

ui->radioButton->setText("打开串口")

}

}

void Widget::readData()

{

//将串口中的数据打印到textBrowser中

ui->textBrowser->insertPlainText(serialPort->readAll())

}

void Widget::on_pushButton_clicked()

{

//点击“发送”button之后,将textEdit中的内容写入串口

serialPort->write(ui->textEdit->toPlainText().toUtf8())

}

void Widget::on_pushButton_2_clicked()

{

//清屏 *** 作

ui->textEdit->clear()

ui->textBrowser->clear()

}

登录后复制

在windows端编写好程序之后,将工程文件发送到ubuntu进行qmake、make最后通过scp将ARM的可执行文件发送到开发板,接下来就是验证了

我用的是正点原子出厂的系统,所以在验证的时候需要使用到一个串口来连接到开发板执行编写好的上位机程序,所以一个串口就被占用了,正点原子教程视频就用开发板的另一个串口来进行测试

正点原子教程测试方式

因为放假回了家,我也没有带太多的东西,usb转ttl模块放在了学校。所以我在想怎么就用一个串口来完成实验。困扰我的就是唯一的一个串口必须留个上位机,然后要怎么执行开发板上的串口上位机程序?最初我想到了可以使用网络通过Xshell远程连接到开发板就可以执行,唯一的串口就拿来验证。

解决完上位机软件怎么在imx6ull上执行的问题,接下来就是验证了。验证的时候又出现了一些问题,上位机软件不像想象的那样一边发数据,一边就接收对应的数据,而出现了一些imx6ull的信息,好像还可以输入命令,感到非常奇怪。

我以为我的软件有问题,就在windows上换了一个串口软件,结果还是出现了类似的情况

最后也是在不断猜想和测试之后找到了原因,就是应因为我在给开发板上电的时候接入了串口线,然后先打开了windows上的串口,然后就使用到了串口,导致就相当于有一个串口控制imx6ull开发板,像Xshell中通过串口连接开发板一样。然后我尝试在windows的上位机软件输入命令想打开一个qt程序,最后也是成功打开证实了猜想

执行./list命令打开了蛇姐list程序(qt程序的路径是/home/root/qt_project/list)

如果想要实现实验最初windows和imx6ull两个上位机互换数据的效果的话。要先通过windows中的上位机软件输入命令来打开imx6ull的上位机软件,这样相当于windows中的上位机连接的就是imx6ull的上位机了,而不是直接控制imx6ull了,之后就可以正常收发数据了。

总结:

学了qt快半个月了,这个串口上位机算是一个比较综合的练习了,结合了ui和代码设计。加上最后的调试也是收获颇多,如果有usb-ttl模块的话验证步骤就会更简单。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8576592.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-18
下一篇 2023-04-18

发表评论

登录后才能评论

评论列表(0条)

保存