社区导航

 

搜索
查看: 4735|回复: 17

wince中C#读取GPS数据的问题

[复制链接]

71

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-9-2 12:41 | 显示全部楼层 |阅读模式
想用C#直接读取GPS数据,在网上查到了相关代码,很全面的,[url=http://www.wangchao.net.cn/bbsdetail_73074.html][/url]修改过后一直有问题,麻烦各位大侠帮俺看下~~
问题部分:

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

  3.         //win32 api constants
  4.         private const int INVALID_HANDLE_VALUE = -1;

  5.      [DllImport("coredll.dll")]
  6.       private static extern int CreateFile(
  7.        string lpFileName,                         // 要打开的串口名称
  8.        uint dwDesiredAccess,                      // 指定串口的访问方式,一般设置为可读可写方式
  9.        int dwShareMode,                          // 指定串口的共享模式,串口不能共享,所以设置为0
  10.        int lpSecurityAttributes,                 // 设置串口的安全属性,WIN9X下不支持,应设为NULL
  11.        int dwCreationDisposition,                // 对于串口通信,创建方式只能为OPEN_EXISTING
  12.        int dwFlagsAndAttributes,                 // 指定串口属性与标志,设置为FILE_FLAG_OVERLAPPED(重叠I/O操作),指定串口以异步方式通信
  13.        int hTemplateFile                        // 对于串口通信必须设置为NULL
  14.        );

  15. // 在open()中 打开串口 OPEN THE COMM PORT.
  16.            hComm = CreateFile(PortNum, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
  17.           if (hComm == INVALID_HANDLE_VALUE)
  18.            {
  19.                throw (new ApplicationException("非法操作,不能打开串口!"));
  20.            }

复制代码

发现在CreatFile后hComm仍然是-1,所以一直不能打开串口,是为什么呢?
此帖出自WindowsCE论坛

102

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-9-2 12:45 | 显示全部楼层
看看GetLastError()返回什么值?

PortNum的值又是什么呢?

回复

使用道具 举报

100

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-9-2 14:05 | 显示全部楼层
引用 1 楼 91program 的回复:
看看GetLastError()返回什么值?

PortNum的值又是什么呢?

GetLastError()返回句柄错误,PortNum是端口号

回复

使用道具 举报

78

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-9-2 14:06 | 显示全部楼层
首先检查IO配置是否正确,然后判断PortNum的值是否正确.
应先排除硬件原因,才考虑软件问题.

回复

使用道具 举报

114

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-9-2 14:10 | 显示全部楼层
你有对端口赋值吗?  

回复

使用道具 举报

121

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-9-2 14:11 | 显示全部楼层
马上要做,顶起,我是准备用.NET的那个串口类来做的,不过还没设备,没做过实验,建议楼主改下端口配置试试。

回复

使用道具 举报

110

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-9-2 14:15 | 显示全部楼层
端口赋值了~~测试用的PDA接收GPS信号的端口号是COM7,我就给的COM7

回复

使用道具 举报

114

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-9-2 14:22 | 显示全部楼层
我一般直接用串口类来做,只要IO配置好,很简单的.

回复

使用道具 举报

96

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-9-2 14:27 | 显示全部楼层
给楼主一个发送的小例子看下.应该没有问题的,只要端口设置对,波特率选则正确.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace Mycekeytest
{
    public partial class RTC : Form
    {
        public RTC()
        {
            InitializeComponent();
            serialPort1.PortName = "com3";
            serialPort1.BaudRate = 57600;
            serialPort1.Open();
        }
        private void timer1_Tick(object sender, EventArgs e)
        {

            try
            {
                label1.Text = DateTime.Now.ToLongDateString();
                label2.Text = DateTime.Now.ToLongTimeString();
                StreamWriter sw = new StreamWriter("\\NAND Flash\\Rtc.txt", true);
                sw.WriteLine(DateTime.Now);
                sw.Close();
                serialPort1.WriteLine(DateTime.Now.ToLongTimeString());
            }
            catch (DirectoryNotFoundException ex)
            {
                MessageBox.Show("未找到NAND Flash");
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            timer1.Enabled = false;
            this.DialogResult = DialogResult.OK;
        }
    }
}

回复

使用道具 举报

99

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-9-2 14:36 | 显示全部楼层
多谢楼上哩~~~只是在open()的时候就已经出问题了,就不能再接收后面的数据了……
对于网上找到的例子我也只是稍做修改,打开串口这里基本没改,只是配置了串口号而已(改后的串口号和波特率是用其它gps软件在此pda上接收成功的),怎么就不对了呢

回复

使用道具 举报

105

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-9-2 15:36 | 显示全部楼层
是不是这个端口号和波特率跟其它应用程序的不一样?

回复

使用道具 举报

50

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-9-2 15:38 | 显示全部楼层
建议代码贴全一点.

回复

使用道具 举报

97

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-9-2 17:06 | 显示全部楼层
因为都是用的[url=http://www.wangchao.net.cn/bbsdetail_73074.html][/url]里面的代码,所以没多贴 呵呵

  1. //==============类===============================
  2. class Cgps
  3.     {
  4.         public string PortNum;
  5.         public int BaudRate;
  6.         public byte ByteSize;
  7.         public byte Parity; // 0-4=no,odd,even,mark,space
  8.         public byte StopBits; // 0,1,2 = 1, 1.5, 2
  9.         public int ReadTimeout;
  10.       
  11.         //comm port win32 file handle
  12.         private int hComm = -1;
  13.         public bool Opened = false;
  14.         //win32 api constants
  15.         private const uint GENERIC_READ = 0x80000000;
  16.         private const uint GENERIC_WRITE = 0x40000000;
  17.         private const int OPEN_EXISTING = 3;  
  18.         private const int INVALID_HANDLE_VALUE = -1;
  19.       [StructLayout(LayoutKind.Sequential)]
  20.        public struct DCB
  21.       {
  22.            //taken from c struct in platform sdk
  23.            public int DCBlength;           // sizeof(DCB)
  24.            public int BaudRate;            // 指定当前波特率 current baud rate
  25.            // these are the c struct bit fields, bit twiddle flag to set
  26.            public int fBinary;          // 指定是否允许二进制模式,在windows95中必须主TRUE binary mode, no EOF check
  27.            public int fParity;          // 指定是否允许奇偶校验 enable parity checking
  28.            public int fOutxCtsFlow;      // 指定CTS是否用于检测发送控制,当为TRUE是CTS为OFF,发送将被挂起。 CTS output flow control
  29.            public int fOutxDsrFlow;      // 指定CTS是否用于检测发送控制 DSR output flow control
  30.            public int fDtrControl;       // DTR_CONTROL_DISABLE值将DTR置为OFF, DTR_CONTROL_ENABLE值将DTR置为ON, DTR_CONTROL_HANDSHAKE允许DTR"握手" DTR flow control type
  31.            public int fDsrSensitivity;   // 当该值为TRUE时DSR为OFF时接收的字节被忽略 DSR sensitivity
  32.            public int fTXContinueOnXoff; // 指定当接收缓冲区已满,并且驱动程序已经发送出XoffChar字符时发送是否停止。TRUE时,在接收缓冲区接收到缓冲区已满的字节XoffLim且驱动程序已经发送出XoffChar字符中止接收字节之后,发送继续进行。 FALSE时,在接收缓冲区接收到代表缓冲区已空的字节XonChar且驱动程序已经发送出恢复发送的XonChar之后,发送继续进行。XOFF continues Tx
  33.            public int fOutX;          // TRUE时,接收到XoffChar之后便停止发送接收到XonChar之后将重新开始 XON/XOFF out flow control
  34.            public int fInX;           // TRUE时,接收缓冲区接收到代表缓冲区满的XoffLim之后,XoffChar发送出去接收缓冲区接收到代表缓冲区空的XonLim之后,XonChar发送出去 XON/XOFF in flow control
  35.            public int fErrorChar;     // 该值为TRUE且fParity为TRUE时,用ErrorChar 成员指定的字符代替奇偶校验错误的接收字符 enable error replacement
  36.            public int fNull;          // eTRUE时,接收时去掉空(0值)字节 enable null stripping
  37.            public int fRtsControl;     // RTS flow control
  38.            public int fAbortOnError;   // TRUE时,有错误发生时中止读和写操作              public int fDummy2;        // 未使用 reserved  
  39.            public uint flags;
  40.            public ushort wReserved;          // 未使用,必须为0 not currently used
  41.            public ushort XonLim;             // 指定在XON字符发送这前接收缓冲区中可允许的最小字节数 transmit XON threshold
  42.            public ushort XoffLim;            // 指定在XOFF字符发送这前接收缓冲区中可允许的最小字节数 transmit XOFF threshold
  43.            public byte ByteSize;           // 指定端口当前使用的数据位 number of bits/byte, 4-8
  44.            public byte Parity;             // 指定端口当前使用的奇偶校验方法,可能为:EVENPARITY,MARKPARITY,NOPARITY,ODDPARITY  0-4=no,odd,even,mark,space
  45.            public byte StopBits;           // 指定端口当前使用的停止位数,可能为:ONESTOPBIT,ONE5STOPBITS,TWOSTOPBITS  0,1,2 = 1, 1.5, 2
  46.            public char XonChar;            // 指定用于发送和接收字符XON的值 Tx and Rx XON character
  47.            public char XoffChar;           // 指定用于发送和接收字符XOFF值 Tx and Rx XOFF character
  48.            public char ErrorChar;          // 本字符用来代替接收到的奇偶校验发生错误时的值 error replacement character
  49.            public char EofChar;            // 当没有使用二进制模式时,本字符可用来指示数据的结束 end of input character
  50.            public char EvtChar;            // 当接收到此字符时,会产生一个事件 received event character
  51.            public ushort wReserved1;         // 未使用 reserved; do not use
  52.       }
  53.       [StructLayout(LayoutKind.Sequential)]
  54.        private struct COMMTIMEOUTS
  55.       {  
  56.            public int ReadIntervalTimeout;
  57.            public int ReadTotalTimeoutMultiplier;
  58.            public int ReadTotalTimeoutConstant;
  59.            public int WriteTotalTimeoutMultiplier;
  60.            public int WriteTotalTimeoutConstant;
  61.       }  
  62.       [StructLayout(LayoutKind.Sequential)]
  63.        private struct OVERLAPPED
  64.       {
  65.            public int  Internal;
  66.            public int  InternalHigh;
  67.            public int  Offset;
  68.            public int  OffsetHigh;
  69.            public int hEvent;
  70.       }      
  71.       [DllImport("coredll.dll")]
  72.       private static extern int CreateFile(
  73.        string lpFileName,                         // 要打开的串口名称
  74.        uint dwDesiredAccess,                      // 指定串口的访问方式,一般设置为可读可写方式
  75.        int dwShareMode,                          // 指定串口的共享模式,串口不能共享,所以设置为0
  76.        int lpSecurityAttributes,                 // 设置串口的安全属性,WIN9X下不支持,应设为NULL
  77.        int dwCreationDisposition,                // 对于串口通信,创建方式只能为OPEN_EXISTING
  78.        int dwFlagsAndAttributes,                 // 指定串口属性与标志,设置为FILE_FLAG_OVERLAPPED(重叠I/O操作),指定串口以异步方式通信
  79.        int hTemplateFile                        // 对于串口通信必须设置为NULL
  80.        );
  81.       [DllImport("coredll.dll")]
  82.       private static extern bool GetCommState(
  83.        int hFile,  //通信设备句柄
  84.        ref DCB lpDCB    // 设备控制块DCB
  85.        );
  86.       [DllImport("coredll.dll")]
  87.       private static extern bool BuildCommDCB(
  88.        string lpDef,  // 设备控制字符串
  89.        ref DCB lpDCB     // 设备控制块
  90.        );
  91.       [DllImport("coredll.dll")]
  92.       private static extern bool SetCommState(
  93.        int hFile,  // 通信设备句柄
  94.        ref DCB lpDCB    // 设备控制块
  95.        );
  96.       [DllImport("coredll.dll")]
  97.       private static extern bool GetCommTimeouts(
  98.        int hFile,                  // 通信设备句柄 handle to comm device
  99.        ref COMMTIMEOUTS lpCommTimeouts  // 超时时间 time-out values
  100.        );
  101.       [DllImport("coredll.dll")]
  102.       private static extern bool SetCommTimeouts(
  103.        int hFile,                  // 通信设备句柄 handle to comm device
  104.        ref COMMTIMEOUTS lpCommTimeouts  // 超时时间 time-out values
  105.        );
  106.       [DllImport("coredll.dll")]
  107.       private static extern bool ReadFile(
  108.        int hFile,                // 通信设备句柄 handle to file
  109.        byte[] lpBuffer,             // 数据缓冲区 data buffer
  110.        int nNumberOfBytesToRead,  // 多少字节等待读取 number of bytes to read
  111.        ref int lpNumberOfBytesRead, // 读取多少字节 number of bytes read
  112.        ref OVERLAPPED lpOverlapped    // 溢出缓冲区 overlapped buffer
  113.        );
  114.       [DllImport("coredll.dll")]
  115.       private static extern bool WriteFile(
  116.        int hFile,                    // 通信设备句柄 handle to file
  117.        byte[] lpBuffer,                // 数据缓冲区 data buffer
  118.        int nNumberOfBytesToWrite,     // 多少字节等待写入 number of bytes to write
  119.        ref int lpNumberOfBytesWritten,  // 已经写入多少字节 number of bytes written
  120.        ref OVERLAPPED lpOverlapped        // 溢出缓冲区 overlapped buffer
  121.        );
  122.       [DllImport("coredll.dll")]
  123.       private static extern bool CloseHandle(
  124.        int hObject   // handle to object
  125.        );
  126.       [DllImport("coredll.dll")]
  127.       private static extern uint GetLastError();
  128.       public void Open()
  129.       {
  130.            DCB dcbCommPort = new DCB();
  131.            COMMTIMEOUTS ctoCommPort = new COMMTIMEOUTS();

  132.            // 打开串口 OPEN THE COMM PORT.
  133.            hComm = CreateFile(PortNum, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);

  134.            MessageBox.Show(PortNum.ToString());

  135.            //// 如果串口没有打开,就打开 IF THE PORT CANNOT BE OPENED, BAIL OUT.
  136.            if (hComm == INVALID_HANDLE_VALUE)
  137.            {
  138.                System.UInt32 err = GetLastError();
  139.                MessageBox.Show(err.ToString());
  140.                //throw (new ApplicationException("非法操作,不能打开串口!"));
  141.            }
  142.       
  143.            // 设置通信超时时间 SET THE COMM TIMEOUTS.
  144.            GetCommTimeouts(hComm,ref ctoCommPort);
  145.            ctoCommPort.ReadTotalTimeoutConstant = ReadTimeout;
  146.            ctoCommPort.ReadTotalTimeoutMultiplier = 0;
  147.            ctoCommPort.WriteTotalTimeoutMultiplier = 0;
  148.            ctoCommPort.WriteTotalTimeoutConstant = 0;  
  149.            SetCommTimeouts(hComm,ref ctoCommPort);
  150.          
  151.            // 设置串口 SET BAUD RATE, PARITY, WORD SIZE, AND STOP BITS.
  152.            GetCommState(hComm, ref dcbCommPort);
  153.            dcbCommPort.BaudRate=BaudRate;
  154.            dcbCommPort.flags=0;
  155.            //dcb.fBinary=1;
  156.            dcbCommPort.flags|=1;
  157.            if (Parity>0)
  158.            {
  159.                 //dcb.fParity=1
  160.                 dcbCommPort.flags|=2;
  161.            }
  162.            dcbCommPort.Parity=Parity;
  163.            dcbCommPort.ByteSize=ByteSize;
  164.            dcbCommPort.StopBits=StopBits;
  165.            if (!SetCommState(hComm, ref dcbCommPort))
  166.            {
  167.             throw(new ApplicationException("aa非法操作,不能打开串口!"));
  168.            }
  169.            Opened = true;
  170.       }
  171. //======================调用部分===================================
  172.      private void Form1_Load(object sender, EventArgs e)
  173.      {
  174.         OpenGps("COM7");
  175.      }
  176.      private void OpenGps(string ComPoint)
  177.      {
  178.             cgps.PortNum=ComPoint;
  179.             //cgps.BaudRate = uintbR;
  180.             cgps.BaudRate = 9600;
  181.             cgps.ByteSize=8;
  182.             cgps.Parity=0;
  183.             cgps.StopBits=1;
  184.             cgps.ReadTimeout=1000;
  185.             try
  186.             {
  187.                 if (cgps.Opened)
  188.                 {
  189.                     cgps.Close();
  190.                     cgps.Open();
  191.                     gpsRead();
  192.                 }
  193.                 else
  194.                 {
  195.                     cgps.Open();//打开串口
  196.                     gpsRead();
  197.                 }
  198.             }
  199.             catch(Exception e)
  200.             {
  201.                 MessageBox.Show(e.Message);
  202.             }
  203. }
复制代码

回复

使用道具 举报

121

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-9-2 17:08 | 显示全部楼层
发了才发现少了一句: [code]

回复

使用道具 举报

125

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-9-3 09:31 | 显示全部楼层
我把端口号和波特率差不多都试了一遍,看来不是没有设置正确的端口号和波特率的问题?

回复

使用道具 举报

101

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-9-3 16:09 | 显示全部楼层
友情帮顶...

回复

使用道具 举报

104

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-9-3 16:16 | 显示全部楼层
OpenGps("COM7:");

在CE下,不能少最后的:

回复

使用道具 举报

126

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-9-3 16:32 | 显示全部楼层
之前我也加过“:”的,也不行的,楼上说了就行了…… 多谢多谢~~

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐上一条 1/7 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2020-6-1 17:19 , Processed in 0.523784 second(s), 38 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表