精华内容
下载资源
问答
  • 串口数据包截取软件

    热门讨论 2013-05-15 09:15:54
    串口数据包截取软件
  • 合并串口数据包如何处理空包的问题,怎么按照时序对数据包重新组包,并且保证实时采样的时效性和精度?
  • 看了 分享一个自己写的串口数据分析、图形显示软件 can debugger 串口调试助手 免费,功能强大! ... 这个帖子,感觉can协议可视化串口调试很...于是就研究了下软件开源的串口数据包协议。 官网地址: http://www.la

    看了

    分享一个自己写的串口数据分析、图形显示软件 can debugger 串口调试助手 免费,功能强大!

    http://blog.csdn.net/lanmanck/article/details/50787536

    这个帖子,感觉can协议可视化串口调试很赞!前辈的软件开发肯定付出了很多辛勤的汗水。

    于是就研究了下软件开源的串口数据包协议。

    官网地址:

    http://www.labisart.com/

    下面代码移植到 arduino可以运行, 本着开源精神,需要可视化调试的同学可以拿走。

    // demo: CAN-BUS Shield, receive data
    #include <mcp_can.h>
    #include <SPI.h>
    MCP_CAN CAN0(10);                               // Set CS to pin 10
    
    /* CAN message object structure */
    typedef struct {
      uint32_t id; /* 29 bit identifier */
      //uint8_t id[4];
      uint8_t data[8]; /* Data field */
      uint8_t len; /* Length of data field in bytes */
      uint8_t ch; /* Object channel */
      uint8_t format; /* CAN_FORMAT,0 - STANDARD, 1- EXTENDED IDENTIFIER*/
      uint8_t type; /* CAN_FRAME,0 - DATA FRAME, 1 - REMOTE FRAME */
    } CAN_msg ;
    #define MSG_CH_CAN 0
    #define MSG_CH_UART 0x35
    
    
    /* Symbolic names for formats of CAN message */
    typedef enum {STANDARD_FORMAT = 0, EXTENDED_FORMAT} CAN_FORMAT;
    /* Symbolic names for type of CAN message */
    typedef enum {DATA_FRAME = 0, REMOTE_FRAME} CAN_FRAME;
    /* 把can数据包发送到uart
     * @bufsize:<=8
     */
    int uart_send_canbuf(uint32_t id, void *buf, uint8_t bufsize)
    {
      int i, idx = 2;
      uint8_t can_buf[32], temp, crc = 0, *pbuf = (uint8_t*)buf;
      /* head */
      can_buf[0] = 0xaa;
      can_buf[1] = 0xaa;
      /* ext id */
      id &= 0x3FFFFFFF;
      for (i = 0; i < 4; i++) {
        temp = (id >> (i * 8)) & 0xFF;
        if (temp == 0x55 || temp == 0xAA) {
          can_buf[idx++] = 0xa5;
        }
        can_buf[idx++] = temp;
        crc += temp;
      }
      /* crc in data[8] */
      for (i = 0; i < bufsize; i++) {
        if (pbuf[i] == 0x55 || pbuf[i] == 0xAA) {
          can_buf[idx++] = 0xa5;
        }
        can_buf[idx++] = pbuf[i];
        crc += pbuf[i];
      }
      for (; i < 8; i++) {
        can_buf[idx++] = 0;
      }
      /* len/formatpe */
      can_buf[idx++] = bufsize;
      can_buf[idx++] = MSG_CH_UART; /* ch=0 */
      can_buf[idx++] = EXTENDED_FORMAT; /*EXTENDED_FORMAT*/
      can_buf[idx++] = DATA_FRAME;
    
      /* crc more */
      for (i = 0; i < 4; i++) {
        crc += can_buf[idx - 4 + i];
      }
      can_buf[idx++] = crc;
      /* tail */
      can_buf[idx++] = 0x55;
      can_buf[idx++] = 0x55;
      /* to uart */
      i = 0;
      while (i < idx) {
        //while(UART1_GetFlagStatus(UART1_FLAG_TXE) == RESET);
        //UART1_SendData8(can_buf[i++]);
        Serial.write(can_buf[i++]);
      }
      return 0;
    }
    #define CAN_PKT_SIZE 21
    #define MAX_CAN_PARSE_BUF_LEN 32
    static uint8_t g_can_frame[MAX_CAN_PARSE_BUF_LEN];
    enum frame_sync_e {
      FS_FIND_AA1,
      FS_FIND_AA2,
      FS_FIND_DATA,
      FS_FIND_CRC, /* 未使用 */
      FS_FIND_551,
      FS_FIND_552
    };
    /* 从串口接收数据后调用本函数,并组包成can_msg */
    CAN_msg *pmsg;
    static uint8_t last_byte = 0, frame_idx = 0;
    static enum frame_sync_e sync_state = FS_FIND_AA1;
    //*
    void uart_rec_canmsg(uint8_t data) {
      uint8_t cur_byte;
      //static uint8_t last_byte = 0, frame_idx = 0;
      //static enum frame_sync_e sync_state = FS_FIND_AA1;
      // 超时复位状态机操作,可根据实际情况删除
      //if (GET_DIFF_TICK(pudat->last_tick) > 250) {
      //  sync_state = FS_FIND_AA1;
      //  frame_idx = 0;
      //}
      cur_byte = data;
    
      if (sync_state == FS_FIND_AA1) {
        if (cur_byte == 0xAA) {
          sync_state = FS_FIND_AA2;
          frame_idx = 0;
          g_can_frame[frame_idx++] = cur_byte;
        }
      } else if (sync_state == FS_FIND_AA2) {
        if (cur_byte == 0xAA) {
          sync_state = FS_FIND_DATA;
          g_can_frame[frame_idx++] = cur_byte;
        } else {
          sync_state = FS_FIND_AA1;
        }
      }// 删除插入的A5数据//zzz A5什么数据??
      else if (sync_state == FS_FIND_DATA) {
        //0x55 0xaa解析问题!!!!!!!!!!
        //CAN_msg结构内出现 55 aa就会出错。
        /*if ( (cur_byte == 0x55 || cur_byte == 0xAA) && frame_idx != (CAN_PKT_SIZE - 3))
        {
          if (last_byte == 0xa5) {
            g_can_frame[frame_idx - 1] = cur_byte;
          }
          else {
            sync_state = FS_FIND_AA1;
            frame_idx = 0;
          }
        }
        else {
          g_can_frame[frame_idx++] = 0xff;//cur_byte;//zzz test
          if (frame_idx == (CAN_PKT_SIZE - 3)) {
            sync_state = FS_FIND_CRC;
          }
        }*/
        g_can_frame[frame_idx++] = cur_byte;
        if (frame_idx == (CAN_PKT_SIZE - 3)) {
            sync_state = FS_FIND_CRC;
        }
      }// CRC不加A5
      else if (sync_state == FS_FIND_CRC) {
        g_can_frame[frame_idx++] = cur_byte;
        // check crc
        sync_state = FS_FIND_551;
      }// 尾巴
      else if (sync_state == FS_FIND_551) {
        if (cur_byte == 0x55) {
          g_can_frame[frame_idx++] = cur_byte;
          sync_state = FS_FIND_552;
        } else
          sync_state = FS_FIND_AA1;
      } else if (sync_state == FS_FIND_552) {
        sync_state = FS_FIND_AA1;
        if (cur_byte == 0x55) {
          g_can_frame[frame_idx] = cur_byte;
          pmsg = (CAN_msg*)&g_can_frame[2];
          pmsg->ch = MSG_CH_UART; //视情况自己定义
          // 存入缓冲区待使用
          //memcpy(&g_uart_dat.msg_rcv, pmsg, sizeof(CAN_msg));
          // send data:  id = 0x00, standrad flame, data len = 8, stmp: data buf
          //CAN0.sendMsgBuf(0x00, 0, 8, stmp);
            CAN0.sendMsgBuf(pmsg->id, 0, 8, pmsg->data);
          //check test
            uart_send_canbuf(pmsg->id, pmsg->data, 8);
        }
      }
      last_byte = cur_byte;
      //pudat->last_tick = get_timer_tick();
    };
    //*/
    long unsigned int rxId;
    unsigned char len = 0;
    unsigned char rxBuf[8];
    
    
    
    
    void setup()
    {
      Serial.begin(115200);
      CAN0.begin(CAN_500KBPS);                       // init can bus : baudrate = 500k
      pinMode(2, INPUT);                            // Setting pin 2 for /INT input
      Serial.println("MCP2515 Library Receive Example...");
    }
    
    void loop()
    {
      if (!digitalRead(2))                        // If pin 2 is low, read receive buffer
      {
        CAN0.readMsgBuf(&len, rxBuf);              // Read data: len = data length, buf = data byte(s)
        rxId = CAN0.getCanId();                    // Get message ID
        /* Serial.print("ID: ");
         Serial.print(rxId, HEX);
         Serial.print("  Data: ");
         for(int i = 0; i<len; i++)                // Print each byte of the data
         {
           if(rxBuf[i] < 0x10)                     // If data byte is less than 0x10, add a leading zero
           {
             Serial.print("0");
           }
           Serial.print(rxBuf[i], HEX);
           Serial.print(" ");
         }
         Serial.println();*/
    
        uart_send_canbuf(rxId, rxBuf, len);
      }
      while (Serial.available() > 0) {
        byte comchar = Serial.read();//读串口第一个字节
        uart_rec_canmsg(comchar);
      }
    }
    
    /*********************************************************************************************************
      END FILE
    *********************************************************************************************************/






    展开全文
  • 关于FPGA在解析带有数据包协议的数据存储问题。FPGA先根据数据包协议接收数据并存储到RAM,在接收到完整一包数据后,将数据从RAM转移到FIFO中,后端的数据处理或者数据转发可以直接从FIFO读取。本代码模拟数据写入...
  • TinyOS串口数据包解析

    千次阅读 2014-03-05 08:59:18
    TinyOS中的串口协议是这样规定节点和PC机通信时双方通过同步自己来交换数据,也就是节点或者PC机在每次发送数据给对方时都会先发送一个同步字节0x7e,紧跟同步字节之后的就是数据包。而数据包也有特定的格式:  1....

        TinyOS中的串口协议是这样规定节点和PC机通信时双方通过同步自己来交换数据,也就是节点或者PC机在每次发送数据给对方时都会先发送一个同步字节0x7e,紧跟同步字节之后的就是数据包。而数据包也有特定的格式:

         1. 数据包的第1个字节是数据包的类型,目前有4种类型分别是 :

          P_PACKET_NO_ACK= 69,这种类型是普通数据包不需要接收方不需要应答。
          P_PACKET_ACK= 68,这种类型的数据包要求应答,接收方在接收到数据包之后需要发送 一 个 P_ACK类型的数据包做应答。
          P_ACK= 67,这种类型的数据包作为P_PACKET_ACK类型数据包的应答包。
          P_UNKNOWN= 255,不确定消息包的类型,当收到此类型的数据包时需要接收方同种类型的数据包给发送者。

        2. 数据包的第二个字节指明了这个消息包的类型。如果是00则指明是AM类型的数据包。

        3.第3和第4个字节是目标节点的地址。

            4.第5和第6个字节是链路层源地址。

        5.第7个字节是消息长度。

        6.第8个字节是网络组号。

        7.第9个字节是AM类型。

        8.第12,、13、14、15字节是消息包的有效载荷。

           9.最后两个字节是CRC校验码。

    值得注意的是当接收到0x7e或者0x7d时需要对其进行转义,把它们和0x20进行异或。

    展开全文
  • 基于430的串口收发数据包,判断校验正确,在12864上面显示收到的数据
  • 串口发送数据包,不丢包
  • 常见的通讯接口有USART、CAN、USB、Ethernet。最常见、用的最多的就是USART,下面主要对串口通讯协议的物理层及协议层进行讲解。... 使用RS-232标准的串口设备间常见的通讯结构见图1 图1 串口通讯结...

    常见的通讯接口有USART、CAN、USB、Ethernet。最常见、用的最多的就是USART,下面主要对串口通讯协议的物理层及协议层进行讲解。

    1. 物理层

    串口通讯的物理层有很多标准及变种,主要讲解RS-232标准,RS-232标准主要规定了信号的用途、通讯接口以及信号的电平标准。

    使用RS-232标准的串口设备间常见的通讯结构见图1

    54d531b06c6b172b55c9f48e4b09a203.png

    图1 串口通讯结构图

    上面的通讯方式中,两个设备的“DB9接口”之间通过串口信号线建立起连接,串口信号线中使用“RS-232标准”传输数据信号。由于RS-232电平标准的信号不能直接被控制器识别,所以这些信号需要经过一个“电平转换芯片”转换成控制器能识别的“TTL标准”的电平信号,才能实现通讯。

    1.1 电平标准

    根据通讯使用的电平标准不同,串口通讯可以分为TTL标准及RS-232标准,见表1。

    bb4229d6e60f7ec9e46a694c41afd235.png

    表1 TTL电平标准与RS-232电平标准

    1.2 RS-232信号线

    在最初的应用中,RS-232串口标准常用于计算机、路由器与调制解调器之间的通讯。通讯信号线见图2,通讯信号线说明可以去网上搜相关资料。

    033c2fcc54d4c93d26367ec0a0b33307.png

    图2 RS-232 信号线

    2. 协议层

    串口通讯的数据包由发送端通过自身的TXD接口经串口信号线传输到接收端的RXD接口。在串口通讯的协议中,规定了数据包的内容,它由起始位、数据、校验位及停止位组成。通讯双方的数据包格式及波特率要一致才能正常收发数据。数据包组成结构图见图3。

    ee0cfc6b48c913b7965e8e97ce8006d2.png

    图3 数据包的组成结构图

    以上对串口通讯物理层及协议层做了简单介绍,下篇讲一下串口接收数据的处理方法及串口收发数据结构封装。

    展开全文
  • 代码不会在下面运行,但它应该可以帮助您解决问题 .它尝试做的是将inData拆分为Tokens []数组 .然后它使用atoi()语句将ASCII数据转换为整数 .希望能帮助到你 .bool started = false;bool ended = false;...

    代码不会在下面运行,但它应该可以帮助您解决问题 .

    它尝试做的是将inData拆分为Tokens []数组 .

    然后它使用atoi()语句将ASCII数据转换为整数 .

    希望能帮助到你 .

    bool started = false;

    bool ended = false;

    char inData[5];

    byte index;

    void setup()

    {

    Serial.begin(9600);

    }

    void loop()

    {

    while (Serial.available() > 0)

    {

    char inChar = Serial.read();

    if (inChar == '

    {

    index = 0;

    started = true;

    ended = false;

    }

    else if (inChar == '>')

    {

    ended = true;

    break;

    }

    else

    {

    inData[index] = inChar;

    index++;

    }

    if (started && ended)

    {

    // https://stackoverflow.com/questions/2227198/segmentation-fault-when-using-strtok-r

    // Splint up input data

    char *p = inData;

    char *tokens[50];

    int i = 0;

    while (i < 50) {

    tokens[i] = strtok_r(p, ",", &p);

    if (tokens[i] == NULL) {

    break;

    }

    i++;

    }

    if (tokens[0] == '

    {

    pinMode(tokens[1],OUTPUT);

    analogWrite(tokens[2],tokens[3]);

    }

    else if (token[0] == '

    {

    if (atoi(token[3]) == 1)

    {

    pinMode(atoi(token[1]),OUTPUT);

    digitalWrite(atoi(token[1]),HIGH);

    }

    else if (atoi(tokens[3]) == 0)

    {

    pinMode(atoi(tokens[1]),OUTPUT);

    digitalWrite(atoi(tokens[1]),LOW);

    }

    }

    started = false;

    ended = false;

    index = 0;

    }

    }

    展开全文
  • 通过RXTXcomm.jar控制串口接收和发送数据,本人自己写的包.
  • 网络通信数据包串口通信数据包异同: 相同点:中间数据(从0x68到检验码)是一样的 不同点:串口数据需要加0xA5开头,0xAE结尾,中间数据需要转码: 0xa5 è 0xaa 0x05。目的是避免与起始符0xa5相同 0xae è 0...
  • 通过C#实现串口通信,里面的代码展示了如何监听计算机中的串口,解析数据或者发送数据,做串口开发的可以参考
  • #5% 6021c08dc2abb6 d4ee072934b6ac ... 串口连续接收到这样格式的数据包,大小是随机的,#16%是包头,@是包尾, 怎样去掉包头和包尾,并且把每行14位数据的第3—8位在edit中显示出来,急求详解啊啊啊。。
  • 求助大佬们关于STM32串口解析数据包的程序 使用的STM32CUBE IDE自带的HAL,想要通过串口发送信息给单片机. 例如给1号单片机发送233这个数据,发送格式为:编号+数据位数+数据...
  • 我用auduino的串口向人机界面发送了16进制数据串,例如:发送【013E0088A3】人机界面马上会返回一串16进制数【013E0423322E87EFA4】,所以发送完数据后需要马上开始接收,怎么写程序能...我用auduino的串口向人机...
  • 能让电脑和Arduino直接通讯的方式当然是串口了,因为Arduino自带的IDE里面就有串口工具,而Arduino板上恰恰集成了串口的功能,因此搞起来很方便。不要小看这个串口哦,里面蕴含着无尽的编程知识,甚至学习C语言用这...
  • 在WINXP下的串口通讯数据包抓取程序

    热门讨论 2009-03-23 11:29:08
    串口收/发的数据抓取:在电脑与设备之间正常通讯时,用于抓取通讯软件发送的数据包串口设备的回传的数据包
  • //设置超时 /*****************************************配置串口***************************/ DCB dcb; GetCommState(hCom, &dcb); dcb.BaudRate = 9600; //波特率为9600 dcb.ByteSize = 8; //每个字节有8位 dcb....
  • int zhengshu; String zifu="";//全局变量void setup() {Serial.... }//串口调试void loop(){Serial.println(zifu);Serial.print("shuzi:");Serial.println(zhengshu);delay(1000);}void serialEvent(){String in...
  • 这些避免外部时钟信号的机制是: Synchronization bits 同步位 Data bits 数据位 Parity bits 奇偶校验位 Baud rate 波特率 同步位 同步位是与每个数据包传输的两个或三个特殊位。它们是起始位和停止位。正如...
  • 我是Arduino初学者,今日尝试用Arduino nano 收串口发来16进制数据,再由软串口转发给下级设备,下级设备返回16进制数据。首先简单测试代码如下:#include SoftwareSerial mySerial(2,3);void setup(){Serial.begin...
  • arm linux下实现串口进行数据包的发送与接受,并进行解码提取数据,为程序源码
  • 串口通信之数据包解析

    万次阅读 2017-09-30 09:56:06
    void Analysize_Data() { float CurrentTimeCounter = 0; while (true) { bool data_1_catched = false;//缓存记录数据是否捕获到 //int Cu...
  • Usart 串口发送数据包 两种方式(结构体,指针数组) 1.结构体指针 1.1 结构体和联合体 /* 叙述:这种直观性比较,利用联合体和结构体的形式组成数据包,通过结构体指针发送 */ typedef union{ struct { ...
  • 其次是 串口通信 ZigBee:基于IEEE802.15.4标准的低功耗局域网协议,是一种短距离、低功耗的、便宜的无线组网通讯技术 按照从简原则,先从最直接的方式入手,也就是使用usb串口通信 当前的arduino就是使用usb连接到pc...
  • ……过一段时间后,当轴运动过程结束时,下位机再返回一个数据包b给电脑,电脑通过识别是否接受到数据包b来判断轴运动是否结束。 我卡在接受数据包b这里了,读数据包b的这个时机怎么把握啊?一直读?可是这样程序会...
  • 串口->115200,8,0,1 程序 static void TransmissionT_Data(uint8_t *p_data,uint32_t size) { while(size) { LL_USART_TransmitData8(COM,*p_data); while(!LL_USART_IsActiveFlag_TXE(COM))...
  • -END-| 整理文章为传播相关技术,版权归原作者所有 || 如有侵权,请联系删除 | 往期好文合集串口通讯你真的会了吗?不妨看看这些经验干货总结:I2C总线详细要点干货总结:SPI总线详细要点 最 后 若觉得文章不错...
  • 基于串口通信,用verilog实现的数据帧格式解析示范,如PC通过串口,发一串数据包数据包格式为:头,命令,长度,参数列表... FPGA这边串口接收数据,并逐字节解析PC过来的数据包,根据解析结果,确定下一步执行...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 839
精华内容 335
关键字:

串口数据包