嵌入式系统透传设计与实现

1.缘起

某个嵌入式系统原本通过485端口与外界交互。试验时因为要远距离部署,同事打算用232-wifi模块与系统的第二串口连接。希望能通过 wifi<->232与系统交互。系统已经实现了一些基本的命令行解析功能。现在期望能够在 wifi模块自动透传的TCP服务器访问这台设备。另外,485串口功能尽量仍然保留。

2.设计

console现在位于485串口。现在先考虑双向透传是否可能:485一侧,没有问题。232一侧,只要把232Rx也与命令解析器挂接即可。

输出呢?传递两份?相当于两个键盘,两个显示器一样。显示器显示内容相同。但是注意,我们可能需要维护wifi模块,此时,wifi模块会主动回显信息。然后所有的控制台指令,不再发往设备的命令行解释器,而是发往wifi模块。但是需要退出。。。

转发给 wifi模块的命令,无论是485发出的,还是232发出的。需要经过一个过滤器,识别到退出指令就要转向设备的命令解释器。

对于wifi模块,它有两路通道。232- wifi;

对于设备它也有两路通道485-232.

485-232彼此透传。

485 tx ->232.rx

485 rx <-232.tx

  • 485 rx(getch) -> 232 tx(putch)
  •                       -> 485(loop)
  • 232 rx(getch) -> 485(loop)
  • 485 tx(putch) -> 232 tx(putch)

总感觉逻辑有漏洞。这个转发逻辑稍有不慎,就会产生回声,会有字符不断在这个转发逻辑中震荡。该怎么处理这个逻辑呢?

原则:当你发现在构建相关的逻辑时,非常难以理清逻辑关系时,就搭建更多的函数接口,甚至参数,中间变量。看看这个实现:

void on_485_getch(unsigned char c, bool isDuplicated)
{
    if(!isDuplicated) putch_by232(c, true);
}

void on_485_putch(unsigned char c, bool isDuplicated)
{
    if(!isDuplicated) putch_by232(c, true); //this is 
}

void on_232_getch(unsigned char c, bool isDuplicated)
{
    if(!isDuplicated) pushTo485RecvQueue(c, true);
}

void on_232_putch(unsigned char c, bool isDuplicated)
{
    if(!isDuplicated) putch_by485(c, true);
}

3.结论

成功。目前的实现,232通过wifi模块可以操控设备。也可以收到设备原本绑定至485的stdout数据。

你可能感兴趣的:(嵌入式系统设计,笔记)