芯查查logo
  • 数据服务
    1. 新产品
    2. 物料选型
    3. 查替代
    4. 丝印反查
    5. 查品牌
    6. PCN/PDN
    7. 查方案
    8. 查代理
    9. 数据合作
  • SaaS/方案
      SaaS产品
    1. 供应链波动监控
    2. 半导体产业链地图
    3. BOM管理
    4. 解决方案
    5. 汽车电子
    6. 政府机构
    7. 数据API
  • 商城
  • 行业资讯
    1. 资讯
    2. 直播
  • 论坛社区
    1. 论坛
    2. 学习
    3. 测评中心
    4. 活动中心
    5. 积分商城
  • 查一下
  • 开通会员
舒适的鞋子
萤火工场CEM5861G-M11+自定义解析

 

CEM5861G-M11雷达模块通过串口读写数据,上位机与模块之间的应用层协议定义如下:

 1)帧头,2字节

上位机→雷达: 0x55 0x5A 

上位机←雷达: 0x55 0xA5 

2)数据长度,2字节

采用大端序,包含: 功能码 、命令码 、数据、校验和

3)功能码,1字节 

读: 0x0 

写: 0x1 

被动上报: 0x2 

主动上报: 0x3 

4)命令码 ,2字节

命令码1 为功能分类, 命令码2 表示具体功能。

5)数据 

6)校验和,1字节 

之前所有数据按uint8_t格式相加之和的低8位。

 

默认情况下,模块上电就开始主动上报数据,按照手册,也可以通过配置,采取请求应答机制。

在树莓派4B上编写代码,使用串口读取主动上报的数据并解析。

 

解析代码如下:

 

#include <fcntl.h>

#include <termios.h>

#include <unistd.h>

#include <iostream>

#include <vector>

#include <cstdint>


 

// 定义帧头

const uint8_t FRAME_HEADER_TX[2] = {0x55, 0x5A}; // 上位机发送帧头

const uint8_t FRAME_HEADER_RX[2] = {0x55, 0xA5}; // 上位机接收帧头

 

// 打开串口

int openSerialPort(const char* portName)

{

    int fd = open(portName, O_RDWR | O_NOCTTY | O_NDELAY);

    if (fd == -1)

    {

        perror("Failed to open serial port");

        return -1;

    }

 

    struct termios options;

    tcgetattr(fd, &options);

    cfsetispeed(&options, B115200);

    cfsetospeed(&options, B115200);

    options.c_cflag &= ~PARENB; // 无奇偶校验

    options.c_cflag &= ~CSTOPB; // 1位停止位

    options.c_cflag &= ~CSIZE;

    options.c_cflag |= CS8;     // 8位数据位

    options.c_cflag |= (CLOCAL | CREAD);

    options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); // 原始模式

    options.c_iflag &= ~(IXON | IXOFF | IXANY); // 禁用流控

    options.c_oflag &= ~OPOST; // 原始输出

 

    if (tcsetattr(fd, TCSANOW, &options) != 0)

    {

        perror("Failed to condiv serial port");

        close(fd);

        return -1;

    }

    return fd;

}
 

void receiveData(int fd)

{

    char buf[128];

    int n = read(fd, buf, sizeof(buf));  

    if (buf[0] != FRAME_HEADER_RX[0] || buf[1] != FRAME_HEADER_RX[1])

    {

        return;

    }

    // 读取数据长度(大端格式)

    uint16_t length = (buf[2] << 8) | buf[3];

    printf("length: %d\n", length);

    printf("id= %d, status=%d, distance=%ucm\n", buf[7], buf[8], ((buf[9] << 8) | buf[10]));

    return;

}
 

int main()

{

    int fd = openSerialPort("/dev/ttyS0");

    if (fd == -1)

    {

        return 1;

    }
 

    while(1)

    {

        receiveData(fd);

        usleep(10000);

    }

    return 0;

}

 

运行结果如下图所示:

版块: 开发板测评 萤火工场
前4天 15:27
  • 举报
😁😂😃😄😅😆😉😊😋😌😍😏😒😓😔😖😘😚😜😝😞😠😡😢😣😤😥😨😩😪😫😭😰😱😲😳😵😷😸😹😺😻😼😽😾😿🙀🙅🙆🙇🙈🙉🙊🙋🙌🙍🙎🙏✂✅✈✉✊✋✌✏✒✔✖✨✳✴❄❇❌❎❓❔❕❗❤➕➖➗➡➰🚀🚃🚄🚅🚇🚉🚌🚏🚑🚒🚓🚕🚗🚙🚚🚢🚤🚥🚧🚨🚩🚪🚫🚬🚭🚲🚶🚹🚺🚻🚼🚽🚾🛀Ⓜ🅰🅱🅾🅿🆎🆑🆒🆓🆔🆕
@好友

全部评论

加载中
游客登录通知
已选择 0 人
自定义圈子
移动
发布帖子
发布动态
发布问答
最新帖子
【星允派 NEBULA PI】12:添加时间任务调度器【星允派 NEBULA PI】11:cube创建RTOS项目【萤火工场CEM5861G-M11】介绍、测试【星允派 NEBULA PI】10:cube实现文件系统操作【星允派 NEBULA PI】09:USB虚拟CDC与串口1
热门版块
查看更多
电子DIY
问型号
问技术
问行情
汽车电子工程师论坛
工业电子专区
新手入门指南
单片机/MCU论坛
PCB设计
开源项目

12

收藏

分享

微信扫码
分享给好友

评论