本帖最后由 nucjankk 于 2013-08-08 06:50:36 编辑

解决方案 »

  1.   

    不知道你的timer是怎样创建的。参考http://bbs.csdn.net/topics/370096927关于什么while循环、Application.DoEvents()这类代码,我不会在所谓线程程序设计中使用。你的程序的我没有什么修改意见,除非你避免循环死等这类语句。
      

  2.   

    你的timer是System.Windows.Forms.Timer。这种定时器是在主线程执行的。这样延时是会堵住主线程的。
    定时器还有另外2种,其中一种是开子线程的,你可以换成它,或者直接开启子线程。            Thread thread = new Thread(SendData);
                thread.Start();
            
            private void SendData()
            {
                if (!serialPort.IsOpen)
                {
                    openPort();
                }
                string strCMD = "010300040001C5F8";//1号机地址
                SendAsHex(strCMD);//十六进制发送
                Thread.Sleep(500);            string strCMD2 = "020300040001C429";//2号机地址
                SendAsHex(strCMD2);//十六进制发送
                Thread.Sleep(500);            string strCMD2 = "030300040001C4a3";//3号机地址
                SendAsHex(strCMD2);//十六进制发送
                Thread.Sleep(500);
            }
      

  3.   

    兄台是Thread.Sleep(500);还是thread.Sleep(500);啊,这后面这种写法对不对,刚才试了一下,后边这种写法有语法错误。前边那种写法程序没有改善呢。
      

  4.   

    是Thread.Sleep(500);
    程序没有改善,原因有很多。
    第一你只发送2号机地址,看看有没有接收到返回数据。
    第二有可能是等待的时间不够长,可以把500改大一点。
      

  5.   

    阻塞线程不大可能,timer跟SerialPort_DataReceived是不同的线程。
    如果完全没接收到数据,可能是下位机没发送数据过来
      

  6.   

    是Thread.Sleep(500);
    程序没有改善,原因有很多。
    第一你只发送2号机地址,看看有没有接收到返回数据。
    第二有可能是等待的时间不够长,可以把500改大一点。

    将时间改成1000ms,已经可以收到数了。多谢。