目前,我正在将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提到了其他答案,由于要移植应用程序的硬件,这根本不是一个选择。
如果可能的话,我想实现一个更简单的解决方案,并保留应用程序当前正在使用的结构-尝试使所有内容相互兼容。
有没有办法做到这一点?
还是我坚持重写应用程序的全部内容?
最佳答案
根据您的应用程序的复杂程度,我看到两种可能的解决方案:
如注释中提到的P__J__,将Win32调用替换为等效的POSIX调用。如果这样做,等效调用将可能遵循以下内容:GetCommState
:tcgetattr
SetCommState
:tcsetattr
Get/SetCommTimeouts
:您仍然可以使用tcsetattr
进行设置,修改c_cc[VTIME]
中的struct termios
条目Set/GetCommMask
:不幸的是,POSIX API没有此功能的等效项。如果需要注意控制信号(CTS,DSR,RING),则需要循环读取线路状态。如果您只关心读取返回的字节,则无需担心。WaitCommEvent
:POSIX上的等效项是select
(旧样式)或poll
(更现代)。与上面的CommMask相似,select/poll
将在有待读取的数据时返回,而不是在控制线更改时返回。
如果您不想自己解决跨平台问题,则有几个库(用C语言编写)具有跨平台功能。快速清单:
CSerial(注意:这是我的图书馆,因此我对此有偏见)
libserialport
..就是我所知道的一切。我知道的所有其他库都适用于C ++。
关于c - 将Win32串行(RS232)通信移植到POSIX,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53865939/