之前编写过一个t113-s3的qt程序,当时用到了can部分。
当时是这么实现的,将socketcan接收部分放到了一个线程里,收到数据后,通过信号将数据发送出去。没收到数据,则继续不停的接收。
现在gpt不是方便了么,问了gpt,结果给的例子是,利用QSocketNotifier:
QSocketNotifier notifier(s, QSocketNotifier::Read);
QObject::connect(¬ifier, &QSocketNotifier::activated, &receiveCanData);
这样貌似一旦收到数据后,就会触发 QSocketNotifier::activated信号,这样,貌似就不用线程了。
群里问了网友,又给了另一个方案,用poll, epoll, select。网上搜了下,这种貌似是在c++下的处理办法。
这下晕头了,不知道该怎么搞好了。求大家给意见。
另,我好奇,socketcan是如何知道收到数据了呢?
对于单片机来说,一般是打开can接收中断。而嵌入式linux这里是怎么知道收到数据了呢?
因为不明白这里,所以我之前用子线程不停的读这种方案,觉得也很合理。
但是QSocketNotifier和poll,感觉都是知道收到数据才去处理...
----------------------------------------------------------------------------------------
看了下can驱动文件,有中断函数...
最近编辑记录 Gentlepig (2024-01-03 11:28:08)
离线
带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)
离线