框图:

 

image

通信媒介:UART,USB。

 

1.如何发送?

答:使用libusb。同步:libusb_interrupt_transfer(中断)libusb_bulk_transfer(批量) 异步:分配传输 (transfer = libusb_alloc_transfer(0);)填充传输(libusb_fill_interrupt_transfer,包括有回调)提交(libusb_submit_transfer),在循环中检测是否有事件发送,如果有,就执行,然后退出,或者超时退出。再取消传输。

2.发送的数据,由CMD,然后protocol,组包,完成组包,{  1. 发送指令,2.等待回收  3.返回结构},一发一收单线程模式。

 

 

通信模块之以USB为例:

typedef struct __attribute__((packed)) MsgHeader {
    uint8_t head[4];
    uint8_t addr[16];
    uint8_t password[16];
    uint8_t cmd;
    uint8_t size;
} MsgHeader;


while
{
      usb_event_handler();   //处理收发
      protocol_handler();   //协议处理 
      app_evnet();  
                  
} 

//如何解析数据包,先CRC校验一下
switch(Flag)
{
    case(1):       //解析指令
    cmd =   (Msg*)rec_buf)-->cmd;
    size  =   (Msg*)rec_buf)-->size;
    flag = 2;
    break;
    case(2):
    memset(data,0,sizeof(data));
    memcpy(data, rec_buf + sizeof(MsgHeader),size);
}

 

 

 

发送数据时候会主动设置标志位,在usb_event_handler检测到,就会把send_buff的数据发回去。