[英]Porting Win32 serial (RS232) comms to POSIX
目前,我正在将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;
在搜索时,我遇到了该链接,其中提到termios.h和sys / select.h,但是这些标头的结构与我的喜好相差太大。 使用Wine提到了其他答案,由于要移植应用程序的硬件,这根本不是一个选择。
如果可能的话,我想实现一个更简单的解决方案,并保留应用程序当前正在使用的结构-尝试使所有内容相互兼容。
有没有办法做到这一点?
还是我坚持重写应用程序的全部部分?
根据您的应用程序的复杂程度,我看到两种可能的解决方案:
GetCommState
: tcgetattr
SetCommState
: tcsetattr
Get/SetCommTimeouts
:您仍然可以使用tcsetattr
设置,修改struct termios
的c_cc[VTIME]
条目
Set/GetCommMask
:不幸的是,POSIX API没有与此功能等效的功能。 如果需要注意控制信号(CTS,DSR,RING),则需要循环读取线路状态。 如果您只关心读取返回的字节,则无需担心。
WaitCommEvent
:POSIX上的等效项是select
(旧样式)或poll
(更现代)。 与上面的CommMask类似, select/poll
将在有要读取的数据时返回,而不是在控制线更改时返回。
如果您不想自己解决跨平台问题,则有几个库(用C语言编写)具有跨平台功能。 快速清单:
..就是我所知道的一切。 我知道的所有其他库都适用于C ++。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.