我正在编写一个程序,它不断地向CAN总线发送"Hello“,并通过SocketCAN从总线读取数据。我希望这两步独立。这意味着即使总线上没有数据,程序仍然会发送"Hello“。但是通常可以读取它是不可能的,因为这个函数停止程序运行并等待数据。
有没有办法使它非阻塞或只等待几毫秒的数据?
发布于 2014-01-16 08:28:11
您可以使用以下星座(这不是完整的解决方案,而是算法):
while(1) {
FD_ZERO(&rdfs);
FD_SET(s, &rdfs);
tv.tv_sec = 0;
tv.tv_usec = 10000; // microseconds
rc = select(s + 1, &rdfs, NULL, NULL, &tv);
// rc == 0 - timeout
if (!rc) {
// write your CAN frame
}
if (FD_ISSET(s, &rdfs)) {
// read CAN frames
}
}有关更多信息和如何处理返回值,请参见人选。
发布于 2014-01-16 10:47:41
另一种我发现的方法-线。只要让可以阅读线程工作,它不会停止主循环。对于Linux系统,如下所示:
#include <pthread.h>
void *thread(int cansock) {
struct can_frame rxmsg;
while (1) {
read(cansock, &rxmsg, sizeof(rxmsg));
printf("message received\n");
}
}
int main(){
// initialize CAN socket and message to send
pthread_t pth;
pthread_create(&pth, NULL, thread, cansock);
while(1){
write(cansock, &txmsg, sizeof(txmsg));
printf("message sent\n");
}
return 0;
}发布于 2016-07-12 23:16:40
请注意此解决方案:
void *thread(int cansock) {
struct can_frame rxmsg;
while (1) {
read(cansock, &rxmsg, sizeof(rxmsg));
printf("message received\n");
}
}因为如果read()开始返回一个没有块的错误,并且这是在字段中,并且没有人查看printf()的结果,那么您将进入一个繁忙的循环。
https://stackoverflow.com/questions/21135392
复制相似问题