/** * throws EXIT_FAILURE if could not open the port */ int Serial_Port:: open_serial() { // -------------------------------------------------------------------------- // OPEN PORT // -------------------------------------------------------------------------- //printf("OPEN PORT\n"); fd = _open_port(uart_name); // Check success if (fd == -1) { //printf("failure, could not open port.\n"); return -1; //throw EXIT_FAILURE; } // -------------------------------------------------------------------------- // SETUP PORT // -------------------------------------------------------------------------- bool success = _setup_port(baudrate, 8, 1, false, false); // -------------------------------------------------------------------------- // CHECK STATUS // -------------------------------------------------------------------------- if (!success) { printf("failure, could not configure port.\n"); //throw EXIT_FAILURE; return -1; } if (fd <= 0) { printf("Connection attempt to port %s with %d baud, 8N1 failed, exiting.\n", uart_name, baudrate); //throw EXIT_FAILURE; return -1; } // -------------------------------------------------------------------------- // CONNECTED! // -------------------------------------------------------------------------- printf("Connected to %s with %d baud, 8 data bits, no parity, 1 stop bit (8N1)\n", uart_name, baudrate); lastStatus.packet_rx_drop_count = 0; status = true; printf("\n"); return 0; }
void open_serial() { printf("INITIALIZE \n"); initialize_defaults(); // -------------------------------------------------------------------------- // OPEN PORT // -------------------------------------------------------------------------- printf("OPEN PORT\n"); fd = _open_port(uart_name); // Check success if (fd == -1) { printf("failure, could not open port.\n"); } // -------------------------------------------------------------------------- // SETUP PORT // -------------------------------------------------------------------------- int success = _setup_port(baudrate, 8, 1, 0,0); // -------------------------------------------------------------------------- // CHECK STATUS // -------------------------------------------------------------------------- if (!success) { printf("failure, could not configure port.\n"); } if (fd <= 0) { printf("Connection attempt to port %s with %d baud, 8N1 failed, exiting.\n", uart_name, baudrate); } // -------------------------------------------------------------------------- // CONNECTED! // -------------------------------------------------------------------------- printf("Connected to %s with %d baud, 8 data bits, no parity, 1 stop bit (8N1)\n", uart_name, baudrate); lastStatus.packet_rx_drop_count = 0; status = 1; printf("\n"); return; }
/** * @brief 对文件描述符的控制 * * * 目前仅支持写的超时时间设置 * * @param [in] fd 文件描述符 * @param [in] cmd 命令标识,目前已定义的命令有 * - SWPA_FILE_IOCTL_COMM_SET_TIMEOUT : 写的超时时间设置 * @param [in] args 命令标志参数 * @retval SWPAR_OK : 成功 * @retval SWPAR_FAIL : 失败 */ int swpa_comm_file_ioctl( int fd, int cmd, void* args ) { SWPA_FILEHEADER * pheader = (SWPA_FILEHEADER *)fd; COMM_FILE_INFO * pinfo = (COMM_FILE_INFO *)pheader->device_param; //参数有效性检查 SWPA_FILE_CHECK(0 != fd); //fd 必须不等于0 //SWPA_FILE_CHECK(0 < cmd); //cmd取值没有限定,故mark掉 //SWPA_FILE_CHECK(NULL != args); //args 在不同cmd下可以为NULL,故mark掉 //参数打印 SWPA_FILE_PRINT("fd=%d\n", fd); SWPA_FILE_PRINT("cmd=%d\n", cmd); SWPA_FILE_PRINT("args=0x%08x\n", args); switch (cmd) { case SWPA_FILE_IOCTL_COMM_CLEAR: tcflush(fd, TCIOFLUSH); return SWPAR_OK; case SWPA_FILE_IOCTL_COMM_IS_RS485: { if (NULL == args) { SWPA_FILE_PRINT("Err: NULL == args! [%d]\n", pinfo->dev_id, SWPAR_INVALIDARG); return SWPAR_INVALIDARG; } int is_rs485 = *(int*)args; switch (is_rs485) { case 0: pinfo->is_rs485 = 0; break; case 1: /*no 'break' here */ default: pinfo->is_rs485 = 1; if (0 == (0 == pinfo->dev_id ? _rs485_lock_1 : _rs485_lock_2) && SWPAR_OK != swpa_mutex_create((0 == pinfo->dev_id ? &_rs485_lock_1 : &_rs485_lock_2), NULL)) { SWPA_FILE_PRINT("Err: failed to create rs485 %d lock! [-1]\n", pinfo->dev_id); return SWPAR_FAIL; } break; } } break; case SWPA_FILE_IOCTL_COMM_SET_ATTR: { char * argstr = (char *)args; int baudrate , databits, stop; char parity; char * str = NULL; SWPA_FILE_PRINT("Info: argstr=%s\n", argstr); str = swpa_strstr(argstr, "baudrate"); if (NULL != str) { swpa_sscanf(str, "baudrate:%d", &baudrate); switch (baudrate) { //case 2400: case 4800: case 9600: case 19200: case 38400: case 115200: //case 460800: baudrate = baudrate; break; default: SWPA_FILE_PRINT("Err: invalid baudrate (%d)!\n", baudrate ); return SWPAR_INVALIDARG; } } else { SWPA_FILE_PRINT("Err: no baudrate value [%d]!\n", SWPAR_INVALIDARG); return SWPAR_INVALIDARG; } //设置数据长度 str = swpa_strstr(argstr, "databits"); if (NULL != str) { swpa_sscanf(str, "databits:%d", &databits); switch (databits) { //case 5: //case 6: case 7: case 8: databits = databits; break ; default: SWPA_FILE_PRINT("Err: invalid data bits (%d)!\n", databits); return SWPAR_INVALIDARG ; } } else { SWPA_FILE_PRINT("Err: no data bits value [%d]!\n", SWPAR_INVALIDARG); return SWPAR_INVALIDARG; } //设置奇偶校验位 str = swpa_strstr(argstr, "parity"); if (NULL != str) { swpa_sscanf(str, "parity:%c", &parity); switch (parity) { case 'n': case 'N': case 'o': case 'O': case 'e': case 'E': //case 'S': case 's': //as no parity parity = parity; break; default: SWPA_FILE_PRINT("Err: invalid parity value (%d)!\n", parity); return SWPAR_INVALIDARG; } } else { SWPA_FILE_PRINT("Err: no parity value [%d]!\n", SWPAR_INVALIDARG); return SWPAR_INVALIDARG; } //设置停止位 str = swpa_strstr(argstr, "stop"); if (NULL != str) { swpa_sscanf(str, "stop:%d", &stop); switch (stop) { case 1: case 2: stop = stop; break; default: SWPA_FILE_PRINT("Err: invalid stop bits lenght (%d)!\n", stop); return SWPAR_INVALIDARG; } } else { SWPA_FILE_PRINT("Err: no stop bit value [%d]!\n", SWPAR_INVALIDARG); return SWPAR_INVALIDARG; } return _setup_port(pinfo->fd, baudrate, databits, parity, stop); } break; case SWPA_FILE_SET_READ_TIMEOUT : { pinfo->read_timeout = *(int *)args; return SWPAR_OK; } break; case SWPA_FILE_SET_WRITE_TIMEOUT : { pinfo->write_timeout = *(int *)args; return SWPAR_OK; } break; default: SWPA_FILE_PRINT("Err: invalid cmd for comm file! [%d]\n", SWPAR_INVALIDARG); return SWPAR_INVALIDARG; } return SWPAR_OK; }