问题描述
本人菜鸟。自学C#。现在遇到两个问题,第一个问题。在form1中,有个按钮,点击之后弹出已经做好的固定的界面form2.比如说当form2打开5秒之后,需要关掉Form2。不知道该如何关闭,因为总是提示使用了未引用的对象。privatevoidbtnStartSend_Click(objectsender,EventArgse)//按下按钮{FormForm2=newForm2();//新窗口Form2.ShowDialog();//显示新窗口,可以正常显示}private5s时间到{Form2.Dispose();//这里提示使用了未引用的对象}问题2:我用了一个SerialPort,现在有个问题就是不知道怎么去判断这一帧数据有没有接收完,方便后面的整帧数据的解析。因为在数据传送过程中,一帧数据通常是很多字节的(不确定),并且帧与帧之间是有很大的时间间隔的。这样就可以利用在比如说50ms内,串口都没有收到任何数据,我就认为这一帧数据已经结果了,开始解析数据,现在就是不知道怎么去实现这个功能,或者各位大侠有没有什么好方法。我现在是,在串口接收一个字节的事件中,关闭50ms的一个定时器,再重启,如果50ms内串口都没收到任何一个数据,那么定时器就超时了。我再定时器超时事件中,将串口的数据读出来分析。但是这样每一个字节都触发了接收事件,串口感觉好像有点处理不过来的感觉,求解惑。sp.DataReceived+=newSerialDataReceivedEventHandler(sp_DataReceive);//注册接收事件privatevoidsp_DataReceive(objectsender,SerialDataReceivedEventArgse)//接收事件{//sp.ReceivedBytesThreshold这个参数决定接收缓冲区接收多少个数据才出发接收相应事件,默认为1个RcvTimeOutTimer.Enabled=false;//复位50ms定时器RcvTimeOutTimer.Enabled=true;//重新开始计时}privatevoidRcvTimeOutTimer_Elapsed(objectsender,EventArgse)//50ms超时了,读出来数据处理{}}
解决方案
解决方案二:
1、把Form2定义在方法外面(全局变量)2、串口数据不能用时间分割吧,一个数据包应该有校验码,长度吧,通过这方面处理数据,没必要用Timer吧
解决方案三:
不要瞎编出什么“50毫秒”这种段子。一个串行总线上往往不只一台设备,另外就算只有一台设备,而且它还如你所愿动不动就停50毫秒,那么当一个消息发出时假设数据线恰好在打弯的地方、连接的地方接触不牢,或者恰好有一个电车通过,或者恰好绑在一起、靠近数据线的并行的另外一个网络的数据线上有了瞬间的强电磁干扰,那么这个可能你的消息还会延时一段时间。所谓延时,是刚学编程的人的小伎俩。正规的编程是明确地在数据上有消息结束标志,有校验码(这是因为串行通讯不可靠。而tcp通讯通常不需要校验)。
解决方案四:
http://blog.csdn.net/wuyazhe/article/details/5642431
解决方案五:
引用2楼sp1234的回复:
不要瞎编出什么“50毫秒”这种段子。一个串行总线上往往不只一台设备,另外就算只有一台设备,而且它还如你所愿动不动就停50毫秒,那么当一个消息发出时假设数据线恰好在打弯的地方、连接的地方接触不牢,或者恰好有一个电车通过,或者恰好绑在一起、靠近数据线的并行的另外一个网络的数据线上有了瞬间的强电磁干扰,那么这个可能你的消息还会延时一段时间。所谓延时,是刚学编程的人的小伎俩。正规的编程是明确地在数据上有消息结束标志,有校验码(这是因为串行通讯不可靠。而tcp通讯通常不需要校验)。
那请问何时将数据取出来进行分析?在SerialDataReceivedEventHandler事件中判断有没有消息结束标志?还是什么?请指教。