社区
单片机/工控
帖子详情
qt下socketcan发送和接收数据问题
JackYoung168
2016-08-13 12:24:31
qt中socketcan发送和接收数据放在一个线程下还是两个线程 目前用周立功max287操作屏开发板提供的例程,创建一个线程用select阻塞然后read读数据,然后发送数据不知道怎么处理了。是去掉select函数直接把read和write放到同一个线程下循环,还是为发送数据再创建一个线程?如果创建一个线程的话write(fd,sendbuf,&sizeof(sendbuf))怎么调用读线程里面绑定过的套接字描述字符fd?求高人指点方向!!!
...全文
1147
1
打赏
收藏
qt下socketcan发送和接收数据问题
qt中socketcan发送和接收数据放在一个线程下还是两个线程 目前用周立功max287操作屏开发板提供的例程,创建一个线程用select阻塞然后read读数据,然后发送数据不知道怎么处理了。是去掉select函数直接把read和write放到同一个线程下循环,还是为发送数据再创建一个线程?如果创建一个线程的话write(fd,sendbuf,&sizeof(sendbuf))怎么调用读线程里面绑定过的套接字描述字符fd?求高人指点方向!!!
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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; }
STM32MP135实现
Socket
Can通信【
QT
GUI可视化实战】.zip
4.
Socket
CAN通信:利用
QT
的网络功能,建立
socket
连接,
发送
和接收CAN消息。 5. 数据解析与展示:解析接收到的CAN数据,更新到GUI界面上。 6. 错误处理:设置适当的错误处理机制,确保程序的稳定性和可靠性。 总之...
socket
CAN_test.rar
本项目"
socket
CAN_test"是基于
Qt
框架创建的一个应用程序,用于驱动CAN0接口,实现数据的
发送
与接收,并通过单独的线程来保证操作的并发性。 首先,让我们深入了解
Socket
CAN。
Socket
CAN是Linux内核中的一个子系统,...
Linux
Qt
Can.zip
2:cna/can1的设置,3:波特率的设置(如果
发送
和接收波特率不一致肯定不行的);4:
发送
;5:接收处理; 下面就贴出部分代码: void MyWindow::startcan(int number) { int ret = 0; //can先关闭 设置好波特率...
基于linux的CAN通讯示例程序
在本文中,我们将深入探讨基于Linux的CAN(Controller Area Network)通信示例...通过
Socket
CAN,开发者可以利用现有的网络编程技能,快速构建CAN应用,这对于在Linux环境下的嵌入式系统设计和调试工作具有重要意义。
qt
上位机实现can通讯
2. CAN设备接入:通过
Qt
的串口通讯接口或是使用专门的CAN通讯模块(如
Socket
CAN),配置CAN接口参数,建立与CAN总线设备的物理连接。 3. 数据处理:实现数据的接收、解析、显示和
发送
功能。接收到的数据需要根据CAN...
单片机/工控
27,517
社区成员
28,798
社区内容
发帖
与我相关
我的任务
单片机/工控
硬件/嵌入开发 单片机/工控
复制链接
扫一扫
分享
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章