解决方案 »

  1.   

    如果收发没联系的话,就new两个thread,一个read,一个write就是了
    如果你和对方是应答模式,那就收和发就要有顺序了,这个自己和对方定
      

  2.   

    有联系,我根据下位机的指令来决定我该干什么。他发什么,我做完后也反馈指令给下位机。我是通过判断串口缓存区是否有数据,有就读取,读完了就ReadExisting()。再发处理完成的指令。我现在就怕他并不是按一步一步来。毕竟是机器,动作也很快,万一两个动作都来了,两条指令同时来。那我该怎么办。
      

  3.   

    系统的serialport是同步的,异步串口读写需要自己调用api,话说考虑效率的话,异步串口不错但搭配.net未必是好选择。
      

  4.   

    我没有使用 DataReceived事件。软件启动后,我开一个线程不断的判断缓存区是否有数据,有就接收,接收后根据对应的指令做对应的事情。【ps:我是新手,不足之处望大神们见谅!】
    while(true)
    {
         if (serialport.BytesToRead > 0)
           {
                    str = ReadPortDate();
           }
           if(str=="1"){}
           if(str=="2")
           { 
                  serialport.write();
           }
    }private string ReadPortDate()
            {
                string str = "";
                try
                {
                    _length = serialport.BytesToRead;
                    bit = new byte[_length];
                    serialport.Read(bit, 0, bit.Length);
                    if (bit.Length > 0)
                    {
                        if (bit[0].ToString("X2") == "13" || bit[0].ToString("X2") == "14")//判断字头,然后决定用ASCII还是16进制接收。
                        {
                            //ascii 接收
                            str = Encoding.Default.GetString(bit, 0, bit.Length);
                        }
                        else
                        {
                            //16进制 接收
                            if (bit != null)
                            {
                                for (int i = 0; i < bit.Length; i++)
                                {
                                    //10进制转16进制
                                    str += bit[i].ToString("X2");
                                }
                            }
                        }
                    }
                    serialport.ReadExisting();
                }
                catch (Exception ex)
                {
                    MessageBox.Show("报错Line:" + GetLineNum().ToString() + "\r\n" + ex.Message);
                }
                return str;
            }
      

  5.   

    这个跟DataReceived无关,打开串口时候就确定是同步读写了,读写并发时,是排队执行的,底层并非2个线程同步执行,你只是多余的徒增烦恼自己开了2个线程而已,如何同步那是你的事情,调用读写方法都会在底层是顺序执行毫无影响。