各位大侠,你们好,我第一次来CSDN上提问;
我的问题是,我想实现这样一个功能:
                有一个串口调试窗口,1)打开这个窗口后(即使什么控件也不按),窗口会自动的以一个预定义好的周期向SerialPort发送数据(这个数据是一定的),并且利用comm_receive来接收数据;
                                    2)在“1)”的过程中,如果有任何一个控件(比如)按钮按下,那么该按钮要求向SerialPort发送一个新的数据(根据事件触发就发送一次,但不同于“1)”定时发送的内容),也利用comm_receive来接收数据;
                全过程全部利用RS485(收、发短接)来测试;
请问怎么实现???注:1)其实我已经做了一部分,现在如果不加定时发送的模块,就事件触发然后发送并接收,这是没有问题的;但就是加上定时发送就不会了;  
  
    2)针对上述的自动发送功能,我自己瞎搞了一个,见如下主要思想是李彤Timer的Tick事件,不停的发送)
        void comm_Receive(object sender, EventArgs e)
        {
         ......
        }
        void time1_Tick(object sender, EventArgs e)
        {
            if (comm.IsOpen)
            {
                while (true)
                {
                    byte[] b = { 0xF8, 0x03, 0x81, 0x0B, 0x00, 0x02, 0x89, 0x9C };
                    qufen = 0;
                    comm.Write(b, 0, 8);
                    Thread.Sleep(100);
                }
            }
        }
        但发现根据上述的Timer思想做完后,运行程序,确实能定时发了,但程序是完全死在了定时发送上,不能接收,其他所有控件均不能使用,窗口都关不掉,这是为什么啊???
        
     3)还有最后一个CRC校验的问题:
        我是这样写的(思想就是等缓存区有9个字节时,才做读取等事情,否则就等着):
                        void comm_DataReceived(object sender, SerialDataReceivedEventArgs e)
                        {
                         Thread.Sleep(5);
                         int n = comm.BytesToWrite;
                         for (int i = 0; i <= 20; i++)
                         {
                         if (n>=9)
                        {
                        byte[] buf = new byte[n];
                        comm.Read(buf, 0, n);
                        builder.Length = 0;
                        this.Invoke((EventHandler)(delegate
                        {
                            foreach (byte f in buf)
                            {
                                builder.Append(f.ToString("X2") + " ");
                            }
                            string zhuangtai = builder.ToString();
                        }(下面的大括号省略)
        利用中断模式运行后发现:字符串zhuangtai始终为null,这到底是为什么?????????
我是C#新手,第一次来这里问问题,希望各位大侠能够帮帮我
CSDN好像不能附件,这不好,不然我就附件源程序了。

解决方案 »

  1.   

    问题有几个,你一个一个来.
    1 2 定时发送的问题,估计你的timer1和UI一个线程,所以卡住,建议另开个线程发送
    3 一直为null,说明一直没赋值,可能是没读到数据.
      

  2.   

        定时发送上,不能接收,其它代码就不会执行下去了,楼主你要给收发的过程加上超时的时间,就是说你要设置Timeout。
      

  3.   

    SerialPort _serialPort = new SerialPort();  
     _serialPort.ReadTimeout = 500;
     _serialPort.WriteTimeout = 500;
      

  4.   

    谢谢各位的热心回复
    对于timer循环导致窗口卡主的问题已经解决了,但不知道为什么这样是可以的,原来是不可以的??
    现在的代码是:
    (其中的HexStringToByteArray()函数已经定义好了,作用是将16进制字符串转为byte数组)
    private void timer1_Tick(object sender, EventArgs e)
            {
                if (comm.IsOpen)
                {
                      string ComString = "123456";
                    try
                    {
                        int len = ComString.Length / 2;
                        byte[] bytesend = HexStringToByteArray(ComString);
                           comm.Write(bytesend, 0, bytesend.Length);
                    }
                    catch (Exception)
                    {
                    }
                }
            }
    为什么这样就行了?我是看别人这么做,我就这么做的,但这是为什么呢? 这样行,原来不行?