// настроить порт int port_init ( askue_port_t *Port, const char *file, const char *speed, const char *dbits, const char *sbits, const char *parity ) { int RS232 = rs232_open ( file ); if ( rs232_init ( RS232, &( Port->Termios ) ) ) { rs232_close ( RS232 ); return -1; } rs232_set_databits ( &( Port->Termios ), dbits ); rs232_set_stopbits ( &( Port->Termios ), sbits ); rs232_set_parity ( &( Port->Termios ), parity ); rs232_set_speed ( &( Port->Termios ), speed ); if ( rs232_apply ( RS232, &( Port->Termios ) ) ) { rs232_close ( RS232 ); return -1; } Port->RS232 = RS232; if ( __port_open ( Port ) ) { close ( Port->RS232 ); return -1; } else { return 0; } }
// порт cli_result_t parse4port ( void *Port, int argc, char **argv ) { const char *PortCfg[ 5 ]; #define File ( PortCfg[ 0 ] ) #define Parity ( PortCfg[ 1 ] ) #define Speed ( PortCfg[ 2 ] ) #define DBits ( PortCfg[ 3 ] ) #define SBits ( PortCfg[ 4 ] ) // настроить порт cli_arg_t JournalArgs[] = { { "port_file", 0, CLI_OPTIONAL_ARG, CLI_REQUIRED_VAL, __parse4port_strp, &File }, { "port_parity", 0, CLI_OPTIONAL_ARG, CLI_REQUIRED_VAL, __parse4port_strp, &Parity }, { "port_speed", 0, CLI_OPTIONAL_ARG, CLI_REQUIRED_VAL, __parse4port_strp, &Speed }, { "port_sbits", 0, CLI_OPTIONAL_ARG, CLI_REQUIRED_VAL, __parse4port_strp, &DBits }, { "port_dbits", 0, CLI_OPTIONAL_ARG, CLI_REQUIRED_VAL, __parse4port_strp, &SBits }, CLI_LAST_ARG }; cli_result_t Result = cli_parse ( JournalArgs, argc, argv ); if ( Result != CLI_SUCCESS ) { return Result; } if ( rs232_init ( ( *( askue_port_t** ) Port )->RS232, &( ( *( askue_port_t** ) Port )->Termios ) ) ) { return CLI_ERROR_HANDLER; } rs232_set_speed ( &( ( *( askue_port_t** ) Port )->Termios ), Speed ); rs232_set_databits ( &( ( *( askue_port_t** ) Port )->Termios ), DBits ); rs232_set_stopbits ( &( ( *( askue_port_t** ) Port )->Termios ), SBits ); rs232_set_parity ( &( ( *( askue_port_t** ) Port )->Termios ), Parity ); if ( rs232_apply ( ( *( askue_port_t** ) Port )->RS232, &( ( *( askue_port_t** ) Port )->Termios ) ) ) { return CLI_ERROR_HANDLER; } if ( port_init ( *( askue_port_t** ) Port, File, Speed, DBits, SBits, Parity ) == -1 ) { return CLI_ERROR_HANDLER; } return Result; #undef File #undef Parity #undef Speed #undef DBits #undef SBits }
RS232_LIB unsigned int rs232_open(struct rs232_port_t *p) { wchar_t *wname = a2w(fix_device_name(p->dev)); struct rs232_windows_t *wx = p->pt; DBG("p=%p p->pt=%p name='%s' fix='%s'\n", (void *)p, p->pt, p->dev, fix_device_name(p->dev)); if (wname == NULL) return RS232_ERR_UNKNOWN; wx->fd = CreateFile(wname, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); if (wname) free(wname); if (wx->fd == INVALID_HANDLE_VALUE) { DBG("CreateFile() %s\n", last_error()); return RS232_ERR_OPEN; } p->status = RS232_PORT_OPEN; rs232_flush(p); GET_PORT_STATE(wx->fd, &wx->old_dcb); GET_PORT_TIMEOUTS(wx->fd, &wx->old_tm); port_timeout(p, wx->r_timeout, wx->w_timeout); port_buffers(p, wx->r_buffer, wx->w_buffer); rs232_set_baud(p, p->baud); rs232_set_data(p, p->data); rs232_set_parity(p, p->parity); rs232_set_stop(p, p->stop); rs232_set_flow(p, p->flow); return RS232_ERR_NOERROR; }