00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049 #include "RS232Device.h"
00050 #if defined (_WIN32)
00051 #endif
00052 #if defined(__LINUX__)
00053 #include <fcntl.h>
00054 #include <termios.h>
00055 #include <unistd.h>
00056 #endif
00057 #if defined (__QNX__)
00058 #include <fcntl.h>
00059 #include <termios.h>
00060 #endif
00061
00062 #define RSID_SENDDAT 0x04
00063 #define RSID_RECVDAT 0x08
00064 #define STX 0x02
00065 #define ETX 0x03
00066 #define DLE 0x10
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080 int CRS232Device::getDeviceError(int iErrorState)
00081 {
00082 m_iErrorState = 0;
00083 return iErrorState;
00084 }
00085
00086 int CRS232Device::setBaudRate()
00087 {
00088 m_iErrorState = 0;
00089 return m_iErrorState;
00090 }
00091
00092 int CRS232Device::setMessageId(unsigned long uiMessageId)
00093 {
00094 m_iErrorState = 0;
00095 return m_iErrorState;
00096 }
00097
00098 int CRS232Device::clearReadQueue()
00099 {
00100 m_iErrorState = 0;
00101 return m_iErrorState;
00102 }
00103
00104 int CRS232Device::reinit(unsigned char ucBaudRateId)
00105 {
00106 m_iErrorState = 0;
00107 return m_iErrorState;
00108 }
00109
00110 int CRS232Device::readDevice(CProtocolMessage& rclProtocolMessage)
00111 {
00112 unsigned char aucMessageBuffer[22] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
00113 unsigned char aucReadBuffer[22] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
00114 unsigned char ucChar;
00115 unsigned char aucDecodeBuffer[11] = {0,0,0,0,0,0,0,0,0,0,0};
00116 unsigned char ucMessageLength = 0;
00117 unsigned int i = 0;
00118 unsigned int k = 0;
00119 unsigned int uiMessageBufferIndex = 0;
00120 unsigned int uiReadBufferIndex = 0;
00121 double fTime = 0;
00122 bool bExit = false;
00123 bool bMessageComplete = false;
00124 bool bDecodeError = false;
00125 int iRetVal;
00126 m_iErrorState = 0;
00127 #if defined(_WIN32)
00128 DWORD iErrorCode = 0;
00129 DWORD iReadLength = 0;
00130 m_clTimer.start();
00131
00132 do
00133 {
00134 iRetVal = ReadFile( m_hDevice, &ucChar, 1, &iReadLength, NULL );
00135 if (iRetVal == 0)
00136 {
00137 void* lpMsgBuf;
00138 FormatMessage(
00139 FORMAT_MESSAGE_ALLOCATE_BUFFER |
00140 FORMAT_MESSAGE_FROM_SYSTEM |
00141 FORMAT_MESSAGE_IGNORE_INSERTS,
00142 NULL,
00143 GetLastError(),
00144 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
00145 (LPTSTR) &lpMsgBuf,
00146 0,
00147 NULL
00148 );
00149 debug(1,"COMERROR:%s\n",lpMsgBuf);
00150 warning( "Receive Error. ReadFile failed.\n" );
00151 ClearCommError( m_hDevice, &iErrorCode, NULL );
00152 m_iErrorState = ERRID_DEV_READERROR;
00153 return m_iErrorState;
00154 }
00155 if( iReadLength == 1 )
00156 {
00157 aucReadBuffer[uiReadBufferIndex++] = ucChar;
00158 if( ucChar == ETX )
00159 bExit = true;
00160 }
00161 m_clTimer.stop();
00162 fTime = m_clTimer.executionTime() * 1000;
00163 if( fTime > m_uiTimeOut + 10 * m_iModuleCount)
00164 {
00165 bExit = true;
00166 warning( "Receive Error. Timeout %f. %d bytes received.\n", fTime, uiReadBufferIndex);
00167 m_iErrorState = ERRID_DEV_READTIMEOUT;
00168 return m_iErrorState;
00169 }
00170 } while( !bExit );
00171
00172 #endif
00173
00174 #if defined(__QNX__)
00175 struct timeval clTimeout;
00176 fd_set fdReadSet;
00177 clTimeout.tv_sec=0;
00178 clTimeout.tv_usec=m_uiTimeOut * 1000;
00179 m_clTimer.start();
00180 ssize_t bytesRead = 0;
00181 do
00182 {
00183 FD_ZERO( &fdReadSet );
00184 FD_SET( m_hDevice, &fdReadSet );
00185
00186 iRetVal=select( FD_SETSIZE, &fdReadSet, NULL, NULL, &clTimeout );
00187 if(iRetVal < 0)
00188 {
00189 warning("Receive Error in select");
00190 return ERRID_IO_READERROR;
00191 }
00192 else if (iRetVal>0 && FD_ISSET(m_hDevice,&fdReadSet))
00193 {
00194 bytesRead = read( m_hDevice, &ucChar, 1 );
00195 if( bytesRead < 0 )
00196 { warning( "Receive Error. Read error.\n" );
00197 m_iErrorState = ERRID_DEV_READERROR;
00198 return m_iErrorState;
00199 }
00200 else if( bytesRead == 1 )
00201 {
00202 aucReadBuffer[uiReadBufferIndex++] = ucChar;
00203 if( ucChar == ETX )
00204 bExit = true;
00205 }
00206 else if( bytesRead == 0 )
00207 {
00208 warning( "Receive Error. Timeout\n");
00209 m_iErrorState = ERRID_DEV_READTIMEOUT;
00210 return m_iErrorState;
00211 }
00212 }
00213 m_clTimer.stop();
00214 fTime = m_clTimer.executionTime() * 1000;
00215 if( fTime > m_uiTimeOut * m_iModuleCount)
00216 { bExit = true;
00217 warning( "Receive Error. Timeout. %d bytes received.\n", uiReadBufferIndex );
00218 m_iErrorState = ERRID_DEV_READTIMEOUT;
00219 return m_iErrorState;
00220 }
00221 } while( !bExit );
00222
00223 #endif
00224
00225 #if defined(__LINUX__)
00226 ssize_t bytesRead = 0;
00227 struct timeval clTimeout;
00228 fd_set fdReadSet;
00229 clTimeout.tv_sec=0;
00230 clTimeout.tv_usec=m_uiTimeOut * 1000;
00231 m_clTimer.start();
00232
00233 do
00234 {
00235 FD_ZERO( &fdReadSet );
00236 FD_SET( m_hDevice, &fdReadSet );
00237
00238 iRetVal=select( FD_SETSIZE, &fdReadSet, NULL, NULL, &clTimeout );
00239 if(iRetVal < 0)
00240 {
00241 warning("Receive Error in select");
00242 return ERRID_IO_READERROR;
00243 }
00244 else if (iRetVal>0 && FD_ISSET(m_hDevice,&fdReadSet))
00245 {
00246 bytesRead = read( m_hDevice, &ucChar, 1 );
00247 if( bytesRead < 0 )
00248 { warning( "Receive Error. Read error.\n" );
00249 m_iErrorState = ERRID_DEV_READERROR;
00250 return m_iErrorState;
00251 }
00252 else if( bytesRead == 1 )
00253 {
00254 aucReadBuffer[uiReadBufferIndex++] = ucChar;
00255 if( ucChar == ETX )
00256 bExit = true;
00257 }
00258 else if( bytesRead == 0 )
00259 {
00260 warning( "Receive Error. Timeout\n");
00261 m_iErrorState = ERRID_DEV_READTIMEOUT;
00262 return m_iErrorState;
00263 }
00264 }
00265 m_clTimer.stop();
00266 fTime = m_clTimer.executionTime() * 1000;
00267 if( fTime > m_uiTimeOut * m_iModuleCount)
00268 { bExit = true;
00269 warning( "Receive Error. Timeout. %d bytes received.\n", uiReadBufferIndex );
00270 m_iErrorState = ERRID_DEV_READTIMEOUT;
00271 return m_iErrorState;
00272 }
00273 } while( !bExit );
00274
00275 #endif
00276
00277 for( i = 0; i < uiReadBufferIndex; i++ )
00278 {
00279 if( aucReadBuffer[i] == STX )
00280 {
00281 uiMessageBufferIndex = 0;
00282 bMessageComplete = false;
00283 }
00284 if( aucReadBuffer[i] == ETX )
00285 bMessageComplete = true;
00286 if( uiMessageBufferIndex > 22 )
00287 {
00288 uiMessageBufferIndex = 0;
00289 bMessageComplete = false;
00290 warning( "More than 22 bytes!" );
00291 }
00292 aucMessageBuffer[uiMessageBufferIndex] = aucReadBuffer[i];
00293 uiMessageBufferIndex++;
00294 }
00295
00296 if( bMessageComplete )
00297 {
00298 if( (aucMessageBuffer[0] == STX) && (aucMessageBuffer[uiMessageBufferIndex-1] == ETX) )
00299 {
00300 for( i = 1; i < uiMessageBufferIndex-1; i++ )
00301 {
00302 if( aucMessageBuffer[i] == DLE )
00303 {
00304 i++;
00305 aucDecodeBuffer[k] = aucMessageBuffer[i] - 0x80;
00306 }
00307 else if( aucMessageBuffer[i] == ETX || aucMessageBuffer[i] == STX )
00308 {
00309 bDecodeError = true;
00310 break;
00311 }
00312 else
00313 aucDecodeBuffer[k] = aucMessageBuffer[i];
00314 k++;
00315 }
00316 }
00317 else
00318 {
00319 warning( "Receive Error: STX/ETX framing incorrect.\n" );
00320 m_iErrorState = ERRID_DEV_READERROR;
00321 return m_iErrorState;
00322 }
00323
00324
00325 ucMessageLength = aucDecodeBuffer[1] & 0x0F;
00326 if( aucDecodeBuffer[0] & RSID_RECVDAT )
00327 {
00328 if( !bDecodeError )
00329 {
00330 if( ucMessageLength == k-3 )
00331 {
00332 rclProtocolMessage.m_ucMessageLength = ucMessageLength;
00333 rclProtocolMessage.m_iModuleId = (((aucDecodeBuffer[0]&0x03)<<3)+((aucDecodeBuffer[1]&0xE0)>>5));
00334 for( i = 0; i < ucMessageLength; i++ )
00335 rclProtocolMessage.m_aucMessageData[i] = aucDecodeBuffer[i+2];
00336 rclProtocolMessage.m_uiMessageId = MSGID_ACK + rclProtocolMessage.m_iModuleId;
00337 m_iErrorState = 0;
00338 return m_iErrorState;
00339 }
00340 warning( "Receive Error: Length incorrect received %d instead of %d\n", k-3, ucMessageLength );
00341 m_iErrorState = ERRID_DEV_READERROR;
00342 return m_iErrorState;
00343 }
00344
00345 warning( "Receive Error: STX/ETX inside message.\n" );
00346 m_iErrorState = ERRID_DEV_READERROR;
00347 return m_iErrorState;
00348 }
00349
00350 warning( "Receive Error: MessageId incorrect.\n" );
00351 m_iErrorState = ERRID_DEV_READERROR;
00352 return m_iErrorState;
00353 }
00354
00355 warning( "Receive Error: ETX not received.\n" );
00356 m_iErrorState = ERRID_DEV_READERROR;
00357 return m_iErrorState;
00358 }
00359
00360 int CRS232Device::writeDevice(CProtocolMessage& rclProtocolMessage)
00361 {
00362 int i = 0;
00363 unsigned int uiWriteBufferIndex = 0;
00364 unsigned long uiWriteLength = 0;
00365 unsigned char aucWriteBuffer[24];
00366 unsigned short uiSum = 0;
00367 unsigned char aucEncodeBuffer[11] = {0,0,0,0,0,0,0,0,0,0,0};
00368 int iRetVal;
00369 CRS232Message clRS232Message;
00370
00371 m_iErrorState = 0;
00372
00373 clRS232Message.m_aucMessageId[0] = (unsigned char)rclProtocolMessage.m_iModuleId >> 3;
00374 clRS232Message.m_aucMessageId[0] |= RSID_SENDDAT;
00375 clRS232Message.m_aucMessageId[1] = (unsigned char)rclProtocolMessage.m_iModuleId << 5;
00376 clRS232Message.m_aucMessageId[1] |= (unsigned char)rclProtocolMessage.m_ucMessageLength;
00377 clRS232Message.m_ucMessageLength = (unsigned char)rclProtocolMessage.m_ucMessageLength;
00378 memcpy(clRS232Message.m_aucMessageData, rclProtocolMessage.m_aucMessageData, rclProtocolMessage.m_ucMessageLength);
00379
00380 aucEncodeBuffer[0] = clRS232Message.m_aucMessageId[0];
00381 aucEncodeBuffer[1] = clRS232Message.m_aucMessageId[1];
00382 for( i = 0; i < clRS232Message.m_ucMessageLength; i++ )
00383 aucEncodeBuffer[i+2] = clRS232Message.m_aucMessageData[i];
00384 for( i = 0; i < clRS232Message.m_ucMessageLength+2; i++ )
00385 uiSum += aucEncodeBuffer[i];
00386 aucEncodeBuffer[clRS232Message.m_ucMessageLength+2] = uiSum + (uiSum>>8);
00387
00388 aucWriteBuffer[0] = STX;
00389 uiWriteBufferIndex = 1;
00390
00391 for( i = 0; i < clRS232Message.m_ucMessageLength+3; i++ )
00392 {
00393 if( aucEncodeBuffer[i] == DLE || aucEncodeBuffer[i] == STX || aucEncodeBuffer[i] == ETX )
00394 {
00395 aucWriteBuffer[uiWriteBufferIndex] = DLE;
00396 uiWriteBufferIndex++;
00397 aucWriteBuffer[uiWriteBufferIndex] = aucEncodeBuffer[i] + 0x80;
00398 }
00399 else
00400 aucWriteBuffer[uiWriteBufferIndex] = aucEncodeBuffer[i];
00401 uiWriteBufferIndex++;
00402 }
00403
00404 aucWriteBuffer[uiWriteBufferIndex] = ETX;
00405
00406 #if defined(_WIN32)
00407 DWORD iErrorCode;
00408
00409 PurgeComm( m_hDevice, PURGE_TXABORT );
00410 PurgeComm( m_hDevice, PURGE_RXABORT );
00411 PurgeComm( m_hDevice, PURGE_TXCLEAR );
00412 PurgeComm( m_hDevice, PURGE_RXCLEAR );
00413
00414 iRetVal = WriteFile( m_hDevice, aucWriteBuffer, uiWriteBufferIndex+1, &uiWriteLength, NULL );
00415 if (iRetVal == 0)
00416 {
00417
00418 void* lpMsgBuf;
00419 FormatMessage(
00420 FORMAT_MESSAGE_ALLOCATE_BUFFER |
00421 FORMAT_MESSAGE_FROM_SYSTEM |
00422 FORMAT_MESSAGE_IGNORE_INSERTS,
00423 NULL,
00424 GetLastError(),
00425 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
00426 (LPTSTR) &lpMsgBuf,
00427 0,
00428 NULL
00429 );
00430 debug(1,"COMERROR:%s\n",lpMsgBuf);
00431 warning( "Transmission Error. Sent %ld bytes instead of &ld: \n", uiWriteLength, uiWriteBufferIndex+1 );
00432 ClearCommError( m_hDevice, &iErrorCode, NULL );
00433 m_iErrorState = ERRID_DEV_WRITEERROR;
00434 return m_iErrorState;
00435 }
00436
00437 if( uiWriteLength != uiWriteBufferIndex+1 )
00438 { warning( "Transmission Error. Sent %ld bytes instead of &ld: \n", uiWriteLength, uiWriteBufferIndex+1 );
00439 m_iErrorState = ERRID_DEV_WRITEERROR;
00440 return m_iErrorState;
00441 }
00442 #endif
00443
00444 #if defined(__QNX__)
00445 tcflush( m_hDevice, TCIOFLUSH );
00446
00447 uiWriteLength = write(m_hDevice, aucWriteBuffer, uiWriteBufferIndex+1);
00448 if( uiWriteLength != uiWriteBufferIndex+1 )
00449 { warning( "Transmission Error %d. Sent %ld bytes instead of %ld.\n", errno, uiWriteLength, uiWriteBufferIndex+1 );
00450 m_iErrorState = ERRID_DEV_WRITEERROR;
00451 return m_iErrorState;
00452 }
00453 tcdrain( m_hDevice );
00454 #endif
00455
00456 #if defined(__LINUX__)
00457 tcflush( m_hDevice, TCIOFLUSH );
00458
00459 uiWriteLength = write(m_hDevice, aucWriteBuffer, uiWriteBufferIndex+1);
00460 if( uiWriteLength != uiWriteBufferIndex+1 )
00461 { warning( "Transmission Error. Sent %ld bytes instead of %ld.\n", uiWriteLength, uiWriteBufferIndex+1 );
00462 m_iErrorState = ERRID_DEV_WRITEERROR;
00463 return m_iErrorState;
00464 }
00465 tcdrain( m_hDevice );
00466 #endif
00467
00468 return m_iErrorState;
00469 }
00470
00471
00472
00473
00474
00475
00476
00477 CRS232Device::CRS232Device() : m_hDevice(0), m_iDeviceId(-1), m_uiBaudRate(0), m_uiTimeOut(30), m_clTimer(util_REAL_TIME)
00478 {
00479 initMessage("CRS232Device", g_iDebugLevel, g_bDebug, g_bDebugFile);
00480 }
00481
00482 CRS232Device::CRS232Device(const CRS232Device& rclRS232Device)
00483 {
00484 error(-1, "Sorry constructor is not implemented");
00485 }
00486
00487 CRS232Device::~CRS232Device()
00488 {
00489 exit();
00490 }
00491
00492
00493
00494
00495
00496
00497
00498 CRS232Device& CRS232Device::operator=(const CRS232Device& rclRS232Device)
00499 {
00500 error(-1, "Sorry operator= is not implemented");
00501 return *this;
00502 }
00503
00504
00505
00506
00507
00508
00509
00510
00511
00512
00513
00514
00515
00516 void CRS232Device::setTimeOut(unsigned long uiTimeOut)
00517 {
00518 m_uiTimeOut= uiTimeOut;
00519 }
00520
00521
00522
00523
00524
00525
00526
00527
00528
00529
00530
00531
00532
00533 int CRS232Device::init()
00534 {
00535 return init(m_acInitString);
00536 }
00537
00538 int CRS232Device::init(const char* acInitString)
00539 {
00540 InitializeCriticalSection(&m_csDevice);
00541 char* pcToken;
00542 char acString[128];
00543 char acDevice[128];
00544 if(m_bInitFlag)
00545 {
00546 warning("device already initialized");
00547 m_iErrorState = ERRID_DEV_ISINITIALIZED;
00548 return m_iErrorState;
00549 }
00550 m_iDeviceId = -1;
00551 m_iErrorState = 0;
00552 strncpy(m_acInitString,acInitString,128);
00553 strncpy(acString,acInitString,128);
00554
00555 pcToken = strtok( acString, ":" );
00556 if( !pcToken )
00557 { m_iErrorState = ERRID_DEV_BADINITSTRING;
00558 return m_iErrorState;
00559 }
00560 if( strcmp( pcToken, "RS232" ) != 0 )
00561 { m_iErrorState = ERRID_DEV_BADINITSTRING;
00562 return m_iErrorState;
00563 }
00564
00565 pcToken = strtok( NULL, "," );
00566 if( !pcToken )
00567 { m_iErrorState = ERRID_DEV_BADINITSTRING;
00568 return m_iErrorState;
00569 }
00570 m_iDeviceId = atoi(pcToken);
00571
00572 pcToken = strtok( NULL, "," );
00573 if( !pcToken )
00574 { m_iErrorState = ERRID_DEV_BADINITSTRING;
00575 return m_iErrorState;
00576 }
00577 m_iBaudRate = atoi(pcToken);
00578
00579 #if defined(_WIN32)
00580 COMMTIMEOUTS commtimeouts;
00581 DCB dcb;
00582 sprintf( acDevice, "COM%d", m_iDeviceId );
00583 m_hDevice = CreateFile( acDevice, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL );
00584 if( m_hDevice == INVALID_HANDLE_VALUE )
00585 { warning( "Could not initialize %s\n", acDevice );
00586 m_iErrorState = ERRID_DEV_INITERROR;
00587 return m_iErrorState;
00588 }
00589
00590 if( !GetCommState( m_hDevice, &dcb ) )
00591 { warning( "GetCommState-Error %d\n", GetLastError() );
00592 m_iErrorState = ERRID_DEV_INITERROR;
00593 return m_iErrorState;
00594 }
00595
00596 switch( m_iBaudRate )
00597 {
00598 case 1200:
00599 dcb.BaudRate = CBR_1200;
00600 break;
00601 case 2400:
00602 dcb.BaudRate = CBR_2400;
00603 break;
00604 case 4800:
00605 dcb.BaudRate = CBR_4800;
00606 break;
00607 case 9600:
00608 dcb.BaudRate = CBR_9600;
00609 break;
00610 case 19200:
00611 dcb.BaudRate = CBR_19200;
00612 break;
00613 case 38400:
00614 dcb.BaudRate = CBR_38400;
00615 break;
00616 case 57600:
00617 dcb.BaudRate = CBR_57600;
00618 break;
00619 case 115200:
00620 dcb.BaudRate = CBR_115200;
00621 break;
00622 default:
00623 dcb.BaudRate = CBR_9600;
00624 break;
00625 }
00626
00627 dcb.ByteSize = 8;
00628 dcb.StopBits = ONESTOPBIT;
00629 dcb.Parity = NOPARITY;
00630 dcb.fRtsControl = RTS_CONTROL_DISABLE;
00631 dcb.fDtrControl = DTR_CONTROL_HANDSHAKE;
00632
00633 if( !SetCommState( m_hDevice, &dcb) )
00634 { warning( "SetCommState-Error %d\n", GetLastError() );
00635 m_iErrorState = ERRID_DEV_INITERROR;
00636 return m_iErrorState;
00637 }
00638 commtimeouts.ReadIntervalTimeout = 0;
00639 commtimeouts.ReadTotalTimeoutMultiplier = 0;
00640 commtimeouts.ReadTotalTimeoutConstant = m_uiTimeOut;
00641 commtimeouts.WriteTotalTimeoutMultiplier = 0;
00642 commtimeouts.WriteTotalTimeoutConstant = m_uiTimeOut;
00643 SetCommTimeouts(m_hDevice,&commtimeouts);
00644
00645 #endif
00646
00647 #if defined(__QNX__)
00648 sprintf(acDevice,"/dev/ser%d",m_iDeviceId);
00649 m_hDevice = open(acDevice, O_RDWR|O_NONBLOCK );
00650 if( m_hDevice <=0 )
00651 { warning( "Could not initialize %s\n", acDevice );
00652 m_iErrorState = ERRID_DEV_INITERROR;
00653 return m_iErrorState;
00654 }
00655
00656 struct termios clPortOptions;
00657 tcgetattr(m_hDevice, &clPortOptions);
00658
00659 switch( m_iBaudRate )
00660 {
00661 case 1200:
00662 cfsetispeed(&clPortOptions, B1200);
00663 cfsetospeed(&clPortOptions, B1200);
00664 break;
00665 case 2400:
00666 cfsetispeed(&clPortOptions, B2400);
00667 cfsetospeed(&clPortOptions, B2400);
00668 break;
00669 case 4800:
00670 cfsetispeed(&clPortOptions, B4800);
00671 cfsetospeed(&clPortOptions, B4800);
00672 break;
00673 case 9600:
00674 cfsetispeed(&clPortOptions, B9600);
00675 cfsetospeed(&clPortOptions, B9600);
00676 break;
00677 case 19200:
00678 cfsetispeed(&clPortOptions, B19200);
00679 cfsetospeed(&clPortOptions, B19200);
00680 break;
00681 case 38400:
00682 cfsetispeed(&clPortOptions, B38400);
00683 cfsetospeed(&clPortOptions, B38400);
00684 break;
00685 case 57600:
00686 cfsetispeed(&clPortOptions, B57600);
00687 cfsetospeed(&clPortOptions, B57600);
00688 break;
00689 case 115200:
00690 cfsetispeed(&clPortOptions, B115200);
00691 cfsetospeed(&clPortOptions, B115200);
00692 break;
00693 default:
00694 cfsetispeed(&clPortOptions, B9600);
00695 cfsetospeed(&clPortOptions, B9600);
00696 break;
00697 }
00698
00699 clPortOptions.c_cflag |= CREAD|CS8;
00700 clPortOptions.c_lflag = 0;
00701 if( tcsetattr(m_hDevice, TCSANOW, &clPortOptions) != 0 )
00702 { warning( "open: Could not set attributes\n" );
00703 m_iErrorState = ERRID_DEV_INITERROR;
00704 return m_iErrorState;
00705 }
00706
00707 #endif
00708
00709 #if defined(__LINUX__)
00710 sprintf(acDevice,"/dev/ttyS%d",m_iDeviceId-1);
00711 m_hDevice = open( acDevice, O_RDWR );
00712 if( m_hDevice == -1 )
00713 { warning( "open: Could not initialize %s\n", acDevice );
00714 m_iErrorState = ERRID_DEV_INITERROR;
00715 return m_iErrorState;
00716 }
00717
00718 struct termios clPortOptions;
00719 tcgetattr(m_hDevice, &clPortOptions);
00720
00721 switch( m_iBaudRate )
00722 {
00723 case 1200:
00724 cfsetispeed(&clPortOptions, B1200);
00725 cfsetospeed(&clPortOptions, B1200);
00726 break;
00727 case 2400:
00728 cfsetispeed(&clPortOptions, B2400);
00729 cfsetospeed(&clPortOptions, B2400);
00730 break;
00731 case 4800:
00732 cfsetispeed(&clPortOptions, B4800);
00733 cfsetospeed(&clPortOptions, B4800);
00734 break;
00735 case 9600:
00736 cfsetispeed(&clPortOptions, B9600);
00737 cfsetospeed(&clPortOptions, B9600);
00738 break;
00739 case 19200:
00740 cfsetispeed(&clPortOptions, B19200);
00741 cfsetospeed(&clPortOptions, B19200);
00742 break;
00743 case 38400:
00744 cfsetispeed(&clPortOptions, B38400);
00745 cfsetospeed(&clPortOptions, B38400);
00746 break;
00747 case 57600:
00748 cfsetispeed(&clPortOptions, B57600);
00749 cfsetospeed(&clPortOptions, B57600);
00750 break;
00751 case 115200:
00752 cfsetispeed(&clPortOptions, B115200);
00753 cfsetospeed(&clPortOptions, B115200);
00754 break;
00755 default:
00756 cfsetispeed(&clPortOptions, B9600);
00757 cfsetospeed(&clPortOptions, B9600);
00758 break;
00759 }
00760
00761 clPortOptions.c_iflag = 0;
00762 clPortOptions.c_oflag = 0;
00763 clPortOptions.c_cflag |= CLOCAL|CREAD|CS8|CSIZE;
00764 clPortOptions.c_lflag = 0;
00765 if( tcsetattr(m_hDevice, TCSANOW, &clPortOptions) != 0 )
00766 { warning( "open: Could not set attributes\n" );
00767 m_iErrorState = ERRID_DEV_INITERROR;
00768 return m_iErrorState;
00769 }
00770 #endif
00771
00772 m_iErrorState = clearReadQueue();
00773 if(m_iErrorState != 0)
00774 return m_iErrorState;
00775
00776 if(m_iErrorState == 0)
00777 m_bInitFlag = true;
00778 updateModuleIdMap();
00779 return m_iErrorState;
00780 }
00781
00782 int CRS232Device::exit()
00783 {
00784 m_iErrorState = 0;
00785 if(!m_bInitFlag)
00786 {
00787 warning("device not initialized");
00788 m_iErrorState = ERRID_DEV_NOTINITIALIZED;
00789 return m_iErrorState;
00790 }
00791 EnterCriticalSection(&m_csDevice);
00792 #if defined(_WIN32)
00793 if( !CloseHandle( m_hDevice ) )
00794 {
00795 warning( "Error closing Device.\n" );
00796 m_iErrorState = ERRID_DEV_EXITERROR;
00797 return m_iErrorState;
00798 }
00799 #endif
00800
00801 #if defined(__QNX__)
00802 if( close(m_hDevice) < 0 )
00803 { warning( "Error closing Device.\n" );
00804 m_iErrorState = ERRID_DEV_EXITERROR;
00805 return m_iErrorState;
00806 }
00807 #endif
00808
00809 #if defined(__LINUX__)
00810 if( close(m_hDevice) < 0 )
00811 { warning( "Error closing Device.\n" );
00812 m_iErrorState = ERRID_DEV_EXITERROR;
00813 return m_iErrorState;
00814 }
00815 #endif
00816
00817 m_bInitFlag = false;
00818 LeaveCriticalSection(&m_csDevice);
00819 DeleteCriticalSection(&m_csDevice);
00820 return m_iErrorState;
00821 }