TI AM335x QT4.8.3 读取CANbus
TI AM335x QT4.8.3 read CANbus
短篇小说:我有运行嵌入式 linux 3.2.0 的 TI AM335x armv7l 处理器开发板。我想从 CAN 总线读取数据并将其可视化。我不知道如何开始。
长话短说:
所以我有一块来自 GOEMBED 的 TI AM335x 开发板(http://goembed.com/index.php/Products/detail/tpid/25 类似于 beaglebone black)。它使用运行 linux 3.2.0 的 armv7l 处理器。
我将一个 CAN 模块连接到开发板上。该 CAN 模块每秒向 CAN 总线发送相同的 CAN 消息。
通过在终端中输入以下命令,我可以可视化 CAN 消息。
ip link set can0 type can bitrate 500000 triple-sampling on
ip link set can0 up
candump can0
此时我可以看到 CAN 消息的 ID 和数据。
root@goembed:~# ip link set can0 type can bitrate 500000 triple-sampling on
root@goembed:~# ip link set can0 up
root@goembed:~# candump can0
can0 1FC0000F [8] F5 F8 F1 00 00 00 F2 F3
can0 1FC0000F [8] F5 F8 F1 00 00 00 F2 F3
can0 1FC0000F [8] F5 F8 F1 00 00 00 F2 F3
can0 1FC0000F [8] F5 F8 F1 00 00 00 F2 F3
can0 1FC0000F [8] F5 F8 F1 00 00 00 F2 F3
can0 1FC0000F [8] F5 F8 F1 00 00 00 F2 F3
can0 1FC0000F [8] F5 F8 F1 00 00 00 F2 F3
can0 1FC0000F [8] F5 F8 F1 00 00 00 F2 F3
现在最大的问题是,如何将这些数据导入到 qt 应用程序中?
我想将消息的数据打印到文本框中。
希望有人能给我一些关于如何开始的提示,以便我从中学习?
亲切的问候
理想情况下,您应该为您的平台构建 Qt 5.8 并使用 QtSerialBus 模块。否则,您将面临将 QtSerialBus 反向移植到 Qt 4 的无聊任务。这不会特别困难。
一旦您可以访问串行总线模块,您就可以轻松地在 CAN 数据包到达时获得实时通知,然后以您希望的任何方式显示它们。例如。您可以将它们累积在一个模型中,然后将它们显示在 QTableView
.
中
我找到了一个简单的解决方案。
因此,当我想阅读我的嵌入式系统中的所有消息时,我很容易就可以获取我的 QProcess 的响应。
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(&proc3,SIGNAL(readyRead()),this, SLOT(dataReady()));
QD << QDir::currentPath();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::dataReady()
{
while(proc3.bytesAvailable()){
QString in = proc3.readLine();
QString out;
QRegExp reg(" can([01]) ([0-9A-F]+) \[([0-9]+)\] ([0-9A-F]+) ([0-9A-F]+) ([0-9A-F]+) ([0-9A-F]+) ([0-9A-F]+) ([0-9A-F]+) ([0-9A-F]+) ([0-9A-F]+)");
if(reg.indexIn(in)>=0){
out = "from Can%1 Id:%2 amount bytes:%3 first byte:%4 second byte:%5 third byte:%6 fourth byte:%7 fifth byte:%8 sixth byte:%9 seventh byte:%10 eight byte:%11";
out = out.arg(reg.cap(1)).arg(reg.cap(2)).arg(reg.cap(3)).arg(reg.cap(4)).arg(reg.cap(5)).arg(reg.cap(6)).arg(reg.cap(7)).arg(reg.cap(8)).arg(reg.cap(9)).arg(reg.cap(10)).arg(reg.cap(11));
}else{
out = "Error:" + in;
}
ui->plainTextEdit->appendPlainText(out);
}
}
void MainWindow::on_startButton_clicked()
{
QString cmd1 = "ip";
QStringList opt1;
QD;
opt1 << "link"<< "set"<< "can0"<< "bitrate"<< "500000"<< "triple-sampling"<< "on";
proc1.start(cmd1,opt1);
QString cmd2 = "ip";
QStringList opt2;
QD;
opt2 << "link"<< "set"<< "can0"<< "up";
proc2.start(cmd2,opt2);
QString cmd3 = "candump";
QStringList opt3;
QD;
opt3 << "can0";
proc3.start(cmd3,opt3);
}
void MainWindow::on_stopButton_clicked()
{
QString cmd4 = "ip";
QStringList opt4;
QD;
opt4 << "link"<< "set"<< "can0"<< "down";
proc4.start(cmd4,opt4);
}
所以此时我可以将 ID、数据字节数和数据字节本身放入变量中。所以游戏时间可以开始了!
我希望这可以帮助其他人。如果人们知道改进,请告诉我。
亲切的问候
短篇小说:我有运行嵌入式 linux 3.2.0 的 TI AM335x armv7l 处理器开发板。我想从 CAN 总线读取数据并将其可视化。我不知道如何开始。
长话短说: 所以我有一块来自 GOEMBED 的 TI AM335x 开发板(http://goembed.com/index.php/Products/detail/tpid/25 类似于 beaglebone black)。它使用运行 linux 3.2.0 的 armv7l 处理器。
我将一个 CAN 模块连接到开发板上。该 CAN 模块每秒向 CAN 总线发送相同的 CAN 消息。
通过在终端中输入以下命令,我可以可视化 CAN 消息。
ip link set can0 type can bitrate 500000 triple-sampling on
ip link set can0 up
candump can0
此时我可以看到 CAN 消息的 ID 和数据。
root@goembed:~# ip link set can0 type can bitrate 500000 triple-sampling on
root@goembed:~# ip link set can0 up
root@goembed:~# candump can0
can0 1FC0000F [8] F5 F8 F1 00 00 00 F2 F3
can0 1FC0000F [8] F5 F8 F1 00 00 00 F2 F3
can0 1FC0000F [8] F5 F8 F1 00 00 00 F2 F3
can0 1FC0000F [8] F5 F8 F1 00 00 00 F2 F3
can0 1FC0000F [8] F5 F8 F1 00 00 00 F2 F3
can0 1FC0000F [8] F5 F8 F1 00 00 00 F2 F3
can0 1FC0000F [8] F5 F8 F1 00 00 00 F2 F3
can0 1FC0000F [8] F5 F8 F1 00 00 00 F2 F3
现在最大的问题是,如何将这些数据导入到 qt 应用程序中? 我想将消息的数据打印到文本框中。
希望有人能给我一些关于如何开始的提示,以便我从中学习?
亲切的问候
理想情况下,您应该为您的平台构建 Qt 5.8 并使用 QtSerialBus 模块。否则,您将面临将 QtSerialBus 反向移植到 Qt 4 的无聊任务。这不会特别困难。
一旦您可以访问串行总线模块,您就可以轻松地在 CAN 数据包到达时获得实时通知,然后以您希望的任何方式显示它们。例如。您可以将它们累积在一个模型中,然后将它们显示在 QTableView
.
我找到了一个简单的解决方案。 因此,当我想阅读我的嵌入式系统中的所有消息时,我很容易就可以获取我的 QProcess 的响应。
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(&proc3,SIGNAL(readyRead()),this, SLOT(dataReady()));
QD << QDir::currentPath();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::dataReady()
{
while(proc3.bytesAvailable()){
QString in = proc3.readLine();
QString out;
QRegExp reg(" can([01]) ([0-9A-F]+) \[([0-9]+)\] ([0-9A-F]+) ([0-9A-F]+) ([0-9A-F]+) ([0-9A-F]+) ([0-9A-F]+) ([0-9A-F]+) ([0-9A-F]+) ([0-9A-F]+)");
if(reg.indexIn(in)>=0){
out = "from Can%1 Id:%2 amount bytes:%3 first byte:%4 second byte:%5 third byte:%6 fourth byte:%7 fifth byte:%8 sixth byte:%9 seventh byte:%10 eight byte:%11";
out = out.arg(reg.cap(1)).arg(reg.cap(2)).arg(reg.cap(3)).arg(reg.cap(4)).arg(reg.cap(5)).arg(reg.cap(6)).arg(reg.cap(7)).arg(reg.cap(8)).arg(reg.cap(9)).arg(reg.cap(10)).arg(reg.cap(11));
}else{
out = "Error:" + in;
}
ui->plainTextEdit->appendPlainText(out);
}
}
void MainWindow::on_startButton_clicked()
{
QString cmd1 = "ip";
QStringList opt1;
QD;
opt1 << "link"<< "set"<< "can0"<< "bitrate"<< "500000"<< "triple-sampling"<< "on";
proc1.start(cmd1,opt1);
QString cmd2 = "ip";
QStringList opt2;
QD;
opt2 << "link"<< "set"<< "can0"<< "up";
proc2.start(cmd2,opt2);
QString cmd3 = "candump";
QStringList opt3;
QD;
opt3 << "can0";
proc3.start(cmd3,opt3);
}
void MainWindow::on_stopButton_clicked()
{
QString cmd4 = "ip";
QStringList opt4;
QD;
opt4 << "link"<< "set"<< "can0"<< "down";
proc4.start(cmd4,opt4);
}
所以此时我可以将 ID、数据字节数和数据字节本身放入变量中。所以游戏时间可以开始了! 我希望这可以帮助其他人。如果人们知道改进,请告诉我。 亲切的问候