一、对DEMO - qtcandemo进行修改
例程qtcandemo,采用了两个线程:主程序线程、和CAN信号读取线程。存在的问题是:打开界面,点击运行“Bus on”之后,再点击“Bus off”时,程序经常卡死。
需要对canreader.cpp中的exec()进行修改。
//原程序:
while (is_running) {
do {
status = canReadWait(handle, &msg.id, &msg.data, &msg.dlc, &msg.flag, &msg.time, timeout);
if (status == canOK) {
emit gotRx(msg);
}
} while (status == canOK);
}
//修改为:
while (is_running) {
status = canReadWait(handle, &msg.id, &msg.data, &msg.dlc, &msg.flag, &msg.time, timeout);
if (status == canOK) {
emit gotRx(msg);
}
else{
break;
}
}
二、基于对DEMO - qtcandemo的修改,增添新的功能
例程中使用的线程如下:
主线程(负责更新UI界面)
rx_thread线程(负责读取CAN报文)
由于例程仅仅是读取CAN的原始报文,并没有对报文进行解析,不方便对数据进行实时观测,所以我们需要在例程的基础上增加如下内容:
dbc_thread线程(负责解析原始CAN报文)。
rx_thread线程,通过信号CanMessage(原始报文)与dbc_thread线程中槽函数translatedRawMsg连接;实现对原始报文的翻译。
dbc_thread线程,通过信号与主线程中的槽函数连接,实现数据的显示。
dbc_thread线程的实现,参见下一遍博客。