调试串口模式切换

功能概述

在设计 MCU 类的产品时,除了 485/232 等对外接口外,我们通常还会在板卡内部预留一个调试串口用于控制台交互,以便排查问题。但是一旦装上产品外壳,这个调试口就不方便使用了。其实我们完全可以让控制台与 485 收帧分时复用同一个串口,这样既可以在不拆外壳的情况下使用控制台调试,又能节省一个串口外设,效果图如下:

功能演示

串口(485)默认工作在 DLT645 收帧模式,如果收到 DataId = 0xDBDBDBDB 的设置帧,则切换到控制台交互模式,在控制台中执行 console_disable 命令可以切回 DLT645 收帧模式。

实现原理

方式一

我这里控制台和 DLT645 注册的是两个不同的 485 设备,所以可以直接挂起 DLT645 处理线程,如果你使用的是同一个 485 设备,则要通过修改 rx_indicate 回调函数的方式实现,详见方式二。

控制台接管串口
void console_enable(void)
{
finsh_set_device(rt_console_get_device()->parent.name);
rt_thread_suspend(dlt645_thread); rt_schedule();
}
DLT645接管串口
void console_disable(void)
{
rt_thread_resume(dlt645_thread);
}
MSH_CMD_EXPORT_ALIAS(console_disable, console_disable, console disable.);

方式二

控制台接管串口
void console_enable(void)
{
finsh_set_device(rt_console_get_device()->parent.name);
}
DLT645接管串口
void console_disable(void)
{
rt_device_set_rx_indicate(rt_console_get_device(), rs485_recv_ind_hook);
}
MSH_CMD_EXPORT_ALIAS(console_disable, console_disable, console disable.);