用DataReceive读取串口的数据,自定义收发协议,可以正常发送。
但是接收的时候,如果在datareceive中加上断点进行单步调试,就可以收到其他手机发来的短信内容;
如果不加断点直接运行,就没有反应,接收不到短信内容。
各位大侠有没有碰到过?帮忙提示一下是怎么回事,谢谢。

解决方案 »

  1.   

    中间加 Thread.Sleep(200);  // 200可以调整
      

  2.   

     serialPort.NewLine = ""; //如果有行结束符标记就设定
     string a = serialPort.ReadLine();
     serialPort.DiscardInBuffer();
      

  3.   


            /// <summary>
            /// 接收到数据时触发该事件
            /// </summary>
            private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
            {
                MethodInvoker miReceivedData = new MethodInvoker(InvokeReceivedData);
                try
                {
                    System.Threading.Thread.Sleep(200);
                    string data = this.serialPort1.ReadExisting();
                    //下面略……
      

  4.   

    发送的时候有延时,只是接收的时候,延时应该放在哪里?因为根本就不进入datareceive啊?
      

  5.   

    datareceive中有休眠处理,只是接收短信的时候,直接运行根本就不进入datareceive?
    是需要在其他地方放休眠等待吗?
      

  6.   

    是同步还是异步,没有源码,不知你怎么写的,说不准.
    试试:SerialPort serialPort = (SerialPort)serialPortobj;
    System.Threading.Thread.Sleep(500);
    try
    {
        txtReceive.Text =   serialPort.ReadExisting();
    }
    catch (Exception e)
    {
        MessageBox.Show(e.Message);
        //处理错误
    }
    参考一下网上是怎么写的:c#serialport类实现串口通信的源代码
      

  7.   

    我也在做这方面的东西,我想问下楼主读的是nokia的手机嘛?
      

  8.   

     
    to:wapit,我参考你的意见在datareceived中加了methodinvoker委托,在InvokeReceivedData中进行了延迟500ms的处理,可以直接接收到内容了,可是接收到的内容却不完整了。请问你在委托里处理什么?怎么养保证接收到完整的内容。
      

  9.   

    我的代码和wapit的类似,看了你连接的例子,不是一种方法,我是用DataReceived事件自动开启一个辅助线程进行读串口数据的。一会试试看链接里面的方法,看能不能解决问题。
    下面这个是部分代码:
     private void ConnectSMS()
            {
                if (SpSMS.IsOpen)
                {
                    SpSMS.Close();
                    bSMSSucceed = false;
                }
                SpSMS.PortName = sSMSCom;
                SpSMS.BaudRate = int.Parse(sSMSBand);
                SpSMS.RtsEnable = true;
                SpSMS.DtrEnable = true;//??
                SpSMS.WriteTimeout = 1000;//写超时,如果底层串口驱动效率问题,能有效的避免死锁 
                SpSMS.ReadTimeout = 1000;//读超时,同上
                //SpSMS.NewLine = "";//如果有行结束符标记就设定 
                //SpSMS.Handshake = Handshake.RequestToSendXOnXOff;
                //SpSMS.Handshake = Handshake.XOnXOff;//
                if (sSMSParity == "None")
                    SpSMS.Parity = Parity.None;
                else
                {
                    if (sSMSParity == "Odd")
                        SpSMS.Parity = Parity.Odd;
                    else
                    {
                        if (sSMSParity == "Even")
                            SpSMS.Parity = Parity.Even;
                        else
                        {
                            if (sSMSParity == "Mark")
                                SpSMS.Parity = Parity.Mark;
                            else
                                SpSMS.Parity = Parity.Space;
                        }
                    }
                }
                
                if (sSMSStops == "None")
                    SpSMS.StopBits = StopBits.None;
                else
                {
                    if (sSMSStops == "One")
                        SpSMS.StopBits = StopBits.One;
                    else
                    {
                        if (sSMSStops == "Two")
                            SpSMS.StopBits = StopBits.Two;
                        else
                            SpSMS.StopBits = StopBits.OnePointFive;
                    }
                }
                //
                SpSMS.DataReceived += new SerialDataReceivedEventHandler(SpSMS_DataReceived);
                SpSMS.ReceivedBytesThreshold = 1;//设置引发OnComm事件的字节长度
                
                try
                {
                    SpSMS.Open();
                    
                    SpSMS.WriteLine("AT\r\n");              
                    Thread.Sleep(100);  
                    SpSMS.WriteLine("AT+CNMI=2,2\r\n");
                    Thread.Sleep(100);           
                    SpSMS.WriteLine("AT+CMGF=0\r\n");
                    bSMSSucceed = true;
                    SetSMSStatus();
                    
                }
                catch
                {
                    bSMSSucceed = false;        
                }
            }
     //发送接收短信处理事件
            public void SpSMS_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                MethodInvoker miReceivedData = new MethodInvoker(InvokeReceivedData);
                System.Threading.Thread.Sleep(200);
                m_sReadSMS = SpSMS.ReadExisting();
     ///发短信:">"字符后面跟这将要发送的内容
                if (m_sReadSMS.IndexOf(">") > 0)
                {
    ...
    }else
    {
     if (m_sReadSMS.IndexOf("002A") > 0)    //    002A为收到内容的标识
                {
                        try
                        {
                            MessageBox.Show(m_sReadSMS);//此处显示出来接收的内容不完整
                            ///收短信
                            if (m_sReadSMS.IndexOf("+CMT") > 0)
    {
    ...
    }
    ...
    }
    }
    }
    }
      

  10.   

    看了你的代码,基本上对路了。 SerialPort自带有DataReceived事件,在事件里面写处理代码就行了。我的InvokeReceivedData里面实际没做什么处理了,就是把接收到的数据显示在界面上一个文本框里面……
      

  11.   

    我的初始化代码就这些了:serialPort1.PortName = comboBox1.Text;
    serialPort1.BaudRate = int.Parse(comboBox2.Text);
    serialPort1.Encoding = Encoding.ASCII;
    serialPort1.RtsEnable = true;
    serialPort1.Open();
    另外,我发现你用的类似SpSMS.WriteLine("AT\r\n"); 这样写的数据,实际上要不WriteLine("AT");, 要不Write("AT\r"),不知道这个是否会有影响到你数据的接收。
      

  12.   

    这几个代码并没有什么,另外writeline也没有问题,去掉\r\n也是这样的。
    你在委托里做了什么呢?
      

  13.   

    我的就这样处理的,没你那么多的判断。你检查下 /// <summary>
            /// 接收到数据时触发该事件
            /// </summary>
            private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
            {
                MethodInvoker miReceivedData = new MethodInvoker(InvokeReceivedData);
                try
                {
                    System.Threading.Thread.Sleep(200);
                    string data = this.serialPort1.ReadExisting(); 
                    //收到短信
                    if (data.IndexOf("CMTI", StringComparison.CurrentCultureIgnoreCase) > 0)
                    {
                        //该干嘛干嘛了。
      

  14.   

    另外,我发现如果加上了MethodInvoker miReceivedData = new MethodInvoker(InvokeReceivedData); 发送短信又会出问题,主要是发送超长短信,就会丢短信了。
      

  15.   

    可以结贴了,虽然还没有完全解决,不过,已经找到原因了,就是在DataReceived中使用了太多的判断,当我不用任何判断直接收取数据的时候,问题都没有了,可以直接收到数据并且内容完整。
    看来需要调整一下程序结构。谢谢诸位朋友了。给分,呵呵。