当前位置: 首页 > article >正文

STM32 透传简易实现的软件方法

使用STM32芯片 的串口和CAN 接口 实现互相透传的功能

static uint8_t uart_trans_semaphore = 0;//USB发送信号量
static uint8_t uart_transmission_id = 0;//透传ID
/**
 * @brief 使能uart发送
 * @param id 透传ID
 */
void uart_unvarnished_transmission_enable(uint8_t id)
{
    uart_trans_semaphore = 1;
    uart_transmission_id = id;
}
/**
 * @brief 不使能uart发送
 * @param  
 */
void uart_unvarnished_transmission_disable(void)
{
    uart_trans_semaphore = 0;
}

/**
 * @brief 获取uart发送信号量
 * @param  
 * @return 1 透传 0 不透传
 */
uint8_t uart_trans_semaphore_get(void)
{
    return uart_trans_semaphore;
}

/**
 * @brief uart发送数据
 * @param pdata 
 * @param len 
 */
void uart_send_data(uint8_t *pdata, uint16_t len)
{
	HAL_UART_Transmit_DMA(&huart1, pdata, len);
}
/**
 * @brief 发送透传数据
 * @param pdata 
 * @param len 
 */
void uart_send_transmission_data(uint8_t *pdata,uint16_t len)
{
    if(uart_trans_semaphore_get()&& len>0 )
    {
        FDCAN_Send_Data(uart_transmission_id,pdata,len);//使用CAN发送数据
    }
}

/**
 * @brief 接受透传数据发送
 * @param pdata 
 * @param len 
 */
void uart_recv_transmission_data(uint8_t *pdata,uint16_t len)
{
    if(uart_trans_semaphore_get()&& len>0)
    {
        uart_send_data(pdata,len); //使用uart发送数据
    }
}

其中 uart_send_transmission_data 函数接受串口的数据发送到can。
再创建一个任务用来 接收can收到的数据缓冲 发送到串口

/**
 * @brief 透传接受任务
 * @param argument 
 */
void user_uart_unvarnished_transmission_task(void *argument)
{
	uint8_t uart_recv_data[250];
	uint16_t data_len;
	for (;;)
	{
		if (uart_trans_semaphore_get())
		{
			data_len = Driver_Buffer_RefreshData(&USERRxDataBuffer1,uart_recv_data);
			uart_recv_transmission_data(uart_recv_data,data_len);
		}
		osDelay(5);
	}
}

其中的Driver_Buffer_RefreshData是刷新了can的接收缓冲

这样就实现了串口 和can的数据互传

参考
环形缓冲区的实现


http://www.kler.cn/a/378892.html

相关文章:

  • 云轴科技ZStack在CID大会上分享VF网卡热迁移技术
  • 《C++最新标准下字符串字面量类型的深度剖析》
  • C++ STL标准模板库
  • 数据结构 —— AVL树
  • <项目代码>YOLOv8 夜间车辆识别<目标检测>
  • 指数分布的原理和应用
  • 基于SpringBoot的“CSGO赛事管理系统”的设计与实现(源码+数据库+文档+PPT)
  • ESP8266 自定义固件烧录-Tcpsocket固件
  • java脚手架系列12-mongoDB
  • 10天进阶webpack---(1)为什么要有webpack
  • 【数据分享】2024年我国省市县三级的休闲娱乐设施数量(免费获取/18类设施/Excel/Shp格式)
  • 中文词向量质量的评估
  • 服务器开启SSH允许远程连接服务
  • Springboot 内置缓存与整合Redis作为缓存
  • 7-12 检查密码
  • LeetCode 203. 移除链表元素(java)
  • Android面试整理
  • 【热门主题】000027 React:前端框架的强大力量
  • [C++]:智能指针
  • 大数据之——Window电脑本地配置hadoop系统(100%包避坑!!方便日常测试,不用再去虚拟机那么麻烦)
  • Python画笔案例-095 绘制鼠标画笔
  • [java][基础]HTTPTomcatServlet
  • 高防服务器都有哪些类型?
  • Java 正则基础
  • 生成对抗网络(GAN)如何推动AIGC的发展
  • MacOS如何读取磁盘原始的扇区内容,恢复误删除的数据