社区
单片机/工控
帖子详情
qt下socketcan发送和接收数据问题
JackYoung168
2016-08-13 12:24:31
qt中socketcan发送和接收数据放在一个线程下还是两个线程 目前用周立功max287操作屏开发板提供的例程,创建一个线程用select阻塞然后read读数据,然后发送数据不知道怎么处理了。是去掉select函数直接把read和write放到同一个线程下循环,还是为发送数据再创建一个线程?如果创建一个线程的话write(fd,sendbuf,&sizeof(sendbuf))怎么调用读线程里面绑定过的套接字描述字符fd?求高人指点方向!!!
...全文
1074
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
Can.zip
Linux下面
QT
写Can通信程序,网络上有很多例子都是互相抄的;本人因为项目原因,通过源代码
Socket
函数,写了完整的程序,含有2个案例;分享给大家; 这里主要是包含几个步骤,1:绑定
Socket
;2:cna/can1的设置,3:波特率的设置(如果
发送
和接收波特率不一致肯定不行的);4:
发送
;5:接收处理; 下面就贴出部分代码: void MyWindow::startcan(int number) { int ret = 0; //can先关闭 设置好波特率后 再开启can if(number == 0) //can0 { system("ifconfig can0 down");//先关闭 system("ip link set can0 up type can bitrate 50000 triple-sampling on");//设置波特率 system("ifconfig can0 up");//再开启 } else //can1 { system("ifconfig can1 down");//先关闭 system("ip link set can1 up type can bitrate 50000 triple-sampling on");//设置波特率 system("ifconfig can1 up");//再开启 }
socket
= ::
socket
(PF_CAN,SOCK_RAW,CAN_RAW); struct ifreq ifr; strcpy((char *)(ifr.ifr_name),number == 0 ? "can0" : "can1"); ioctl(
socket
,SIOCGIFINDEX,&ifr); addr.can_family = AF_CAN; addr.can_ifindex = ifr.ifr_ifindex; ret = bind(
socket
,(struct sockaddr*)&addr,sizeof(addr)); if (ret OpenCan(50000); ArmCan = new Thread(zyhapi,
socket
,port); ArmCan->start(); } void MyWindow::stopcan(int number) { if(ArmCan) { ArmCan->stop(); ArmCan->terminate(); ArmCan->wait(); } zyhapi->CloseCan(number); } //
发送
void MyWindow::on_sendbtn_clicked() { /* struct can_frame frame; memset(&frame,0,sizeof(struct can_frame)); std::string str=ui->edit->text().toStdString(); if(str.length() > 8) { QMessageBox::about(this,"error","length of send string must less than 8 bytes"); return; } */ struct can_frame frame; memset(&frame,0,sizeof(struct can_frame)); char buf[8]={0X20,0XFF,0X01,0X02,0X03,0X04,0XFF,0XFF}; frame.can_id = 0x00000020;//发出去的帧ID即:0X00000020 frame.can_dlc = 8;//帧数据长度 for(int i=0;i
socket,&frame,sizeof(struct can_frame),0,(struct sockaddr*)&addr,sizeof(addr)); /* struct can_frame frame; char buf[8]={0X20,0XFF,0X01,0X02,0X03,0X04,0XFF,0XFF}; frame.can_id = 0x00000020;//发出去的帧ID即:0X00000020 frame.can_dlc = 8;//帧数据长度 for(int i=0;iWriteCan(frame.can_id,frame.data,frame.can_dlc);//发数据,通过can端口-- 暂时默认 CAN0 端口 */ }
A40i使用笔记:
qt
使用
socket
can
发送
/读取can总线数据(多通道)
一、前言 芯片使用mcp2515,使用spi转can的方式,配置好linux中的设备树和驱动文件后,在can一切正常的情况下才能继续下面的工作,前期我这边也就是调试出驱动,总共调试了两路can,第一路用spi1,第二路用spi2,调试第二路有些不顺利是因为spi2默认引脚电平是1.8v,后来重画电路板加了一个电平转换芯片解决
问题
,从此就可以驱动两路can啦。此贴是我调试2路spi方式 二、环境 开发环境:window10,ubuntu16.04 目标arm环境:A40i,linux3.10,
qt
5.
Linux+
QT
+
Socket
CAN:使用信号槽机制实现数据收发
Linux+
QT
+
Socket
CAN:使用信号槽机制实现数据收发 最近在考虑采用面对对象的方式重新搭建机器人的主控程序框架,虽然之前的框架也是有这种思想在里面,但是总感觉还是有程序化编程的影子,很多地方的处理都不太理想,而且虽然之前也是一直在采用
QT
Creator作为IDE开发程序,但是实际上并没有怎么用
QT
的库,只是单纯的作为一个IDE来用,未免也是空守宝山而不入。 因此这次决定充分利用
QT
的库和信号槽机制来对程序框架进行重新构建。 0.开发环境 HOST平台: Ubuntu16.04 ARM平台:a
对
Socket
CAN的理解(3)——【
Socket
CAN
发送
数据流程】
转载请注明出处:http://blog.csdn.net/Righthek 谢谢! 对于本文,我们将从用户层使用
Socket
CAN进行数据
发送
时,数据从用户空间到底层驱动的整个通信流程,用户层使用
Socket
CAN可参考上一篇文章《对
Socket
CAN的理解(2)——【
Socket
的原理及使用】》。 当我们在用户层通过
socket
进行CAN...
linux下
QT
基于
socket
的can网络通信
附上Linux下周立功can配置文档: 1.cpp代码 Can_Control::Can_Control() { } int Can_Control::can_send() { int st
Socket
_LO, stSend_LO; struct sockaddr_can addr; //can总线的地址 同
socket
编程里面的 s...
单片机/工控
27,373
社区成员
28,771
社区内容
发帖
与我相关
我的任务
单片机/工控
硬件/嵌入开发 单片机/工控
复制链接
扫一扫
分享
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章