社区
单片机/工控
帖子详情
qt下socketcan发送和接收数据问题
JackYoung168
2016-08-13 12:24:31
qt中socketcan发送和接收数据放在一个线程下还是两个线程 目前用周立功max287操作屏开发板提供的例程,创建一个线程用select阻塞然后read读数据,然后发送数据不知道怎么处理了。是去掉select函数直接把read和write放到同一个线程下循环,还是为发送数据再创建一个线程?如果创建一个线程的话write(fd,sendbuf,&sizeof(sendbuf))怎么调用读线程里面绑定过的套接字描述字符fd?求高人指点方向!!!
...全文
1200
1
打赏
收藏
qt下socketcan发送和接收数据问题
qt中socketcan发送和接收数据放在一个线程下还是两个线程 目前用周立功max287操作屏开发板提供的例程,创建一个线程用select阻塞然后read读数据,然后发送数据不知道怎么处理了。是去掉select函数直接把read和write放到同一个线程下循环,还是为发送数据再创建一个线程?如果创建一个线程的话write(fd,sendbuf,&sizeof(sendbuf))怎么调用读线程里面绑定过的套接字描述字符fd?求高人指点方向!!!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
1 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
JackYoung168
2016-08-13
打赏
举报
回复
1
下面是测试程序 #include <stdio.h> #include <sys/ioctl.h> #include <arpa/inet.h> #include <net/if.h> #include <linux/socket.h> #include <linux/can.h> #include <linux/can/error.h> #include <linux/can/raw.h> #include <fcntl.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <time.h> #ifndef AF_CAN #define AF_CAN 29 #endif #ifndef PF_CAN #define PF_CAN AF_CAN #endif static void print_frame(struct can_frame *fr) { int i; printf("%08x\n", fr->can_id & CAN_EFF_MASK); //printf("%08x\n", fr->can_id); printf("dlc = %d\n", fr->can_dlc); printf("data = "); for (i = 0; i < fr->can_dlc; i++) printf("%02x ", fr->data[i]); printf("\n"); } #define errout(_s) fprintf(stderr, "error class: %s\n", (_s)) #define errcode(_d) fprintf(stderr, "error code: %02x\n", (_d)) static void handle_err_frame(const struct can_frame *fr) { if (fr->can_id & CAN_ERR_TX_TIMEOUT) { errout("CAN_ERR_TX_TIMEOUT"); } if (fr->can_id & CAN_ERR_LOSTARB) { errout("CAN_ERR_LOSTARB"); errcode(fr->data[0]); } if (fr->can_id & CAN_ERR_CRTL) { errout("CAN_ERR_CRTL"); errcode(fr->data[1]); } if (fr->can_id & CAN_ERR_PROT) { errout("CAN_ERR_PROT"); errcode(fr->data[2]); errcode(fr->data[3]); } if (fr->can_id & CAN_ERR_TRX) { errout("CAN_ERR_TRX"); errcode(fr->data[4]); } if (fr->can_id & CAN_ERR_ACK) { errout("CAN_ERR_ACK"); } if (fr->can_id & CAN_ERR_BUSOFF) { errout("CAN_ERR_BUSOFF"); } if (fr->can_id & CAN_ERR_BUSERROR) { errout("CAN_ERR_BUSERROR"); } if (fr->can_id & CAN_ERR_RESTARTED) { errout("CAN_ERR_RESTARTED"); } } #define myerr(str) fprintf(stderr, "%s, %s, %d: %s\n", __FILE__, __func__, __LINE__, str) static int test_can_rw(int fd, int master) { int ret, i; struct can_frame fr, frdup; struct timeval tv; fd_set rset; while (1) { tv.tv_sec = 1; tv.tv_usec = 0; FD_ZERO(&rset); FD_SET(fd, &rset); ret = select(fd+1, &rset, NULL, NULL, NULL); //阻塞 if (ret == 0) { myerr("select time out"); return -1; } ret = read(fd, &frdup, sizeof(frdup)); //读数据 if (ret < sizeof(frdup)) { myerr("read failed"); return -1; } if (frdup.can_id & CAN_ERR_FLAG) { /* 出错设备错误 */ handle_err_frame(&frdup); myerr("CAN device error"); continue; } print_frame(&frdup); ret = write(fd, &frdup, sizeof(frdup));//发送读到的数据 if (ret < 0) { myerr("write failed"); return -1; } } return 0; } /*************************************************************************************** **函数名称: main() **函数说明: **创建时间: ***************************************************************************************/ int main(int argc, char *argv[]) { int s; int ret; struct sockaddr_can addr; struct ifreq ifr; int master; /* * 创建socket can套接字 */ srand(time(NULL)); s = socket(PF_CAN, SOCK_RAW, CAN_RAW); if (s < 0) { perror("socket PF_CAN failed"); return 1; } strcpy(ifr.ifr_name, "can0"); ret = ioctl(s, SIOCGIFINDEX, &ifr); if (ret < 0) { perror("ioctl failed"); return 1; } addr.can_family = PF_CAN; addr.can_ifindex = ifr.ifr_ifindex; ret = bind(s, (struct sockaddr *)&addr, sizeof(addr)); if (ret < 0) { perror("bind failed"); return 1; } if (0) { struct can_filter filter[2]; filter[0].can_id = 0x200 | CAN_EFF_FLAG; filter[0].can_mask = 0xFFF; filter[1].can_id = 0x20F | CAN_EFF_FLAG; filter[1].can_mask = 0xFFF; ret = setsockopt(s, SOL_CAN_RAW, CAN_RAW_FILTER, &filter, sizeof(filter)); if (ret < 0) { perror("setsockopt failed"); return 1; } } test_can_rw(s, master); close(s); return 0; }
Linux+
QT
+
Socket
CAN:使用信号槽机制实现数据收发
本文介绍了如何在Linux+
QT
环境下利用
Socket
CAN库,通过信号槽机制实现CAN数据的收发。在Ubuntu16.04上,使用
QT
5.13.1,创建一个单独的线程处理CAN消息的接收,同时通过对象间的信号槽连接,简化Motor对象与CAN对象的数据交互。
Qt
Android 在平板中使用
Socket
Can
博主分享了在安卓工业平板上使用
Qt
进行
Socket
CAN通信的探索过程。首先,确认平板已内置
Socket
CAN支持,然后下载并编译
Qt
SerialBus源码,解决了编译过程中遇到的头文件缺失
问题
。虽然
Qt
官方表示不支持Android的
Socket
CAN插件,但通过编译源码,最终成功将模块集成到
Qt
中。尽管在运行时出现库加载错误,但依然能正常读写,验证了功能可行性。整个过程深化了博主对
Qt
的理解,展示了
Qt
的强大。
qt
实现
socket
CAN
本文介绍了
Qt
实现
Socket
CAN的相关内容。首先是初始化Init函数,点击“连接CAN”按键进入connectDevice函数,根据选择的接口和比特率初始化CAN,实例化canDevice。还涉及读取
发送
帧,包括从CAN总线读写数据帧,以及错误处理。创建canDevice成功后进行连接、按键使能失能、接收消息帧等操作。
A40i使用笔记:
qt
使用
socket
can
发送
/读取can总线数据(多通道)
本文详细介绍了在
Qt
5.9环境下,使用mcp2515通过SPI转CAN驱动两路CAN总线的过程,包括硬件调试、设备树配置、驱动开发以及在
Qt
中实现CAN数据的读取和
发送
。作者提供了完整的代码示例,支持标准帧和扩展帧,最高波特率可达500k,同时分享了不同晶振频率对稳定性的影响。
【CAN 应用编程】
Socket
Can实战
本文围绕CAN总线展开,先介绍其基础知识,包括协议层。接着阐述Linux系统下
Socket
CAN应用编程,如创建套接字、绑定设备、设置过滤规则、数据收发及回环功能设置。最后以正点原子I.MX6U开发板为例,进行CAN应用编程实战,包含设备测试、数据
发送
与接收。
单片机/工控
27,521
社区成员
28,799
社区内容
发帖
与我相关
我的任务
单片机/工控
硬件/嵌入开发 单片机/工控
复制链接
扫一扫
分享
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章