亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? gsm_win32_serial.c

?? Gsm手機(短信息,電話簿)開發庫C++源代碼
?? C
字號:
// *************************************************************************
// * GSM TA/ME library
// *
// * File:    gsm_win32_port.cc
// *
// * Purpose: WIN32 serial port implementation
// *
// * Author:  Frediano Ziglio (freddy77@angelfire.com)
// *
// * Created: 25.10.2000
// *************************************************************************

#ifdef HAVE_CONFIG_H
#include <gsm_config.h>
#endif
#include <winsock.h>
#include <gsmlib/gsm_nls.h>
#include <gsmlib/gsm_win32_serial.h>
#include <gsmlib/gsm_util.h>
#include <fcntl.h>
#include <iostream>
#include <strstream>
#include <errno.h>
#include <stdio.h>
#include <assert.h>
#include <signal.h>

using namespace std;
using namespace gsmlib;

static long int timeoutVal = TIMEOUT_SECS;

struct ExceptionSafeOverlapped: public OVERLAPPED
{
  ExceptionSafeOverlapped()
  {
    memset((OVERLAPPED*)this,0,sizeof(OVERLAPPED));
    hEvent = CreateEvent( NULL, TRUE, FALSE, NULL ); 
    if (hEvent == INVALID_HANDLE_VALUE) 
      throw GsmException(_("error creating event"),OSError,GetLastError());
  }
  ~ExceptionSafeOverlapped()
  { CloseHandle(hEvent); }
};

typedef BOOL (WINAPI *TCancelIoProc)(HANDLE file);
TCancelIoProc CancelIoProc = NULL;
BOOL CancelIoHook(HANDLE file)
{
  if (CancelIoProc)
    return CancelIoProc(file);

  HMODULE hmodule = GetModuleHandle("KERNEL32");
  if (hmodule)
  {
    CancelIoProc = (TCancelIoProc)GetProcAddress(hmodule,"CancelIo");
    if (CancelIoProc)
      return CancelIoProc(file);
  }
                         
  return TRUE;
}
#define CancelIo CancelIoHook

// Win32SerialPort members

void Win32SerialPort::throwModemException(string message) throw(GsmException)
{
  ostrstream os;
  os << message << " (errno: " << errno << "/" << strerror(errno) << ")"
     << ends;
  char *ss = os.str();
  string s(ss);
  delete[] ss;
  throw GsmException(s, OSError, errno);
}

void Win32SerialPort::putBack(char c)
{
  assert(_oldChar == -1);
  _oldChar = c;
}

int Win32SerialPort::readByte() throw(GsmException)
{
  if (_oldChar != -1)
  {
    int result = _oldChar;
    _oldChar = -1;
    return result;
  }

  char c;
  int timeElapsed = 0;
  bool readDone = true;
  ExceptionSafeOverlapped  over;

  DWORD initTime = GetTickCount();
  DWORD dwReaded;
  if (!ReadFile(_file,&c,1,&dwReaded,&over))
  {
    readDone = false;
    if (GetLastError() != ERROR_IO_PENDING)
    {
      throwModemException(_("reading from TA"));
    }

    while(!readDone)
    {
      if (interrupted())
        throwModemException(_("interrupted when reading from TA"));

      // wait another second
      switch(WaitForSingleObject(over.hEvent,1000))
      {
      case WAIT_TIMEOUT:
        break;
      case WAIT_OBJECT_0:
      case WAIT_ABANDONED:
	      // !!! do a infinite loop if (bytesWritten < lenght) ?
        GetOverlappedResult(_file,&over,&dwReaded,TRUE);
        readDone = true;
        break;
      case WAIT_FAILED:
        throwModemException(_("reading from TA"));
      }

      timeElapsed = (GetTickCount() - initTime)/1000U;

      // timeout elapsed ?
      if (timeElapsed >= timeoutVal)
      {
        CancelIo(_file);
        break;
      }

    }
  }
  
  if (! readDone)
    throwModemException(_("timeout when reading from TA"));

#ifndef NDEBUG
  if (debugLevel() >= 2)
  {
    // some useful debugging code
    if (c == LF)
      cerr << "<LF>";
    else if (c == CR)
      cerr << "<CR>";
    else cerr << "<'" << (char) c << "'>";
    cerr.flush();
  }
#endif
  return c;
}

Win32SerialPort::Win32SerialPort(string device, int lineSpeed,
                               string initString, bool swHandshake)
  throw(GsmException) :
  _oldChar(-1)
{
  int holdoff[] = {2000, 1000, 400};

  // open device
  _file = CreateFile(device.c_str(),GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL );
  if (_file == INVALID_HANDLE_VALUE)
    throwModemException(stringPrintf(_("opening device '%s'"),
                                     device.c_str()));

  int initTries = 3;
  while (initTries-- > 0)
  {
    // flush all pending output
    FlushFileBuffers(_file);

    // toggle DTR to reset modem
    if (!EscapeCommFunction(_file,CLRDTR))
      throwModemException(_("clearing DTR failed"));
    Sleep(holdoff[initTries]);
    if (!EscapeCommFunction(_file,SETDTR))
      throwModemException(_("setting DTR failed"));

    DCB dcb;
    // get line modes
    if (!GetCommState(_file,&dcb))
      throwModemException(stringPrintf(_("GetCommState device '%s'"),
                                       device.c_str()));

//    if (tcgetattr(_fd, &t) < 0)
//      throwModemException(stringPrintf(_("tcgetattr device '%s'"),
//                                       device.c_str()));

    // set the device to a sane state
    dcb.fBinary = TRUE;
    dcb.BaudRate = lineSpeed;

    // n,8,1
    dcb.fParity = FALSE;
    dcb.Parity = 0;
    dcb.ByteSize = 8;
    dcb.StopBits = 0;

    if (!swHandshake)
    {
      dcb.fInX = FALSE;
      dcb.fOutX = FALSE;
      dcb.fOutxDsrFlow = FALSE;
      dcb.fOutxCtsFlow = FALSE;
    }
    else
    {
      dcb.fInX  = TRUE;
      dcb.fOutX = TRUE;
      dcb.fOutxDsrFlow = FALSE;
      dcb.fOutxCtsFlow = FALSE;
    }
    dcb.fDtrControl = DTR_CONTROL_ENABLE;
    dcb.fRtsControl = RTS_CONTROL_ENABLE;
    
//    t.c_iflag |= IGNPAR;
//    t.c_iflag &= ~(INPCK | ISTRIP | IMAXBEL |
//                   (swHandshake ? CRTSCTS : IXON |  IXOFF)
//                   | IXANY | IGNCR | ICRNL | IMAXBEL | INLCR | IGNBRK);
//    t.c_oflag &= ~(OPOST);
//    // be careful, only touch "known" flags
//    t.c_cflag&= ~(CSIZE | CSTOPB | PARENB | PARODD);
//    t.c_cflag|= CS8 | CREAD | HUPCL |
//      (swHandshake ? IXON |  IXOFF : CRTSCTS) |
//      CLOCAL;
//    t.c_lflag &= ~(ECHO | ECHOE | ECHOPRT | ECHOK | ECHOKE | ECHONL |
//                   ECHOCTL | ISIG | IEXTEN | TOSTOP | FLUSHO | ICANON);
//    t.c_lflag |= NOFLSH;
//
//    t.c_cc[VMIN] = 1;
//    t.c_cc[VTIME] = 0;
//
//    t.c_cc[VSUSP] = 0;

    // write back
    if (!SetCommState(_file,&dcb))
      throwModemException(stringPrintf(_("SetCommState device '%s'"),
                                       device.c_str()));

    Sleep(holdoff[initTries]);

    if (!SetupComm(_file,1024,1024))
      throwModemException(stringPrintf(_("SetupComm device '%s'"),
                                       device.c_str()));
 

    // flush all pending input
    PurgeComm(_file,PURGE_RXABORT|PURGE_RXCLEAR);

    try
    {
      // reset modem
      putLine("ATZ");
      bool foundOK = false;
      int readTries = 5;
      while (readTries-- > 0)
      {
        string s = getLine();
        if (s.find("OK") != string::npos ||
            s.find("CABLE: GSM") != string::npos)
        {
          foundOK = true;
          readTries = 0;           // found OK, exit loop
        }
      }

      if (foundOK)
      {
        // init modem
        readTries = 5;
        // !!! no not declare this in loop, compiler error on Visual C++
        // (without SP and with SP4)
        string s; 
        putLine("AT" + initString);
        do
        {
          s = getLine();
          if (s.find("OK") != string::npos ||
              s.find("CABLE: GSM") != string::npos)
            return;                 // found OK, return
        } while(--readTries);
      }
    }
    catch (GsmException &e)
    {
      if (initTries == 0)
        throw e;
    }
  }
  // no response after 3 tries
  throw GsmException(stringPrintf(_("reset modem failed '%s'"),
                                  device.c_str()), OtherError);
}

string Win32SerialPort::getLine() throw(GsmException)
{
  string result;
  int c;
  while ((c = readByte()) > 0)
  {
    while (c == CR)
    {
      c = readByte();
    }
    if (c == LF)
      break;
    result += c;
  }

#ifndef NDEBUG
  if (debugLevel() >= 1)
    cerr << "<-- " << result << endl;
#endif

  return result;
}

void Win32SerialPort::putLine(string line,
                             bool carriageReturn) throw(GsmException)
{
#ifndef NDEBUG
  if (debugLevel() >= 1)
    cerr << "--> " << line << endl;
#endif

  if (carriageReturn) line += CR;
  // !!! BUG, mantain this pointer isn't corrent, use iterator !!!
  const char *l = line.c_str();
  
  FlushFileBuffers(_file);      // flush all pending input and output

  int timeElapsed = 0;

  DWORD bytesWritten = 0;

  ExceptionSafeOverlapped over;

  DWORD initTime = GetTickCount();
  if (!WriteFile(_file,l,line.length(),&bytesWritten,&over))
  {
    if (GetLastError() != ERROR_IO_PENDING)
    {
      throwModemException(_("writing to TA"));
    }

    while(bytesWritten < (DWORD)line.length())
    {
      if (interrupted())
        throwModemException(_("interrupted when writing to TA"));

      // wait another second
      switch(WaitForSingleObject(over.hEvent,1000))
      {
      case WAIT_TIMEOUT:
        break;
      case WAIT_OBJECT_0:
      case WAIT_ABANDONED:
	// !!! do a infinite loop if (bytesWritten < lenght) ?
        GetOverlappedResult(_file,&over,&bytesWritten,TRUE);
        break;
      case WAIT_FAILED:
        throwModemException(_("writing to TA"));
      }

      timeElapsed = (GetTickCount() - initTime)/1000U;

      // timeout elapsed ?
      if (timeElapsed >= timeoutVal)
      {
        CancelIo(_file);
        throwModemException(_("timeout when writing to TA"));
      }

    }
  }

  return;
/*
  // empty buffer
  SetCommMask(_file,EV_TXEMPTY);
  DWORD dwEvent;
  ResetEvent(over.hEvent);
  if( WaitCommEvent(_file,&dwEvent,&over) )
    return; // already empty

  // check true errors
  if (GetLastError() != ERROR_IO_PENDING)
    throwModemException(_("error comm waiting"));

  while(timeElapsed < timeoutVal)
  {
    if (interrupted())
      throwModemException(_("interrupted when flushing to TA"));

    switch( WaitForSingleObject( over.hEvent, 1000 ) ) 
    {
    case WAIT_TIMEOUT:
      break;

    // successfully flushed
    case WAIT_ABANDONED:
    case WAIT_OBJECT_0:
      return;

    default:
      throwModemException(_("error waiting"));
    }
    timeElapsed = (GetTickCount() - initTime)/1000U;
  }

  CancelIo(_file);
  throwModemException(_("timeout when writing to TA"));
*/

  // echo CR LF must be removed by higher layer functions in gsm_at because
  // in order to properly handle unsolicited result codes from the ME/TA
}

bool Win32SerialPort::wait(GsmTime timeout) throw(GsmException)
{
  // See differences from UNIX
  // Why do I use Windows ?
  ExceptionSafeOverlapped over;

  SetCommMask(_file,EV_RXCHAR);
  DWORD dwEvent;
  if( !WaitCommEvent(_file,&dwEvent,&over) )
  {
    // check true errors
    if (GetLastError() != ERROR_IO_PENDING)
      throwModemException(_("error comm waiting"));

    switch( WaitForSingleObject( over.hEvent, timeout->tv_sec*1000U+timeout->tv_usec ) ) 
    {
    case WAIT_TIMEOUT:
      CancelIo(_file);
      return false;

    case WAIT_ABANDONED:
    case WAIT_OBJECT_0:
      return true;

    default:
      throwModemException(_("error waiting"));
    }
  }

  return true;
}

void Win32SerialPort::setTimeOut(unsigned int timeout)
{
  timeoutVal = timeout;
}

Win32SerialPort::~Win32SerialPort()
{
  if ( _file != INVALID_HANDLE_VALUE)
    CloseHandle(_file);
}

int gsmlib::baudRateStrToSpeed(string baudrate) throw(GsmException)
{
  if (baudrate == "300")
    return 300;
  else if (baudrate == "600")
    return 600;
  else if (baudrate == "1200")
    return 1200;
  else if (baudrate == "2400")
    return 2400;
  else if (baudrate == "4800")
    return 4800;
  else if (baudrate == "9600")
    return 9600;
  else if (baudrate == "19200")
    return 19200;
  else if (baudrate == "38400")
    return 38400;
  else if (baudrate == "57600")
    return 57600;
  else if (baudrate == "115200")
    return 115200;
  else
    throw GsmException(stringPrintf(_("unknown baudrate '%s'"),
                                    baudrate.c_str()), ParameterError);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产亚洲一区二区在线观看| 91网页版在线| 国产成人精品免费| 成年人国产精品| 在线免费观看日本欧美| 日韩视频免费观看高清完整版在线观看 | 成人精品鲁一区一区二区| 91在线观看高清| 欧美一区二区三区免费大片| 中文字幕精品综合| 一区二区三区久久| 久久99久国产精品黄毛片色诱| 国产不卡视频在线播放| 欧美日免费三级在线| 国产亚洲制服色| 亚洲成人av一区二区三区| 国产伦精品一区二区三区免费 | 亚洲色图在线视频| 高清不卡一二三区| 一本久久综合亚洲鲁鲁五月天 | 国产在线精品免费| 色婷婷国产精品| 亚洲精品在线观看网站| 一区二区三区在线影院| 久久国产剧场电影| 91福利小视频| 国产亚洲va综合人人澡精品| 亚洲成av人片一区二区| kk眼镜猥琐国模调教系列一区二区 | 亚洲男帅同性gay1069| 久草精品在线观看| 欧美色综合久久| 国产精品护士白丝一区av| 激情综合网天天干| 欧美日韩国产一级片| 国产精品三级电影| 精品系列免费在线观看| 欧美色欧美亚洲另类二区| 亚洲国产成人自拍| 寂寞少妇一区二区三区| 欧美日韩黄视频| 亚洲精品高清在线观看| 大陆成人av片| 久久精品一区二区| 日韩精品福利网| 欧美性xxxxx极品少妇| 中文字幕日韩欧美一区二区三区| 国产在线观看一区二区| 91精品国产手机| 亚洲成人一区二区| 色婷婷综合久久久中文一区二区| 欧美极品少妇xxxxⅹ高跟鞋 | 久久天堂av综合合色蜜桃网| 男男视频亚洲欧美| 欧美日韩在线免费视频| 亚洲摸摸操操av| 99精品1区2区| 国产精品久久久久久妇女6080| 国产乱码字幕精品高清av| 欧美一级专区免费大片| 日韩高清在线不卡| 欧美高清视频一二三区| 日韩国产精品久久| 7777精品伊人久久久大香线蕉的 | 日韩一级黄色片| 综合久久给合久久狠狠狠97色| 国产成人综合精品三级| 久久色视频免费观看| 精品无码三级在线观看视频| 精品奇米国产一区二区三区| 美女性感视频久久| 精品久久国产字幕高潮| 久久超碰97中文字幕| 欧美成人艳星乳罩| 精品一区二区日韩| 欧美电影免费观看高清完整版| 免费在线观看视频一区| 日韩三级在线观看| 国内不卡的二区三区中文字幕| 久久免费看少妇高潮| 粉嫩嫩av羞羞动漫久久久 | 波多野结衣在线一区| 中文字幕日韩一区二区| 色综合天天综合网国产成人综合天| 亚洲色图视频免费播放| 91国内精品野花午夜精品| 亚洲1区2区3区视频| 欧美一二三四在线| 国产一区在线看| 国产精品人妖ts系列视频| 97精品国产露脸对白| 亚洲图片自拍偷拍| 欧美精品日日鲁夜夜添| 久久av资源网| 欧美国产日产图区| 色婷婷av一区| 日产国产欧美视频一区精品| 日韩精品一区二区三区在线观看| 韩国在线一区二区| 国产精品灌醉下药二区| 欧美三级中文字幕| 久久99国产精品麻豆| 国产人成亚洲第一网站在线播放| 99精品国产视频| 日韩中文字幕麻豆| 26uuu国产在线精品一区二区| av中文字幕一区| 天堂成人免费av电影一区| 精品国产91久久久久久久妲己| 不卡的av电影在线观看| 亚洲成国产人片在线观看| 欧美一级xxx| 97精品久久久午夜一区二区三区| 偷拍一区二区三区| 欧美精品一区二区精品网| 97久久精品人人做人人爽50路| 天天操天天干天天综合网| 久久综合狠狠综合久久综合88| 91视频国产观看| 六月丁香婷婷久久| 亚洲免费在线电影| 精品久久久久久无| 色播五月激情综合网| 久久99精品一区二区三区三区| 一色桃子久久精品亚洲| 91精品国产高清一区二区三区蜜臀 | 欧美久久一二三四区| 国产乱人伦偷精品视频免下载| 亚洲精品免费在线播放| 日韩精品一区二区三区视频在线观看| 成人app在线| 精品一区二区三区在线播放视频 | 色偷偷久久一区二区三区| 九九视频精品免费| 亚洲人精品午夜| 久久久久久久久久久久久夜| 欧美日韩高清一区二区三区| 99麻豆久久久国产精品免费优播| 免费在线观看一区| 亚洲激情欧美激情| 国产欧美一区二区三区在线老狼| www.欧美精品一二区| 蜜臀av一级做a爰片久久| 亚洲精品视频在线看| 日韩女优av电影在线观看| 在线中文字幕一区| 高清久久久久久| 麻豆精品在线看| 亚洲一区二区不卡免费| 国产精品网站导航| 欧美精品一区二区三区在线| 欧美三级在线看| 9l国产精品久久久久麻豆| 狠狠色综合色综合网络| 天堂影院一区二区| 亚洲黄色免费网站| 亚洲欧美aⅴ...| 中文字幕亚洲成人| 日本一区二区三区久久久久久久久不 | 中文字幕一区二区三区不卡在线| 精品国产伦一区二区三区观看体验 | 五月天一区二区| 樱桃视频在线观看一区| 国产精品灌醉下药二区| 国产欧美精品区一区二区三区 | 国产99久久久国产精品潘金| 日韩成人免费在线| 亚洲成人在线观看视频| 亚洲男人都懂的| 亚洲国产经典视频| 国产精品美女久久久久久| 久久久久久一级片| 久久久91精品国产一区二区精品| 精品福利av导航| 日韩欧美你懂的| 日韩欧美中文字幕精品| 5566中文字幕一区二区电影| 欧美福利一区二区| 欧洲生活片亚洲生活在线观看| 99久久精品国产毛片| 97久久人人超碰| 色哟哟在线观看一区二区三区| 99久久精品国产麻豆演员表| 成人午夜又粗又硬又大| 成人精品视频一区| www.爱久久.com| 色妹子一区二区| 欧美在线视频你懂得| 欧美色男人天堂| 91精品国产乱| 精品国产网站在线观看| 国产欧美一区二区在线| 国产精品国产三级国产专播品爱网 | 精品夜夜嗨av一区二区三区| 精品一区二区免费| 国产乱人伦偷精品视频不卡| 菠萝蜜视频在线观看一区| 色综合久久综合网欧美综合网| 日本国产一区二区| 色婷婷av一区|