Allow setting custom baudrates on serial ports (mac and linux version)
Co-authored-by: Jan-Philipp Benecke <github@bnck.me>
This commit is contained in:
@@ -14,3 +14,18 @@ const regexFilter = "^(cu|tty)\\..*"
|
|||||||
const ioctlTcgetattr = unix.TIOCGETA
|
const ioctlTcgetattr = unix.TIOCGETA
|
||||||
const ioctlTcsetattr = unix.TIOCSETA
|
const ioctlTcsetattr = unix.TIOCSETA
|
||||||
const ioctlTcflsh = unix.TIOCFLUSH
|
const ioctlTcflsh = unix.TIOCFLUSH
|
||||||
|
|
||||||
|
func setTermSettingsBaudrate(speed int, settings *unix.Termios) (error, bool) {
|
||||||
|
baudrate, ok := baudrateMap[speed]
|
||||||
|
if !ok {
|
||||||
|
return nil, true
|
||||||
|
}
|
||||||
|
settings.Ispeed = toTermiosSpeedType(baudrate)
|
||||||
|
settings.Ospeed = toTermiosSpeedType(baudrate)
|
||||||
|
return nil, false
|
||||||
|
}
|
||||||
|
|
||||||
|
func (port *unixPort) setSpecialBaudrate(speed uint32) error {
|
||||||
|
const kIOSSIOSPEED = 0x80045402
|
||||||
|
return unix.IoctlSetPointerInt(port.handle, kIOSSIOSPEED, int(speed))
|
||||||
|
}
|
||||||
|
|||||||
@@ -67,3 +67,31 @@ const ioctlTcflsh = unix.TCFLSH
|
|||||||
func toTermiosSpeedType(speed uint32) uint32 {
|
func toTermiosSpeedType(speed uint32) uint32 {
|
||||||
return speed
|
return speed
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func setTermSettingsBaudrate(speed int, settings *unix.Termios) (error, bool) {
|
||||||
|
baudrate, ok := baudrateMap[speed]
|
||||||
|
if !ok {
|
||||||
|
return nil, true
|
||||||
|
}
|
||||||
|
// revert old baudrate
|
||||||
|
for _, rate := range baudrateMap {
|
||||||
|
settings.Cflag &^= rate
|
||||||
|
}
|
||||||
|
// set new baudrate
|
||||||
|
settings.Cflag |= baudrate
|
||||||
|
settings.Ispeed = toTermiosSpeedType(baudrate)
|
||||||
|
settings.Ospeed = toTermiosSpeedType(baudrate)
|
||||||
|
return nil, false
|
||||||
|
}
|
||||||
|
|
||||||
|
func (port *unixPort) setSpecialBaudrate(speed uint32) error {
|
||||||
|
settings, err := unix.IoctlGetTermios(port.handle, unix.TCGETS2)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
settings.Cflag &^= unix.CBAUD
|
||||||
|
settings.Cflag |= unix.BOTHER
|
||||||
|
settings.Ispeed = speed
|
||||||
|
settings.Ospeed = speed
|
||||||
|
return unix.IoctlSetTermios(port.handle, unix.TCSETS2, settings)
|
||||||
|
}
|
||||||
|
|||||||
@@ -126,9 +126,6 @@ func (port *unixPort) SetMode(mode *Mode) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if err := setTermSettingsBaudrate(mode.BaudRate, settings); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err := setTermSettingsParity(mode.Parity, settings); err != nil {
|
if err := setTermSettingsParity(mode.Parity, settings); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -138,7 +135,21 @@ func (port *unixPort) SetMode(mode *Mode) error {
|
|||||||
if err := setTermSettingsStopBits(mode.StopBits, settings); err != nil {
|
if err := setTermSettingsStopBits(mode.StopBits, settings); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
return port.setTermSettings(settings)
|
requireSpecialBaudrate := false
|
||||||
|
if err, special := setTermSettingsBaudrate(mode.BaudRate, settings); err != nil {
|
||||||
|
return err
|
||||||
|
} else if special {
|
||||||
|
requireSpecialBaudrate = true
|
||||||
|
}
|
||||||
|
if err := port.setTermSettings(settings); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if requireSpecialBaudrate {
|
||||||
|
if err := port.setSpecialBaudrate(uint32(mode.BaudRate)); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (port *unixPort) SetDTR(dtr bool) error {
|
func (port *unixPort) SetDTR(dtr bool) error {
|
||||||
@@ -289,22 +300,6 @@ func nativeGetPortsList() ([]string, error) {
|
|||||||
|
|
||||||
// termios manipulation functions
|
// termios manipulation functions
|
||||||
|
|
||||||
func setTermSettingsBaudrate(speed int, settings *unix.Termios) error {
|
|
||||||
baudrate, ok := baudrateMap[speed]
|
|
||||||
if !ok {
|
|
||||||
return &PortError{code: InvalidSpeed}
|
|
||||||
}
|
|
||||||
// revert old baudrate
|
|
||||||
for _, rate := range baudrateMap {
|
|
||||||
settings.Cflag &^= rate
|
|
||||||
}
|
|
||||||
// set new baudrate
|
|
||||||
settings.Cflag |= baudrate
|
|
||||||
settings.Ispeed = toTermiosSpeedType(baudrate)
|
|
||||||
settings.Ospeed = toTermiosSpeedType(baudrate)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func setTermSettingsParity(parity Parity, settings *unix.Termios) error {
|
func setTermSettingsParity(parity Parity, settings *unix.Termios) error {
|
||||||
switch parity {
|
switch parity {
|
||||||
case NoParity:
|
case NoParity:
|
||||||
|
|||||||
Reference in New Issue
Block a user