社区
单片机/工控
帖子详情
qt下socketcan发送和接收数据问题
JackYoung168
2016-08-13 12:24:31
qt中socketcan发送和接收数据放在一个线程下还是两个线程 目前用周立功max287操作屏开发板提供的例程,创建一个线程用select阻塞然后read读数据,然后发送数据不知道怎么处理了。是去掉select函数直接把read和write放到同一个线程下循环,还是为发送数据再创建一个线程?如果创建一个线程的话write(fd,sendbuf,&sizeof(sendbuf))怎么调用读线程里面绑定过的套接字描述字符fd?求高人指点方向!!!
...全文
1202
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
实现
socket
CAN
本文介绍了
Qt
实现
Socket
CAN的相关内容。首先是初始化Init函数,点击“连接CAN”按键进入connectDevice函数,根据选择的接口和比特率初始化CAN,实例化canDevice。还涉及读取
发送
帧,包括从CAN总线读写数据帧,以及错误处理。创建canDevice成功后进行连接、按键使能失能、接收消息帧等操作。
Qt
Android 在平板中使用
Socket
Can
博主分享了在安卓工业平板上使用
Qt
进行
Socket
CAN通信的探索过程。首先,确认平板已内置
Socket
CAN支持,然后下载并编译
Qt
SerialBus源码,解决了编译过程中遇到的头文件缺失
问题
。虽然
Qt
官方表示不支持Android的
Socket
CAN插件,但通过编译源码,最终成功将模块集成到
Qt
中。尽管在运行时出现库加载错误,但依然能正常读写,验证了功能可行性。整个过程深化了博主对
Qt
的理解,展示了
Qt
的强大。
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写文章