📄 serdrv.c
字号:
printf("[%d@%d] ", nread, rbindex);#endif if (nread>0) rbindex = rbindex+nread; do { restatus = Angel_RxEngine(readbuf[c], &(dc->dc_packet), &rxstate);#ifdef DO_TRACE printf("<%02X ",readbuf[c]); if (!(++c % 16)) printf("\n");#else c++;#endif } while (c<rbindex && ((restatus == RS_IN_PKT) || (restatus == RS_WAIT_PKT)));#ifdef DO_TRACE if (c % 16) printf("\n");#endif switch(restatus) { case RS_GOOD_PKT: ret_code = 1; /* fall through to: */ case RS_BAD_PKT: /* * We now need to shuffle any left over data down to the * beginning of our private buffer ready to be used *for the next packet */#ifdef DO_TRACE printf("SerialRead() processed %d, moving down %d\n", c, rbindex-c);#endif if (c != rbindex) memmove((char *) readbuf, (char *) (readbuf+c), rbindex-c); rbindex -= c; break; case RS_IN_PKT: case RS_WAIT_PKT: rbindex = 0; /* will have processed all we had */ ret_code = 0; break; default:#ifdef DEBUG printf("Bad re_status in serialRead()\n");#endif break; } } else if (nread == 0) ret_code = 0; /* nothing to read */ else if (read_errno == ERRNO_FOR_BLOCKED_IO) /* nread < 0 */ ret_code = 0;#ifdef DEBUG if ((nread<0) && (read_errno!=ERRNO_FOR_BLOCKED_IO)) perror("read() error in serialRead()");#endif return ret_code;}static int SerialWrite(DriverCall *dc) { int nwritten = 0; te_status testatus = TS_IN_PKT; if (dc->dc_context == NULL) { Angel_TxEngineInit(&config, &(dc->dc_packet), &(wstate.txstate)); wstate.wbindex = 0; dc->dc_context = &wstate; } while ((testatus == TS_IN_PKT) && (wstate.wbindex < MAXWRITESIZE)) { /* send the raw data through the tx engine to escape and encapsulate */ testatus = Angel_TxEngine(&(dc->dc_packet), &(wstate.txstate), &(wstate.writebuf)[wstate.wbindex]); if (testatus != TS_IDLE) wstate.wbindex++; } if (testatus == TS_IDLE) {#ifdef DEBUG printf("SerialWrite: testatus is TS_IDLE during preprocessing\n");#endif }#ifdef DO_TRACE { int i = 0; while (i<wstate.wbindex) { printf(">%02X ",wstate.writebuf[i]); if (!(++i % 16)) printf("\n"); } if (i % 16) printf("\n"); }#endif#ifdef COMPILING_ON_WINDOWS if (WriteSerial(wstate.writebuf, wstate.wbindex) == COM_OK) { nwritten = wstate.wbindex; if (pfnProgressCallback != NULL) { progressInfo.nWritten += nwritten; (*pfnProgressCallback)(&progressInfo); } } else { MessageBox(GetFocus(), "Write error\n", "Angel", MB_OK | MB_ICONSTOP); return -1; /* SJ - This really needs to return a value, which is picked up in */ /* DevSW_Read as meaning stop debugger but don't kill. */ }#else nwritten = Unix_WriteSerial(wstate.writebuf, wstate.wbindex); if (nwritten < 0) { nwritten=0; }#endif#ifdef DEBUG if (nwritten > 0) printf("Wrote %#04x bytes\n", nwritten);#endif if ((unsigned) nwritten == wstate.wbindex && (testatus == TS_DONE_PKT || testatus == TS_IDLE)) { /* finished sending the packet */#ifdef DEBUG printf("SerialWrite: calling Angel_TxEngineInit after sending packet (len=%i)\n",wstate.wbindex);#endif testatus = TS_IN_PKT; wstate.wbindex = 0; return 1; } else {#ifdef DEBUG printf("SerialWrite: Wrote part of packet wbindex=%i, nwritten=%i\n", wstate.wbindex, nwritten);#endif /* * still some data left to send shuffle whats left down and reset * the ptr */ memmove((char *) wstate.writebuf, (char *) (wstate.writebuf+nwritten), wstate.wbindex-nwritten); wstate.wbindex -= nwritten; return 0; } return -1;}static int serial_reset( void ){#ifdef DEBUG printf( "serial_reset\n" );#endif#ifdef COMPILING_ON_WINDOWS FlushSerial();#else Unix_ResetSerial();#endif return serial_set_params( &serial_defaults );}static int find_baud_rate( unsigned int *speed ){ static struct { unsigned int baud; int termiosValue; } possibleBaudRates[] = {#if defined(__hpux) {115200,_B115200}, {57600,_B57600},#else#ifdef B115200 {115200,B115200},#endif#ifdef B57600 {57600,B57600},#endif#endif#ifdef COMPILING_ON_WINDOWS {38400,CBR_38400}, {19200,CBR_19200}, {9600, CBR_9600}, {0,0}#else {38400,B38400}, {19200,B19200}, {9600, B9600}, {0,0}#endif }; unsigned int i; /* look for lower or matching -- will always terminate at 0 end marker */ for ( i = 0; possibleBaudRates[i].baud > *speed; ++i ) /* do nothing */ ; if ( possibleBaudRates[i].baud > 0 ) *speed = possibleBaudRates[i].baud; return possibleBaudRates[i].termiosValue;}static int serial_set_params( const ParameterConfig *config ){ unsigned int speed; int termios_value;#ifdef DEBUG printf( "serial_set_params\n" );#endif if ( ! Angel_FindParam( AP_BAUD_RATE, config, &speed ) ) {#ifdef DEBUG printf( "speed not found in config\n" );#endif return DE_OKAY; } termios_value = find_baud_rate( &speed ); if ( termios_value == 0 ) {#ifdef DEBUG printf( "speed not valid: %u\n", speed );#endif return DE_OKAY; }#ifdef DEBUG printf( "setting speed to %u\n", speed );#endif#ifdef COMPILING_ON_WINDOWS SetBaudRate((WORD)termios_value);#else Unix_SetSerialBaudRate(termios_value);#endif return DE_OKAY;}static int serial_get_user_params( ParameterOptions **p_options ){#ifdef DEBUG printf( "serial_get_user_params\n" );#endif if ( user_options_set ) { *p_options = &user_options; } else { *p_options = NULL; } return DE_OKAY;}static int serial_get_default_params( ParameterConfig **p_config ){#ifdef DEBUG printf( "serial_get_default_params\n" );#endif *p_config = (ParameterConfig *) &serial_defaults; return DE_OKAY;}static int SerialIoctl(const int opcode, void *args) { int ret_code;#ifdef DEBUG printf( "SerialIoctl: op %d arg %p\n", opcode, args ? args : "<NULL>");#endif switch (opcode) { case DC_RESET: ret_code = serial_reset(); break; case DC_SET_PARAMS: ret_code = serial_set_params((const ParameterConfig *)args); break; case DC_GET_USER_PARAMS: ret_code = serial_get_user_params((ParameterOptions **)args); break; case DC_GET_DEFAULT_PARAMS: ret_code = serial_get_default_params((ParameterConfig **)args); break; default: ret_code = DE_BAD_OP; break; } return ret_code;}DeviceDescr angel_SerialDevice = { "SERIAL", SerialOpen, SerialMatch, SerialClose, SerialRead, SerialWrite, SerialIoctl};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -