首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Windows Mobile >

Windows Mobile 打开串口失败,该怎么解决

2012-03-09 
Windows Mobile 打开串口失败菜鸟提问:windows mobile6.1 打开串口的时候失败,用GetLastError看了一下返回

Windows Mobile 打开串口失败
菜鸟提问:windows mobile6.1 打开串口的时候失败,用GetLastError看了一下返回值是6,百度到6对应的错误是:无效句柄。
有没有高手知道怎么回事。
代码如下:

调用:
  CommPort cp = new CommPort();
  cp.Open();


  /// <summary> 
  /// 这是一个关于调用串口的类 
  /// </summary> 
  public class CommPort
  {

  public int PortNum = 1;
  public int BaudRate = 9600;
  public byte ByteSize = 8;
  public byte Parity = 0; // 0-4=no,odd,even,mark,space  
  public byte StopBits = 0; // 0,1,2 = 1, 1.5, 2  
  public int ReadTimeout = 0;

  //comm port win32 file handle 
  private int hComm = -1;

  public bool Opened = false;

  //win32 api constants 
  private const uint GENERIC_READ = 0x80000000;
  private const uint GENERIC_WRITE = 0x40000000;
  private const int OPEN_EXISTING = 3;
  private const int INVALID_HANDLE_VALUE = -1;

  [StructLayout(LayoutKind.Sequential)]
  public struct DCB
  {
  //taken from c struct in platform sdk  
  public int DCBlength; // sizeof(DCB)  
  public int BaudRate; // current baud rate 
  /* these are the c struct bit fields, bit twiddle flag to set 
  public int fBinary; // binary mode, no EOF check  
  public int fParity; // enable parity checking  
  public int fOutxCtsFlow; // CTS output flow control  
  public int fOutxDsrFlow; // DSR output flow control  
  public int fDtrControl; // DTR flow control type  
  public int fDsrSensitivity; // DSR sensitivity  
  public int fTXContinueOnXoff; // XOFF continues Tx  
  public int fOutX; // XON/XOFF out flow control  
  public int fInX; // XON/XOFF in flow control  
  public int fErrorChar; // enable error replacement  
  public int fNull; // enable null stripping  
  public int fRtsControl; // RTS flow control  
  public int fAbortOnError; // abort on error  
  public int fDummy2; // reserved  
  */
  public uint flags;
  public ushort wReserved; // not currently used  
  public ushort XonLim; // transmit XON threshold  
  public ushort XoffLim; // transmit XOFF threshold  
  public byte ByteSize; // number of bits/byte, 4-8  
  public byte Parity; // 0-4=no,odd,even,mark,space  
  public byte StopBits; // 0,1,2 = 1, 1.5, 2  
  public char XonChar; // Tx and Rx XON character  
  public char XoffChar; // Tx and Rx XOFF character  


  public char ErrorChar; // error replacement character  
  public char EofChar; // end of input character  
  public char EvtChar; // received event character  
  public ushort wReserved1; // reserved; do not use  
  }

  [StructLayout(LayoutKind.Sequential)]
  private struct COMMTIMEOUTS
  {
  public int ReadIntervalTimeout;
  public int ReadTotalTimeoutMultiplier;
  public int ReadTotalTimeoutConstant;
  public int WriteTotalTimeoutMultiplier;
  public int WriteTotalTimeoutConstant;
  }

  [StructLayout(LayoutKind.Sequential)]
  private struct OVERLAPPED
  {
  public int Internal;
  public int InternalHigh;
  public int Offset;
  public int OffsetHigh;
  public int hEvent;
  }

  [DllImport("kernel32.dll ")]
  private static extern int CreateFile(
  string lpFileName, // file name 
  uint dwDesiredAccess, // access mode 
  int dwShareMode, // share mode 
  int lpSecurityAttributes, // SD 
  int dwCreationDisposition, // how to create 
  int dwFlagsAndAttributes, // file attributes 
  int hTemplateFile // handle to template file
  );

  [DllImport("kernel32.dll ")]
  private static extern bool GetCommState(
  int hFile, // handle to communications device 
  ref DCB lpDCB // device-control block 
  );

  [DllImport("kernel32.dll ")]
  private static extern bool BuildCommDCB(
  string lpDef, // device-control string 
  ref DCB lpDCB // device-control block 
  );

  [DllImport("kernel32.dll ")]
  private static extern bool SetCommState(
  int hFile, // handle to communications device 
  ref DCB lpDCB // device-control block 
  );

  [DllImport("kernel32.dll ")]
  private static extern bool GetCommTimeouts(
  int hFile, // handle to comm device 
  ref COMMTIMEOUTS lpCommTimeouts // time-out values 
  );

  [DllImport("kernel32.dll ")]
  private static extern bool SetCommTimeouts(
  int hFile, // handle to comm device 
  ref COMMTIMEOUTS lpCommTimeouts // time-out values 
  );

  [DllImport("kernel32.dll ")]
  private static extern bool ReadFile(
  int hFile, // handle to file 
  byte[] lpBuffer, // data buffer 
  int nNumberOfBytesToRead, // number of bytes to read 


  ref int lpNumberOfBytesRead, // number of bytes read 
  ref OVERLAPPED lpOverlapped // overlapped buffer 
  );

  [DllImport("kernel32.dll ")]
  private static extern bool WriteFile(
  int hFile, // handle to file 
  byte[] lpBuffer, // data buffer 
  int nNumberOfBytesToWrite, // number of bytes to write 
  ref int lpNumberOfBytesWritten, // number of bytes written 
  ref OVERLAPPED lpOverlapped // overlapped buffer 
  );

  [DllImport("kernel32.dll ")]
  private static extern bool CloseHandle(
  int hObject // handle to object 
  );

  [DllImport("kernel32.dll ")]
  private static extern uint GetLastError();



[解决办法]
CE 下要这样使用串口,例如:COM1:

WM 没用过。
[解决办法]
一、 首先保证你的代码没有逻辑错误,比如函数调用是不是穿得参数都对(最大可能的原因,比如C++, COM1: 你少写了冒号等等之类的。。。)

二、这个串口是不是在其他地方已经被打开了,如果打开了,没有关,那么这里你肯定是打不开的(很可能是这里的问题)

三、串口驱动是否加载上,看一下注册表active下面有没有你要打开串口的驱动(一般这里不会出问题)


如果这三条都没问题,那么你就要看看是不是硬件问题。

热点排行