问题一:
我做了一个串口调试工具,发现了一个很严重的问题:首先,该串口调试工具的思路是:在打开串口时,就有一个时钟开始计时,每到100ms,就发一个定时的命令出去(自动的命令,已经定义好,比如是1234);然后,在此期间,若果有任意一个按钮控件触发,则又会加发一条该控件所要求的命令(比如是abcd);
注:因为是RS232通讯,是一条独木桥,为了避免在接收数据时又尝试发送数据,从而导致通讯挂掉,所以定义了一个全局变量名叫fasongbiaozhi(发送标志);
在任意命令发送后(无论是自动的按时发送还是按钮触发发送),都会将该fasongbiaozhi置为1(不允许其他人发送了),只有在接收函数接收完毕后才将该fasongbiaozhi置为0(允许其他人发送了)。然后,开始试验,发现,问题严重,如下:
按钮控件触发的命令有很大几率命令丢失,发布出去(根本没有发出去)!思考后得到的原因可能为:
在按钮触发的时候,全局变量fasongbiaozhi正好为1(自动发送的命令处在接收阶段,在很多情况都会如此,按照上述的方法的话),故按钮的命令不能被允许发送;
而在自动接收完毕后,fasongbiaozhi为0了,此时刚刚的按钮事件又没有被记住,故导致刚刚的按钮触发事件永远被丢失了!!!!针对上述的情况,应该采用什么样的一种方法(或思想),才可以同时满足:
1)自动命令的发送与接收正常无误;
2)在自动接收期间,按钮事件无论什么时候触发,都不会被丢失,(或都能被记住,后续fasongzhuangtai=0时自动补上);
3)RS232这条通讯独木桥不会应在接受数据时又发送了数据,从而导致通讯死掉(关于这一点,我已经证明过,在RS232、RS485上绝对不能再接受数据的时候发送数据)
问题二:
接着上述的串口调试助手,我想完成这样一件事:
将所有按钮控件触发的事件全部放在自动发送接收的命令下,例如是这样的(只是例如,举个例子,真的代码这样写是错误的)
例如:
private void timer1_Tick(object sender, EventArgs e)
{
“发送自动命令”
}void comm_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
“接收自动命令”
if(“CRC通过”)
{
private void buttonSendcontent_Click_1(object sender, EventArgs e)
{
“按钮事件1触发”
}
private void buttonSendcontent_Click_1(object sender, EventArgs e)
{
“按钮事件2触发”
}
}
else if(“CRC不通过)
{
break;
}

}
就类似于上述这样的,按钮控件事件被夹在自动接收命令的接收前提下,如果自动接收CRC不通过,则按钮控件事件全部无效,只有自动接收CRC通过了,才可以。我觉得如果能做成上面的那样的话,问题一就可以解决了,但是要怎么做呢??
请教了
                                                                  

解决方案 »

  1.   

    感谢bdmh的热心回复
    可是您这样就说几个单词,我完全看不懂啊!!!
      

  2.   

    1、通过发送队列来实现命令的发送。也就是说手动命令和自动命令的“发送”只是把这些命令放入“FIFO”队列里,通过一个线程来周期性的发送队列里的命令。
    2、作为一个“通用”的串口调试工具,你干嘛管命令的应答呢?你只需接收到来自下位机数据,然后显示,不需要管它是对应于哪个上位机命令。
    3、关于你说的“RS232这条通讯独木桥不会应在接受数据时又发送了数据,从而导致通讯死掉(关于这一点,我已经证明过,在RS232、RS485上绝对不能再接受数据的时候发送数据)”,我不敢苟同。我曾用串口线连接两台电脑,相互时间用1ms的周期同时发送数据和接收数据,没有出现任何死机现象。因此如果你做的实验导致通讯死掉可能是你软件问题或者串口线有问题。
      

  3.   

    感谢showlie的回复
    就是用一个中断来发送
    我知道了
    我试试