socketcan的测试例程

使用的是autoware源码中的socketcan程序驱动

  • 发送例程
#include <socketcan/socket_can_receiver.hpp>
#include <socketcan/socket_can_sender.hpp>

#include <chrono>
#include <memory>
#include<iostream>
using autoware::drivers::socketcan::SocketCanReceiver;
using autoware::drivers::socketcan::SocketCanSender;

using autoware::drivers::socketcan::CanId;
using autoware::drivers::socketcan::StandardFrame;
using autoware::drivers::socketcan::ExtendedFrame;
using autoware::drivers::socketcan::FrameType;

std::chrono::milliseconds send_timeout_{1LL};
CanId send_id{0x123};
int main(int argc,char*argv[])
{
//shilihua sender can0
SocketCanSender socket_s("can0",send_id);
//fasongshuju
union data{
    char ch[8];
    uint64_t total;
};
union data to_send;
to_send.ch[0] = 0x41;
to_send.ch[1] = 0x42;
to_send.ch[2] = 0x43;
to_send.ch[3] = 0x44;
to_send.ch[4] = 0x45;
to_send.ch[5] = 0x46;
to_send.ch[6] = 0x47;
to_send.ch[7] = 0x48;
//uint64_t send_data = 0x5A'5A'5A'5A'U;

//fasong
socket_s.send(&to_send.total,sizeof(to_send),send_id,send_timeout_);

//xianshifasong
printf("send data : ");
for(int i =0; i <8;++i)
printf(" 0x%x",to_send.ch[i]);
std::cout<<std::endl;

return 0;
}

输出结果:

send data :  0x41 0x42 0x43 0x44 0x45 0x46 0x47 0x48
  • 接收例程
#include <socketcan/socket_can_receiver.hpp>
#include <socketcan/socket_can_sender.hpp>

#include <chrono>
#include <memory>
#include<iostream>
using drivers::socketcan::SocketCanReceiver;
using drivers::socketcan::SocketCanSender;

using drivers::socketcan::CanId;
using drivers::socketcan::StandardFrame;
using drivers::socketcan::ExtendedFrame;
using drivers::socketcan::FrameType;

std::chrono::milliseconds receive_timeout_{10LL};
CanId send_id{0x123};
CanId canid_recv;
int main(int argc,char*argv[])
{
//shilihua receiver can0
SocketCanReceiver socket_r("can0");

//jieshoushuju
uint64_t recv_data;

//shujudayin
union data{
    unsigned char ch[8];
    uint64_t total;
};
union data recv;

canid_recv = socket_r.receive(recv_data,receive_timeout_);

recv.total = recv_data;

printf("canid_recv id : 0x%x ,length : %d \n",canid_recv.get(),canid_recv.length());

printf("receive data : ");
for(int i =0; i <8;++i)
printf(" 0x%x",recv.ch[i]);
//std::cout<<" "<< recv.ch[i];
std::cout<<std::endl;

return 0;
}

输出结果:

canid_recv id : 0x123 ,length : 8 
receive data :  0x41 0x42 0x43 0x44 0x45 0x46 0x47 0x48
  • cmakelists.txt
cmake_minimum_required(VERSION 3.5)
project(socketcan)
# Default to C99
if(NOT CMAKE_C_STANDARD)
  set(CMAKE_C_STANDARD 99)
endif()

# Default to C++14
if(NOT CMAKE_CXX_STANDARD)
  set(CMAKE_CXX_STANDARD 14)
endif()

if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  add_compile_options(-Wall -Wextra -Wpedantic)
endif()
# find dependencies
#find_package(autoware_auto_cmake REQUIRED)
find_package(ament_cmake_auto REQUIRED)
#ament_auto_find_build_dependencies()

ament_auto_add_library(${PROJECT_NAME}
  src/socket_can_common.hpp
  src/socket_can_common.cpp
  src/socket_can_id.cpp
  src/socket_can_receiver.cpp
  src/socket_can_sender.cpp)
#autoware_set_compile_options(${PROJECT_NAME})
add_executable(socketcan_send test/socketcan_send.cpp)
target_link_libraries(socketcan_send ${PROJECT_NAME})
#
add_executable(socketcan_recv test/socketcan_recv.cpp)
target_link_libraries(socketcan_recv ${PROJECT_NAME})

ament_auto_package()
  • packages.xml 使用的源码中test里的xml文件
<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
  <name>socketcan</name>
  <version>0.0.2</version>
  <description>Simple wrapper around SocketCAN</description>
  <maintainer email="opensource@apex.ai">Apex.AI, Inc.</maintainer>
  <license>Apache License 2.0</license>

  <buildtool_depend>ament_cmake_auto</buildtool_depend>
  <buildtool_depend>autoware_auto_cmake</buildtool_depend>

  <build_depend>ament_cmake_gtest</build_depend>

  <test_depend>ament_lint_auto</test_depend>
  <test_depend>ament_lint_common</test_depend>
  <test_depend>ament_cmake_pclint</test_depend>

  <export>
    <build_type>ament_cmake</build_type>
  </export>
</package>
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言是一种非常常用的编程语言,其在网络编程方面也有很多应用。其中,socket编程是其中之一的重要技术。下面是一个简单的C语言socket网络编程的例程。 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/socket.h> #define PORT 8080 #define MAX_BUFFER_SIZE 1024 int main() { int server_fd, new_socket, valread; struct sockaddr_in address; int addrlen = sizeof(address); char buffer[MAX_BUFFER_SIZE] = {0}; char *response = "Hello from server"; // 创建socket if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) { perror("Failed to create socket"); exit(EXIT_FAILURE); } address.sin_family = AF_INET; address.sin_addr.s_addr = INADDR_ANY; address.sin_port = htons(PORT); // 绑定地址和端口 if (bind(server_fd, (struct sockaddr *)&address, sizeof(address))<0) { perror("Failed to bind"); exit(EXIT_FAILURE); } // 监听端口 if (listen(server_fd, 3) < 0) { perror("Failed to listen"); exit(EXIT_FAILURE); } // 接受客户端请求 if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen))<0) { perror("Failed to accept"); exit(EXIT_FAILURE); } // 读取客户端发来的消息 valread = read(new_socket, buffer, MAX_BUFFER_SIZE); printf("Received message: %s\n", buffer); // 返回消息给客户端 send(new_socket, response, strlen(response), 0); printf("Message sent\n"); // 关闭socket close(new_socket); close(server_fd); return 0; } 这个例程实现了一个简单的TCP服务器。它首先创建一个socket并绑定地址和端口。然后通过监听端口等待客户端连接,在接受到客户端的连接请求后,它会读取客户端发来的消息,并将一个固定的响应消息发回给客户端。最后关闭socket。 需要注意的是,这只是一个简单的例程,还有很多网络编程相关细节和错误处理没有包括在内。在实际应用中,可能还需要加入更多的逻辑和功能来满足具体需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值