From 6996814437efb94368aac8db4d5344d59ccb7b7e Mon Sep 17 00:00:00 2001 From: Oskari Timperi Date: Mon, 10 Apr 2017 14:35:15 +0300 Subject: Support serial port on OS X --- pcserialport.c | 102 ++++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 86 insertions(+), 16 deletions(-) diff --git a/pcserialport.c b/pcserialport.c index 2b44add..d9cd0f8 100644 --- a/pcserialport.c +++ b/pcserialport.c @@ -14,7 +14,7 @@ #include "pcserialport.h" #include "simplemotion_private.h" //needed for timeout variable -#ifdef __unix__ +#if defined(__unix__) || defined(__APPLE__) #include #include @@ -25,59 +25,129 @@ #include #include +#if defined(__APPLE__) +#include +#include +#include +#include +#include +#endif + smint32 serialPortOpen(const char * port_device_name, smint32 baudrate_bps) { int port_handle; int err; int baudrateEnumValue; struct termios new_port_settings; + bool customBaudRate = false; + + port_handle = open(port_device_name, O_RDWR | O_NOCTTY); + + if(port_handle==-1) + { + smDebug(-1, Low, "Serial port error: port open failed"); + return(port_handle); + } switch(baudrate_bps) { +#if defined(B9600) case 9600 : baudrateEnumValue = B9600; break; +#endif +#if defined(B19200) case 19200 : baudrateEnumValue = B19200; break; +#endif +#if defined(B38400) case 38400 : baudrateEnumValue = B38400; break; +#endif +#if defined(B57600) case 57600 : baudrateEnumValue = B57600; break; +#endif +#if defined(B115200) case 115200 : baudrateEnumValue = B115200; break; +#endif +#if defined(B230400) case 230400 : baudrateEnumValue = B230400; break; +#endif +#if defined(B460800) case 460800 : baudrateEnumValue = B460800; break; +#endif +#if defined(B500000) case 500000 : baudrateEnumValue = B500000; break; +#endif +#if defined(B576000) case 576000 : baudrateEnumValue = B576000; break; +#endif +#if defined(B921600) case 921600 : baudrateEnumValue = B921600; break; +#endif +#if defined(B1000000) case 1000000 : baudrateEnumValue = B1000000; break; +#endif +#if defined(B1152000) case 1115200 : baudrateEnumValue = B1152000; break; +#endif +#if defined(B1500000) case 1500000 : baudrateEnumValue = B1500000; break; +#endif +#if defined(B2000000) case 2000000 : baudrateEnumValue = B2000000; break; +#endif +#if defined(B2500000) case 2500000 : baudrateEnumValue = B2500000; break; +#endif +#if defined(B3000000) case 3000000 : baudrateEnumValue = B3000000; break; +#endif +#if defined(B3500000) case 3500000 : baudrateEnumValue = B3500000; break; +#endif +#if defined(B4000000) case 4000000 : baudrateEnumValue = B4000000; break; - default : smDebug(-1,Low,"Serial port error: unsupported baudrate\n"); - return(1); - break; - } - - port_handle = open(port_device_name, O_RDWR | O_NOCTTY ); - if(port_handle==-1) - { - smDebug(-1, Low, "Serial port error: port open failed"); - return(port_handle); +#endif + default: + customBaudRate = true; +#if defined(__APPLE__) + if (ioctl(port_handle, IOSSIOSPEED, &baudrate_bps) == -1) + { + smDebug(-1, Low, "Serial port error: unsupported baudrate\n"); + close(port_handle); + return -1; + } +#else + smDebug(-1,Low,"Serial port error: unsupported baudrate\n"); + close(port_handle); + return(-1); + break; +#endif } memset(&new_port_settings, 0, sizeof(new_port_settings)); //reset struct - new_port_settings.c_cflag = baudrateEnumValue | CS8 | CLOCAL | CREAD; + new_port_settings.c_cflag = CS8 | CLOCAL | CREAD; new_port_settings.c_iflag = IGNPAR; new_port_settings.c_oflag = 0; new_port_settings.c_lflag = 0; new_port_settings.c_cc[VMIN] = 0; /* non blocking mode */ new_port_settings.c_cc[VTIME] = readTimeoutMs/100; /* timeout 100 ms steps */ - err = tcsetattr(port_handle, TCSANOW, &new_port_settings); + + if (!customBaudRate) + { +#if defined(_BSD_SOURCE) + cfsetspeed(&new_port_settings, baudrateEnumValue); +#else + cfsetispeed(&new_port_settings, baudrateEnumValue); + cfsetospeed(&new_port_settings, baudrateEnumValue); +#endif + } + + // Activate settings + err = tcsetattr(port_handle, TCSANOW, &new_port_settings); if(err==-1) { - close(port_handle); - smDebug(-1, Low, "Serial port error: failed to set port parameters"); - return -1; + close(port_handle); + smDebug(-1, Low, "Serial port error: failed to set port parameters"); + return -1; } //flush any stray bytes from device receive buffer that may reside in it -- cgit v1.2.3 From 2760f444b7c1cec95753778ff16b33782421f483 Mon Sep 17 00:00:00 2001 From: Oskari Timperi Date: Tue, 11 Apr 2017 10:50:08 +0300 Subject: Turn a lonely bool variable into an int variable --- pcserialport.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pcserialport.c b/pcserialport.c index d9cd0f8..35a7668 100644 --- a/pcserialport.c +++ b/pcserialport.c @@ -39,7 +39,7 @@ smint32 serialPortOpen(const char * port_device_name, smint32 baudrate_bps) int err; int baudrateEnumValue; struct termios new_port_settings; - bool customBaudRate = false; + int customBaudRate = 0; port_handle = open(port_device_name, O_RDWR | O_NOCTTY); @@ -106,7 +106,7 @@ smint32 serialPortOpen(const char * port_device_name, smint32 baudrate_bps) case 4000000 : baudrateEnumValue = B4000000; break; #endif default: - customBaudRate = true; + customBaudRate = 1; #if defined(__APPLE__) if (ioctl(port_handle, IOSSIOSPEED, &baudrate_bps) == -1) { -- cgit v1.2.3