#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <net/if.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <linux/can.h>
#include <linux/can/raw.h>
#define DEBUG
#ifdef DEBUG
#define DEBUG_INFO(fmt, args...) fprintf(stderr, fmt, ##args)
#define DEBUG_ERROR(fmt, args...) fprintf(stderr, fmt"%s\t%s\t%d\n", ##args, __FILE__,__FUNCTION__,__LINE__)
#else
#define DEBUG_INFO(fmt, args...)
#define DEBUG_ERROR(fmt, args...)
#endif
#define SHMSIZE 10
#define SHMNAME "shmtest"
#define RET_SUCCESS 0
#define RET_FAILED -1
#define BUF_SIZE 512
#define DEV_CAN "can0"
#define CAN_TEST_READ 0
#define CAN_TEST_WRITE 1
#define CAN_ID 0x123
#define CAN_DATA_LEN_MAX 8
struct can_frame frame;
static int can_send(int socket, struct can_frame *pframe)
{
if (sizeof(struct can_frame) != write(socket, pframe, sizeof(struct can_frame)))
{
return RET_FAILED;
}
else
{
return RET_SUCCESS;
}
}
static int can_rcv(int socket, struct can_frame *pframe)
{
if (sizeof(struct can_frame) != read(socket, pframe, sizeof(struct can_frame)))
{
return RET_FAILED;
}
else
{
return RET_SUCCESS;
}
}
static void can_exit(int socketfd)
{
close(socketfd);
}
static int can_init(int *psocket)
{
int socked;
struct sockaddr_can can_addr;
struct ifreq ifr;
if((socked = socket(PF_CAN, SOCK_RAW, CAN_RAW)) < 0)
{
DEBUG_ERROR("open can socket error.");
return RET_FAILED;
}
memset(&ifr, 0, sizeof(ifr));
strcpy(ifr.ifr_name, DEV_CAN);
if (RET_SUCCESS != ioctl(socked, SIOCGIFINDEX, &ifr))
{
DEBUG_ERROR("ioctl SIOCGIFINDEX failed.");
close(socked);
return RET_FAILED;
}
memset(&can_addr, 0, sizeof(can_addr));
can_addr.can_family = AF_CAN;
can_addr.can_ifindex = ifr.ifr_ifindex;
if(bind(socked, (struct sockaddr *)&can_addr, sizeof(can_addr)) < 0)
{
DEBUG_ERROR("bind can socket failed.");
close(socked);
return RET_FAILED;
}
*psocket = socked;
return RET_SUCCESS;
}
static int can_test_rcv(int socked, struct can_frame *pframe)
{
int i;
int ret;
int fd;
char *ptr;
fd = shm_open(SHMNAME, O_CREAT | O_TRUNC | O_RDWR, S_IRUSR | S_IWUSR);
if (fd<0) {
perror("shm_open error");
exit(-1);
}
ftruncate(fd, SHMSIZE);
ptr = mmap(NULL, SHMSIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (ptr == MAP_FAILED) {
perror("mmap error");
exit(-1);
}
while (1)
{
ret = can_rcv(socked, pframe);
if (RET_SUCCESS == ret)
{
DEBUG_INFO("recieve can datas: can_id = 0x%x,"
"data_len = %d\n", pframe->can_id, pframe->can_dlc);
for (i = 0; i < pframe->can_dlc; i++)
{
DEBUG_INFO("data[%d] = 0x%x\n", i, pframe->data[i]);
}
*ptr = pframe->can_id & 0xff;
*ptr = pframe->can_id >>8;
*ptr = pframe->data[0];
*ptr = pframe->data[1];
*ptr = pframe->data[2];
*ptr = pframe->data[3];
*ptr = pframe->data[4];
*ptr = pframe->data[5];
*ptr = pframe->data[6];
*ptr = pframe->data[7];
}
else
{
DEBUG_ERROR("read can datas failed.\n");
}
}
ret = can_rcv(socked, pframe);
if (RET_SUCCESS == ret)
{
DEBUG_INFO("recieve can datas: can_id = 0x%x,"
"data_len = %d\n", pframe->can_id, pframe->can_dlc);
for (i = 0; i < pframe->can_dlc; i++)
{
DEBUG_INFO("data[%d] = 0x%x\n", i, pframe->data[i]);
}
}
else
{
DEBUG_ERROR("read can datas failed.\n");
}
return ret;
}
static int can_test_send(int socked, struct can_frame *pframe)
{
int i;
int ret;
pframe->can_id = CAN_ID;
pframe->can_dlc = CAN_DATA_LEN_MAX;
for (i = 0; i < CAN_DATA_LEN_MAX; i++)
{
pframe->data[i] = i;
}
ret = can_send(socked, pframe);
if (RET_SUCCESS == ret)
{
DEBUG_INFO("send can datas: can_id = 0x%x,"
"data_len = %d\n", pframe->can_id, pframe->can_dlc);
for (i = 0; i < pframe->can_dlc; i++)
{
DEBUG_INFO("data[%d] = 0x%x\n", i, pframe->data[i]);
}
}
else
{
DEBUG_ERROR("send can datas failed.\n");
}
return ret;
}
static int can_test(int test_index)
{
int i;
int socked;
int ret;
memset(&frame, 0, sizeof(frame));
ret = can_init(&socked);
if (RET_SUCCESS == ret)
{
if (CAN_TEST_READ == test_index)
{
ret = can_test_rcv(socked, &frame);
}
else if (CAN_TEST_WRITE == test_index)
{
ret = can_test_send(socked, &frame);
}
else
{
DEBUG_ERROR("invalid test item.\n");
}
can_exit(socked);
}
return ret;
}
static void print_usage(const char *filename)
{
DEBUG_INFO("Usage: %s [01]\n", filename);
DEBUG_INFO(" 0 -- test can recieve.\n"
" 1 -- test can send.\n");
}
int main(int argc, char *argv[])
{
int index;
int wr_ret;
int rd_ret;
FILE *fp;
unsigned long file_size;
char wr_buf[20] = "hello world";
char rd_buf[100];
fp = fopen( "/home/ftptest/storage.txt", "a+" );//文件追加,可读可写,文件不存在则创建
if(fp == NULL)
{
perror("open file error haha:");//只有上面的函数设置了error全局错误号,才可使用,会根据error输出对应的错误信息
return -1;
}
if (RET_SUCCESS == can_test(CAN_TEST_READ))
{
DEBUG_INFO("Test Success.\n");
}
else
{
DEBUG_INFO("Test Failed.\n");
}
for(index = 0;index<8;index++)
{
wr_buf[index]=frame.data[index] ;
}
wr_ret = fwrite( wr_buf, 8, 1, fp);
printf("wr_ret = %d\n", wr_ret);
rewind(fp);//上面的写操作,文件位置偏移量也会相应的移动,此处将文件偏移到文件开始位置,然后才能读取刚刚输入的内容
rd_ret = fread(rd_buf, sizeof(rd_buf), 1, fp);
printf("rd_ret = %d\n",rd_ret);
printf("content=%s\n", rd_buf);
fseek(fp, 0, SEEK_END);
file_size = ftell(fp);
printf("file_size = %lu\n", file_size);
fclose(fp);//关闭文件
return 0;
}
嵌入式linux CAN 应用测试代码
5星 · 超过95%的资源 需积分: 41 161 浏览量
2022-03-24
11:24:05
上传
评论
收藏 11KB RAR 举报
Elspec
- 粉丝: 1
- 资源: 3
最新资源
- 第12章spring-mvc自定义类型转换器
- 基于PHP图书管理系统实验报告.docx
- Python爬取淘宝热卖商品并可视化分析
- 5152单片机proteus仿真和源码将按键次数写入AT24C02再读出并用1602LCD显示
- SE-SSD复现过程(Det3D的安装教程)
- 基于Python的在线学习与推荐系统设计与实现(论文+源码)-kaic
- 串口通过 YMODEM 协议进行文件传输
- 蓝桥杯2024年第十五届省赛真题-前缀总分
- com.qihoo.appstore_300101305-1.apk
- tensorflow-gpu-2.7.1-cp37-cp37m-manylinux2010-x86-64.whl
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论5