用串口线将两台电脑连接起来,两台电脑上同时借助串口调试助手进行通信---通信成功(各自收发正常)。
然后A电脑上用C#编写的串口程序与B电脑的串口调试助手通信---A发送数据给B,B接收正常;但B发送数据给A,A接收不到数据,经过调式发现问题出在BytesToRead始终为0,下面是主要程序代码,大家看看为什么会这样?
        private static System.IO.Ports.SerialPort serialPort = new System.IO.Ports.SerialPort("COM1");
        private static byte[] Read_Buffer = new byte[10000];
        private static byte[] Data = new byte[5] { 0xff, 0xff, 0xff, 0xff, 0xff}
        private static int ReadSize;       
            try//打开串口
            {
                if (serialPort.IsOpen)
                    return true;
                else
                {
                    serialPort.WriteTimeout = 1000;                    serialPort.ReadBufferSize = 10000;
                    serialPort.Open();
                    return true;
                }
            }
            catch (Exception)
            {
                return false;
            }       //"发送"按钮事件
       serialPort.Write(Data, 0, 5);
      //"接收"按钮事件
       ReadSize = serialPort.BytesToRead;
       serialPort.Read(Read_Buffer, 0, ReadSize);

解决方案 »

  1.   

    要进行循环延时判断
                            while (timeRemain > 0)
                            {
                                if (serialPort.BytesToRead >= BYTE_COMM_FRAME_FIX)
                                {
                                    break;
                                }
                                if (bStop)
                                {
                                    break;
                                }
                                Thread.Sleep(50);
                                timeRemain -= 50;
                            }
                            ReadSize = serialPort.BytesToRead;
                            serialPort.Read(Read_Buffer, 0, ReadSize);
    因此如果像楼主这样自己处理的话,要使用辅助线程;否则使用SerialPort.DataReceived事件
      

  2.   

    [Quote=引用 3 楼 foreachif 的回复:]
    我的将串口接收  
      ReadSize = serialPort.BytesToRead;
      serialPort.Read(Read_Buffer, 0, ReadSize);
    放在定时器事件中,每个1000Ms执行一次,依然一样ReadSize=0
      

  3.   

    check A_Port(Rxd) and B_Port(Txd) connected .
      

  4.   

    应该不是硬件原因使用
    public SerialPort(string portName, int baudRate, Parity parity, int dataBits, StopBits stopBits);
    这个构造函数,确保校验位、数据位和停止位等参数正确
    看你的串口调试工具是否要求设置SerialPort的DtrEnable、RtsEnable和Handshake
    也可以双方都使用你C#编写的串口程序进行通讯,或可避免某些设置主要还是自己调试了,其它人很难猜测
      

  5.   

    为什么不利用serialPort已有的事件来写接收呢?