您尚未登录。

楼主 # 2024-01-03 10:54:30

Gentlepig
会员
注册时间: 2018-10-24
已发帖子: 1,212
积分: 1148.5

请教,socketcan接收,用哪种方案好呢?子线程不停读?用QSocketNotifier?epoll?

之前编写过一个t113-s3的qt程序,当时用到了can部分。
当时是这么实现的,将socketcan接收部分放到了一个线程里,收到数据后,通过信号将数据发送出去。没收到数据,则继续不停的接收。

现在gpt不是方便了么,问了gpt,结果给的例子是,利用QSocketNotifier:

 QSocketNotifier notifier(s, QSocketNotifier::Read);
 QObject::connect(&notifier, &QSocketNotifier::activated, &receiveCanData);

这样貌似一旦收到数据后,就会触发 QSocketNotifier::activated信号,这样,貌似就不用线程了。

群里问了网友,又给了另一个方案,用poll, epoll, select。网上搜了下,这种貌似是在c++下的处理办法。

这下晕头了,不知道该怎么搞好了。求大家给意见。

另,我好奇,socketcan是如何知道收到数据了呢?
对于单片机来说,一般是打开can接收中断。而嵌入式linux这里是怎么知道收到数据了呢?
因为不明白这里,所以我之前用子线程不停的读这种方案,觉得也很合理。
但是QSocketNotifier和poll,感觉都是知道收到数据才去处理...

----------------------------------------------------------------------------------------

看了下can驱动文件,有中断函数...

最近编辑记录 Gentlepig (2024-01-03 11:28:08)

离线

#1 2024-01-03 13:16:05

海石生风
会员
所在地: 深圳
注册时间: 2019-07-02
已发帖子: 522
积分: 643
个人网站

Re: 请教,socketcan接收,用哪种方案好呢?子线程不停读?用QSocketNotifier?epoll?

Linux应用程序不能直接响应硬件中断,那是底层驱动做的事。
poll, epoll, select都是轮询方式,要开线程来处理,比较麻烦。
软件用Qt写的话自然用QSocketNotifier最简单,不需要开线程来接收数据。其内部应该就是用的poll, epoll, select这些接口做了轮询来实现的。

离线

楼主 #2 2024-01-03 14:55:18

Gentlepig
会员
注册时间: 2018-10-24
已发帖子: 1,212
积分: 1148.5

Re: 请教,socketcan接收,用哪种方案好呢?子线程不停读?用QSocketNotifier?epoll?

带NAPI的中断轮询数据接收模式

    中断接收数据模式在数据频繁情况下,中断触发负载过大,系统性能受到影响,为此基于轮询的接收模式被开发,称为New API,即NAPI。

    NAPI仍然需要首次数据包接收中断来触发poll过程,第一次接收中断发生后,中断处理程序禁止设备的接收中断,通过poll方式读取设备的接收缓冲区后,再次使能中断。

https://www.cnblogs.com/tureno/articles/6350137.html
搜到了这个。

既然用qt,那我就尽量用QSocketNotifier吧。

---------------------------------------------------------------

发现,如果用qt5的can类的话,已经有个收到can数据这个信号了:

    connect(m_canDevice.get(), &QCanBusDevice::framesReceived,
            this, &MainWindow::processReceivedFrames);

最近编辑记录 Gentlepig (2024-01-03 15:17:25)

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn