CSP Use Case

18 views
Skip to first unread message

Paul McCumber

unread,
Apr 17, 2025, 5:42:02 PMApr 17
to cubesat-space-protocol
I see the client/server example where we have a client and a server and we communicate text messages back and forth. 

I am having a hard time understanding how this works with actual devices that are using the CAN Bus. 

Do I need a client?  A server?  A router?  Connectionless? 

I would like to form the payload of CAN Packets to conform to the instrument I'm trying to communicate with.  What does my topology need to be?

I have a program something like this. 

#define SERVER_ADDR 1
#define SERVER_PORT 10

#define CLIENT_ADDR 2
#define DEVICE_NAME "can0"

int main(int argc, char * argv[])
{
    csp_iface_t  * iface;
    csp_conn_t   * conn;
    csp_packet_t * packet;
    int snode, cnode, port;
    int ret;

    if (argc < 4)
    {
       printf ("arguments: server_node client_node port\n");
       return -1;
    }
    else
    {
       snode = atoi(argv[1]);
       cnode = atoi(argv[2]);
       port  = atoi(argv[2]);
    }

    printf ("snode %d\n", snode);
    printf ("cnode %d\n", cnode);
    printf ("port  %d\n",  port);
    printf ("\n");

    /* init */
    csp_init();

    /* open */
    ret = csp_can_socketcan_open_and_add_interface(DEVICE_NAME, CSP_IF_CAN_DEFAULT_NAME, cnode, 1000000, true, &iface);
    if (ret != CSP_ERR_NONE) {
        csp_print("failed to open: %d\n", ret);
        return 1;
    }
    iface->is_default = 1;

    /* connect */
    conn = csp_connect(CSP_PRIO_NORM, snode, port, 1000, CSP_O_NONE);
    if (conn == NULL) {
        csp_print("Connection failed\n");
        return 1;
    }
   
uint8_t get_payload[8] = {0x05, 0x00, 0xcd, 0x8f, 0x40, 0x00, 0x04};

    /* prepare data */
    packet = csp_buffer_get_always();
    memcpy(packet->data, get_payload, 7);
    packet->length = 7;

    /* send */
    csp_send(conn, packet);

    while (1) {

        /* Read incoming frame */
        packet = csp_read(conn, 1000);
        if (packet == NULL) {
            break;
        }

        /* We have a reply, ensure data is 0 (zero) termianted */
        const unsigned int length = (packet->length < sizeof(packet->data)) ? packet->length : (sizeof(packet->data) - 1);
        packet->data[length] = 0;
        csp_print("%s", packet->data);

        /* Each packet from csp_read must to be freed by user */
        csp_buffer_free(packet);
    }

    /* close */
    csp_buffer_free(packet);
    csp_close(conn);

    return 0;
}

Reply all
Reply to author
Forward
0 new messages