【发布时间】:2019-05-20 19:31:37
【问题描述】:
目前我正在将 Win32 应用程序移植到 POSIX。该软件本身已有几十年的历史,用于更新专有机器。
虽然大多数函数相对容易用简单的宏和一些调用 POSIX 函数的较小函数替换,但事实证明与 RS232 通信相关的函数很困难。
应用程序使用这些函数通过 RS232 进行通信:
BOOL GetCommState(HANDLE comPort, DCB* dataControlBlock);
BOOL SetCommState(HANDLE comPort, DCB* dataControlBlock);
BOOL GetCommTimeouts(HANDLE comPort, LPCOMMTIMEOUTS comTimeouts);
BOOL SetCommTimeouts(HANDLE comPort, LPCOMMTIMEOUTS comTimeouts);
BOOL SetCommMask(HANDLE comPort, DWORD eventMask);
BOOL GetCommMask(HANDLE comPort, LPDWORD eventMask);
BOOL WaitCommEvent(HANDLE comPort, LPDWORD eventMask, LPOVERLAPPED overlapped);
连同以下结构:
typedef struct _DCB { /*...*/ } DCB, *LPDCB;
typedef struct _COMMTIMEOUTS { /*...*/ } COMMTIMEOUTS, *LPCOMMTIMEOUTS;
在搜索时,我遇到了this 链接,其中提到了 termios.h 和 sys/select.h,但这些标头的结构与我的喜好相差太大。使用 Wine 提到的其他答案,由于应用程序被移植到的硬件,这根本不是一个选项。
如果可能,我想实现一个更简单的解决方案并保留应用程序当前正在使用的结构 - 试图保持一切交叉兼容。
有没有办法做到这一点?
还是我坚持重写应用程序的粗略部分?
【问题讨论】:
-
Linux中的RS232已经在文件系统中实现了。你要归档什么?
-
我希望使用应用程序中已经提供的结构,所以我不必重新编写太多的应用程序。本质上,我需要使用 RS232 将(原始)数据发送到专有 ECU 以更新其固件。最初用于运行软件的硬件已不再生产,因此我们/我需要将其移植到不同的硬件上。
-
考虑使用
boost::asio。它适用于 Windows 和 Linux。但在开始之前,请检查您是否可以为您的目标机器构建boost。一般来说这是可能的——我们甚至在ARMv5处理器上运行boost。 -
RS232 to send (raw) data to a proprierary ECU有什么问题? -
@P__J__ 问题是,该应用程序是为 Win32 编写的。手头的问题是,是否有办法在 POSIX 机器上保持 Win32 结构,以便应用程序可以保持不变。本质上,如果有一种简单的方法可以在 Win32 和 POSIX 系统调用之间创建接口。我已经检查了 GtkTerm,但这也没有多大帮助。
标签: c winapi serial-port posix porting