我正在实现一个软件,我通过串口读取和写入Modbus RTU协议中的数据.为此,我需要在字节串的末尾计算两个CRC字节,但我无法做到这一点.
在整个网络中搜索,我找到了两个似乎正确计算CRC的函数:
WORD CRC16 (const BYTE *nData, WORD wLength)
{
static const WORD wCRCTable[] = {
0X0000, 0XC0C1, 0XC181, 0X0140, 0XC301, 0X03C0, 0X0280, 0XC241,
0XC601, 0X06C0, 0X0780, 0XC741, 0X0500, 0XC5C1, 0XC481, 0X0440,
0XCC01, 0X0CC0, 0X0D80, 0XCD41, 0X0F00, 0XCFC1, 0XCE81, 0X0E40,
0X0A00, 0XCAC1, 0XCB81, 0X0B40, 0XC901, 0X09C0, 0X0880, 0XC841,
0XD801, 0X18C0, 0X1980, 0XD941, 0X1B00, 0XDBC1, 0XDA81, 0X1A40,
0X1E00, 0XDEC1, 0XDF81, 0X1F40, 0XDD01, 0X1DC0, 0X1C80, 0XDC41,
0X1400, 0XD4C1, 0XD581, 0X1540, 0XD701, 0X17C0, 0X1680, 0XD641,
0XD201, 0X12C0, 0X1380, 0XD341, 0X1100, 0XD1C1, 0XD081, …Run Code Online (Sandbox Code Playgroud) 正如几年前其他人已经在这里问到的那样,我希望能够在插入pendrive/datatraveler时以及在我的系统中拔掉它时(在Linux Ubuntu和嵌入式Linux中)拔掉Qt应用程序.
我在SO搜索,我注意到大多数答案不仅非常过时(例如从2010年开始),但所有解决方案都以某种方式涉及"非Qt解决方案"来解决这些问题:平台特定或外部库的使用,如udev和DBus .
我首先要知道的是,如果有一个特定的Qt解决方案,即一种方法,不需要添加外部库或平台特定代码,我怎么能使用它.优选地,它应该已经在Qt 4.8中可用.如果没有Qt解决方案,那么基于Qt的库是可以接受的.
添加:搜索结果:
我在嵌入式Linux的C++/Qt项目中工作,我们经常"决定"反对我们处理器的局限性,特别是在更新用户界面中的图形时.由于这些限制(特别是我们前一段时间甚至更糟糕的情况),我会尽可能地优化代码,如果优化成本最低的话.我正在做的一个优化是始终对我正在处理的情况使用正确的整数值:qint8,qint16和qint32取决于我需要的值有多大.
但是前段时间我在某个地方读到,在可能的情况下,我不应该尝试使用最小的整数,我应该总是更喜欢使用与处理器容量相关的整数值,也就是说,如果我的处理器是32位的,那么即使不需要这么大的整数,我也应该总是使用qint32.在第一时刻,我无法理解为什么,但这个问题的答案表明,这是因为当处理器必须使用其"默认大小整数"时,处理器的性能会更高.
好吧,我不相信.首先没有提供实际的参考来证实这样的论点:我只是无法理解为什么从32位存储器空间写入和读取比使用32位整数更慢(并且给出的解释不是很容易理解,顺便说一句.其次,当我需要将数据从一侧传输到另一侧时,例如当使用Qt的信号和插槽机制时,我的应用程序上有一些时刻.由于我将数据从一个点传输到另一个点,不应该是较小的数据总能比较大的数据有所改进吗?我的意思是发送两个字符(不是通过引用)的信号不应该更快地完成工作然后发送两个32位整数?
事实上,虽然"处理器解释"建议使用处理器的特性,但其他情况则表明相反.例如,在处理数据库时,这个和这个线程都表明在使用较小版本的整数时有一个优势(即使只是在某些情况下).
所以,毕竟,当上下文允许或不允许时,我是否应该使用小类型的int?或者,当一种方法或另一种方法更有可能给出更好或更差的结果时,是否有一个案例列表?(例如,我在使用数据库时应使用int8和int16,但在所有其他情况下我的处理器的默认类型)
并且作为最后一个问题:Qt通常具有基于int的函数实现.在这种情况下,施法操作是否会通过使用次要整数来消除任何可能的改进?
我正在开发一个C++软件,但它通过包含通信协议的共享头文件与C app进行通信.由于C比C++"更基本",我总是需要在C代码中编写头文件(所以C++也可以得到它); 否则它不适用于第二个应用程序.
问题是我需要使用范围调整器,例如C++ namespace,它在C中不存在.
在C中模拟该功能的所有选项有哪些namespace?
到目前为止我唯一可能看到的是这个SO问题,但遗憾的是答案不够明确,我当然想知道是否有其他选择.我也尝试使用structs来完成这项工作,但没有成功(至少考虑struct使用enumerator).
我想在UI上按下关闭按钮时关闭嵌入式Linux.我知道我可以打电话给system:
system("shutdown -P now");
Run Code Online (Sandbox Code Playgroud)
参考:链接
但是知道system不建议使用,我想知道C++中是否还有另一种方法可以做到这一点(如果还有一种使用Qt的特定方法,我也想知道它虽然是一般的C++方法更重要).
我有两个应用程序,一个服务器和另一个客户端,两者都是用C ++和Qt编写的,但是它们都还使用了一个C库,该库使用C套接字方法在它们之间进行套接字通信(在Linux中全部如此)。
当它们都连接并且我关闭了客户端时,当服务器尝试向它发送新消息时,它会收到SIGPIPE错误并关闭。我在Web上和SO上进行了一些研究,以了解如何为SIGPIPE创建处理程序,所以我不告诉应用程序关闭计时器,而是告诉计时器不断发送信息以使其停止。
现在我确实学习了如何简单地处理信号:创建一个接收int并在main()或global内使用signal(SIGPIPE,myMethod)的方法(注意:从SO中学到的,是的,我知道signal()已过时)。
但是问题在于,通过这种方式,我无法停止向死客户端发送信息,因为处理信号的方法要么在发送消息的类之外,要么在静态方法之外,无法访问我的服务器对象。
为了澄清,这是当前架构:
//main.cpp
void signal_callback_handler(int signum)
{
qDebug() << "Caught signal SIGPIPE" << signum << "; closing the application";
exit(EXIT_FAILURE);
}
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
app.setApplicationName("ConnEmulator");
app.setApplicationVersion("1.0.0");
app.setOrganizationName("Embrasul");
app.setOrganizationDomain("http://www.embrasul.com.br");
MainWidget window;
window.show();
/* Catch Signal Handler SIGPIPE */
signal(SIGPIPE, signal_callback_handler);
return app.exec();
}
Run Code Online (Sandbox Code Playgroud)
// MainWidget类(简体)
MainWidget::MainWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::MainWidget),
timerSendData(new QTimer(this))
{
ui->setupUi(this);
connect(timerSendData,SIGNAL(timeout()),this,SLOT(slotSendData()));
timerSendData->start();
//...
}
void MainWidget::slotSendData()
{
//Prepares data
//...
//Here the sending message is called …Run Code Online (Sandbox Code Playgroud) 我正在研究嵌入式Linux应用程序,我想使用GDB来调试它.问题是,尽管Kit配置看起来很好(调试器选项正确指向与设备的GCC相对应的GDB - 设备是Linux ARM),当我要求Qt Creator在调试模式下运行时,它会返回错误"申请表":
sh: gdbserver: not found
Run Code Online (Sandbox Code Playgroud)
这看起来很奇怪,因为我很遗憾,配置很好,Qt Creator在启动调试模式之前的任何时刻都没有报告错误.
我在网上做了一些研究,找到了使用GDB从Qt Creator中调试嵌入式Linux应用程序的确切步骤(使用断点等),最接近我得到的答案是Tobias Hunger的评论:
您需要在主板上安装ssh和gdbserver才能使其正常工作.然后你需要在Creator中设置你的主板[qt-project.org].之后,您需要使用此设备设置套件[qt-project.org].
我想,这些步骤对我来说并不清楚.
ssh我的设备上是否有这个?当然,这本手册是我的托比亚斯完成的还是我需要为此工作做些其他事情?
在我的嵌入式 Linux 应用程序中,我有一个“滴答计数”计数器,从 2014 年 1 月 1 日 00:00:00 开始计数,每 10 纳秒增加 1。
我希望能够选择“滴答计数”计数器的当前值,将其打印为系统的当前日期时间(年、月、日、小时、分钟、秒和毫秒),已经考虑了诸如闰年、二月有 28/29 天等,这使用纯 C 方法(来自 time.h 等)。
但我不知道该怎么做...现在我有以秒为单位的等效值,所以我知道自开始日期时间以来已经过去了多少秒,但不知道如何从该日期到当前日期-一切调整后的时间值,仅在 Qt 中不可用(在这种情况下,互联网并没有多大帮助,直到我能理解 cplusplus.com 等中的解释)
任何帮助表示赞赏。
我在一个项目中有一个QwtPlot,我想以一种和谐的方式配置它的颜色-例如,如果背景颜色是白色,则轴应该是黑色,等等。现在,我可以在“硬编码方式”:每次更改背景颜色(参考值)时,我都会查看该轴先前定义的颜色的数组,并在该轴上为数组设置给定的颜色。但这是“过时的”,我想采用一种更自动化的方式。
在这里寻求帮助时,Uwe告诉我使用QwtPlot::setPalette(color)它,它本身效果很好。问题是QwtPlot是一系列基于QWidget的小部件的子代,其颜色应在全局样式表文件中配置,我注意到当配置了其中一个小部件的样式表时,QwtPlot的调用无效setPalette。好像我应该在它们之间进行选择:如果我要setPalette在给定的小部件中使用至少一个调用,那么直到主小部件(在我的情况下为QMainWindow)之前,其父级都不应该配置以下样式:工作表系统。这似乎是文档的这一部分setPalette所说的:
警告:不要在使用Qt样式表结合使用此功能(源)
,但似乎只有在全局调用时才应该是这种情况setPalette。
所以我的问题是:有没有办法和谐地解决这个问题?还是我需要放弃该软件那部分的样式表系统,而只使用调色板?我试图以一种更加“本地化”的方式来制作样式表配置-试图对系统说“此样式表配置仅对此窗口小部件有效;不要将其永久保留给其子窗口小部件”,但没有成功。如果确实可行(因此我可能选择了错误的语法),我想知道。
我正在做一些关于在基于 Qt 的应用程序中处理错误的研究,在阅读了一些关于 Qt 使用断言而不是异常抛出的文章后,我想到了以下问题:
Qt 类的某些方法会在其中发生错误时使应用程序立即崩溃。例如,如果我使用 Qt 容器(例如 QList)并调用大于容器大小的成员,则软件会立即关闭:
QList<int> myList;
int itemp = myList.at(1);
//Crash!
Run Code Online (Sandbox Code Playgroud)
现在我不希望在我的应用程序中发生这种情况:如果发生这样的事件,我想处理该事件(即使只是在错误日志中记录某些内容并稍后关闭应用程序)。但是,如果 Qt 在我进行任何错误检查之前使软件崩溃,我该怎么做?并且将代码放在 try-catch 中是行不通的,因为 Qt 在发生这种情况时不会抛出任何内容(至少在未启用异常时不会抛出,这是我假装使用的)。有没有办法解决这个问题?