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的数据互传
参考
环形缓冲区的实现