📄 serchan.cxx
字号:
#endif
#ifdef B19200
case 19200:
baud = B19200;
break;
#endif
#ifdef B38400
case 38400:
baud = B38400;
break;
#endif
#ifdef B57600
case 57600:
baud = B57600;
break;
#endif
#ifdef B115200
case 115200:
baud = B115200;
break;
#endif
#ifdef B230400
case 230400:
baud = B230400;
break;
#endif
default:
baud = -1;
};
if (baud == -1) {
errno = EINVAL;
ConvertOSError(-1);
return FALSE;
}
// save new baud rate
baudRate = newBaudRate;
#if defined(P_FREEBSD) || defined(P_OPENBSD) || defined (P_NETBSD) || defined(P_MACOSX) || defined(P_MACOS)
// The BSD way
Termio.c_ispeed = baud;
Termio.c_ospeed = baud;
#else
// The Linux way
Termio.c_cflag &= ~CBAUD;
Termio.c_cflag |= baud;
#endif
if (os_handle < 0)
return TRUE;
// initialise the port
return ConvertOSError(TCSETATTR(os_handle, &Termio));
#endif // P_VXWORKS
}
BOOL PSerialChannel::SetDataBits(BYTE data)
{
if (data == dataBits)
return TRUE;
#if defined(P_VXWORKS) || defined (__BEOS__)
PAssertAlways(PUnimplementedFunction);
return FALSE;
#else
int flags;
switch (data) {
#ifdef CS5
case 5:
flags = CS5;
break;
#endif
#ifdef CS6
case 6:
flags = CS6;
break;
#endif
#ifdef CS7
case 7:
flags = CS7;
break;
#endif
#ifdef CS8
case 8:
case 0: // default
flags = CS8;
break;
#endif
default:
flags = -1;
break;
}
if (flags == 0) {
errno = EINVAL;
ConvertOSError(-1);
return FALSE;
}
// set the new number of data bits
dataBits = data;
Termio.c_cflag &= ~CSIZE;
Termio.c_cflag |= flags;
if (os_handle < 0)
return TRUE;
return ConvertOSError(TCSETATTR(os_handle, &Termio));
#endif // P_VXWORKS
}
BOOL PSerialChannel::SetParity(Parity parity)
{
if (parity == parityBits)
return TRUE;
#if defined(P_VXWORKS) || defined (__BEOS__)
PAssertAlways(PUnimplementedFunction);
return FALSE;
#else
int flags;
switch (parity) {
case OddParity:
flags = PARODD | PARENB;
break;
case EvenParity:
flags = PARENB;
case NoParity:
case DefaultParity:
flags = IGNPAR;
break;
case MarkParity:
case SpaceParity:
default:
flags = -1;
}
if (flags < 0) {
errno = EINVAL;
ConvertOSError(-1);
return FALSE;
}
if (os_handle < 0)
return TRUE;
// set the new parity
parityBits = parity;
Termio.c_cflag &= ~(PARENB|PARODD);
Termio.c_cflag |= flags;
return ConvertOSError(TCSETATTR(os_handle, &Termio));
#endif // P_VXWORKS
}
BOOL PSerialChannel::SetStopBits(BYTE stop)
{
if (stop == stopBits)
return TRUE;
#if defined(P_VXWORKS) || defined (__BEOS__)
PAssertAlways(PUnimplementedFunction);
return FALSE;
#else
int flags;
switch (stop) {
case 2:
flags = CSTOPB;
break;
default:
case 1:
flags = 0;
break;
}
if (flags < 0) {
errno = EINVAL;
ConvertOSError(-1);
return FALSE;
}
if (os_handle < 0)
return TRUE;
// set the new number of stop bits
stopBits = stop;
Termio.c_cflag &= ~CSTOPB;
Termio.c_cflag |= flags;
return ConvertOSError(TCSETATTR(os_handle, &Termio));
#endif // P_VXWORKS
}
DWORD PSerialChannel::GetSpeed() const
{
return baudRate;
}
BYTE PSerialChannel::GetStopBits() const
{
return stopBits;
}
BYTE PSerialChannel::GetDataBits() const
{
return dataBits;
}
PSerialChannel::Parity PSerialChannel::GetParity() const
{
return parityBits;
}
BOOL PSerialChannel::SetInputFlowControl(FlowControl)
{
return TRUE;
}
PSerialChannel::FlowControl PSerialChannel::GetInputFlowControl() const
{
return NoFlowControl;
}
BOOL PSerialChannel::SetOutputFlowControl(FlowControl)
{
return TRUE;
}
PSerialChannel::FlowControl PSerialChannel::GetOutputFlowControl() const
{
return NoFlowControl;
}
void PSerialChannel::SetDTR(BOOL mode)
{
#if defined(P_VXWORKS) || defined (__BEOS__)
PAssertAlways(PUnimplementedFunction);
#else
int flags = 0;
ioctl(os_handle,TIOCMGET,&flags); // get the bits
flags &= ~TIOCM_DTR;
if ( mode == TRUE )
flags |= TIOCM_DTR;
ioctl(os_handle,TIOCMSET,&flags); // set back
/*
ALTERNATE IMPLEMENTATION?
Uses "Local Mode" bits?
if ( mode TRUE )
ioctl(os_handle, TIOCSDTR, 0);
else
ioctl(os_handle, TIOCCDTR, 0);
*/
#endif // P_VXWORKS
}
void PSerialChannel::SetRTS(BOOL mode)
{
#if defined(P_VXWORKS) || defined (__BEOS__)
PAssertAlways(PUnimplementedFunction);
#else
int flags = 0;
ioctl(os_handle,TIOCMGET,&flags); // get the bits
flags &= ~TIOCM_RTS;
if ( mode == TRUE )
flags |= TIOCM_RTS;
ioctl(os_handle,TIOCMSET,&flags); // set back
#endif // P_VXWORKS
}
void PSerialChannel::SetBreak(BOOL mode)
{
#if defined(P_VXWORKS) || defined (__BEOS__)
PAssertAlways(PUnimplementedFunction);
#else
if (mode)
ioctl(os_handle, TIOCSBRK, 0);
else
ioctl(os_handle, TIOCCBRK, 0);
#endif // P_VXWORKS
}
BOOL PSerialChannel::GetCTS()
{
#if defined(P_VXWORKS) || defined (__BEOS__)
PAssertAlways(PUnimplementedFunction);
return FALSE;
#else
int flags = 0;
ioctl(os_handle,TIOCMGET,&flags); // get the bits
return (flags&TIOCM_CTS)?TRUE:FALSE;
#endif // P_VXWORKS
}
BOOL PSerialChannel::GetDSR()
{
#if defined(P_VXWORKS) || defined (__BEOS__)
PAssertAlways(PUnimplementedFunction);
return FALSE;
#else
int flags = 0;
ioctl(os_handle,TIOCMGET,&flags); // get the bits
return (flags&TIOCM_DSR)?TRUE:FALSE;
#endif // P_VXWORKS
}
BOOL PSerialChannel::GetDCD()
{
#if defined(P_VXWORKS) || defined (__BEOS__)
PAssertAlways(PUnimplementedFunction);
return FALSE;
#else
int flags = 0;
ioctl(os_handle,TIOCMGET,&flags); // get the bits
return (flags&TIOCM_CD)?TRUE:FALSE;
#endif // P_VXWORKS
}
BOOL PSerialChannel::GetRing()
{
#if defined(P_VXWORKS) || defined (__BEOS__)
PAssertAlways(PUnimplementedFunction);
return FALSE;
#else
int flags = 0;
ioctl(os_handle,TIOCMGET,&flags); // get the bits
return (flags&TIOCM_RNG)?TRUE:FALSE;
#endif // P_VXWORKS
}
PStringList PSerialChannel::GetPortNames()
{
PStringList ports;
char * env = getenv(PORTLISTENV);
if (env != NULL) {
PString str(env);
PStringArray tokens = str.Tokenise(" ,\t", FALSE);
PINDEX i;
for (i = 0; i < tokens.GetSize(); i++)
ports.AppendString(tokens[i]);
} else {
#if defined(__sun) && defined (__sparc)
ports.AppendString(PString("ttya"));
ports.AppendString(PString("ttyb"));
#else
ports.AppendString(PString("ttyS0"));
ports.AppendString(PString("ttyS1"));
ports.AppendString(PString("ttyS2"));
ports.AppendString(PString("ttyS3"));
#endif
}
return ports;
}
// End of File ///////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -