我用单独的一个线程接收数据,跟单片机通信,
比如我发送FF 05 05 05 01 五个字节,单片机返回一定的字节,字节的多少根据命令的不同而不同,
这时我定义了几个全局的标志位,通过标志位来用while循环接收数据并处理比如说 我按下开始按钮 _iFlag=1; 我在接收线程里
 判断 if(_iFlag==1)
{
       while(//接收的字节不等于5)//根据协议里 现在返回5个字节数据
}问题是 我现在在外部改变了 这个标志位 
并不能够马上进入 标志位里处理的命令
有什么方法 让他响应 当前按钮下的命令。。

解决方案 »

  1.   

    现在我采取了 判断的方式 ,定义一个全局变量_bReadOut,如果是在while循环里 则_bReadOut=false;
    如果在外则_bReadOut=true; 并用串口超时机制 ,如果catch到 则_bReadOut=true;
    发送命令的时候 首先判断_bReadOut;如果为真,则发送,如果非真,则不发送,并提示用户现在数据正在处理中,则稍后再发。 
    怎么样 让命令接着响应呢
      

  2.   

      ManualResetEvent mre = new ManualResetEvent(false);   while(1)
       {
              mre.WaitOne();
             //接收的字节不等于5
             mre.ReSet();
        }    //根据协议里   现在返回5个字节数据 
    在按钮里面:  mre.Set();
    就行
    他就执行WHILE后面的程序……然后又等待你再次按下BUTTON 如此反复
      

  3.   

    很多时候 外部标志位 改变的时候 我调试的时候 发现标志位立刻改变
    但是 现在可能正处在某个while的接受状态里
    现在要解决的问题就是立刻跳出当前的while接收字节的循环
      

  4.   

    ls的头像好恐怖
    是这样的 比如我发送FF 05 05 55 01 返回 固定的五个字节
    我接收到返回的字节后 ,定时发送 FF 06 05 00 01 五个字节 然后读取单片机返回的数据,这时单片机返回62个字节,如果现在我想停止 我在按钮里置了标志位 ==3 
    这时候 并不能马上执行这个指令,因为 现在很可能while的接受数据正处在上一个循环里