日期:2014-05-18  浏览次数:21343 次

SerialPort.BytesToRead相关疑问,求大家帮忙解答?
用串口线将两台电脑连接起来,两台电脑上同时借助串口调试助手进行通信---通信成功(各自收发正常)。
然后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);

------解决方案--------------------
要进行循环延时判断
C# code
                        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);

------解决方案--------------------
check A_Port(Rxd) and B_Port(Txd) connected .
------解决方案--------------------
应该不是硬件原因

使用
public SerialPort(string portName, int baudRate, Parity parity, int dataBits, StopBits stopBits);
这个构造函数,确保校验位、数据位和停止位等参数正确
看你的串口调试工具是否要求设置SerialPort的DtrEnable、RtsEnable和Handshake
也可以双方都使用你C#编写的串口程序进行通讯,或可避免某些设置

主要还是自己调试了,其它人很难猜测
------解决方案--------------------
为什么不利用serialPort已有的事件来写接收呢?
------解决方案--------------------
RtsEnable=true;