两个串口
串口1 :接收数据 
串口2 :转发接收的数据
每次从串口1 接收1个字节数据,就存入buffer中,达到12个字节后,转发至串口2  数据是循环不停接收并转发的 。
波特率是2400目前遇到的问题是 开始几秒的时间 数据接收转发都正常 ,但是运行一段时间后(大概20秒左右),接收和发送的数据就会出错
目前串口操作是在c#里调用c++的dll实现的请教:串口出现的错误可能是由什么造成的呢?

解决方案 »

  1.   

    请教:串口出现的错误可能是由什么造成的呢?那要看你是什么错误了。你这里可能是c#的调用问题,可能是监听线程的问题,可能是c++资源泄漏问题,多了去了。
    你为什么不用.net提供的System.IO.Ports.SerialPort类呢?
      

  2.   

    没有测试,只是写完了。很简单的。public class SerialPortTransfer
    {
        private System.IO.Ports.SerialPort serialIn = new System.IO.Ports.SerialPort();
        private System.IO.Ports.SerialPort serialOut = new System.IO.Ports.SerialPort();
        int bufMax = 12;//default is 12
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="inport">读数据端口号</param>
        /// <param name="outport">转发数据端口号</param>
        /// <param name="inbaudrate">读入数据波特率</param>
        /// <param name="outbaudrate">转发数据波特率</param>
        /// <param name="buffersize">缓存长度</param>
        public SerialPortTransfer(int inport, int outport, int inbaudrate, int outbaudrate, int buffersize)
        {
            serialIn.PortName = "COM" + inport.ToString();
            serialIn.BaudRate = inbaudrate;
            serialOut.PortName = "COM" + outport.ToString();
            serialOut.BaudRate = outbaudrate;
            bufMax = buffersize;
            send = new byte[bufMax];
        }
        List<byte> buffer = new List<byte>();
        byte[] send = new byte[0];
        public void Start()
        {
            buffer.Clear();//清除缓存
            serialIn.DataReceived += DataReceived;
        }
        public void Stop()
        {
            serialIn.DataReceived -= DataReceived;
        }    void DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            int n = serialIn.BytesToRead;//获取有效长度
            byte[] temp = new byte[n];//分配空间
            serialIn.Read(temp, 0, n);//读取
            buffer.AddRange(temp);//追加缓存
            if (buffer.Count >= bufMax)//判断长度
            {
                buffer.CopyTo(0, send, 0, bufMax);//复制
                serialOut.Write(send, 0, bufMax);//发送
                buffer.RemoveRange(0, bufMax);//移除
            }
        }
    }
    调用更简单
    SerialPortTransfer spt = new SerialPortTransfer(1, 2, 2400, 2400, 12);
    spt.Start();
      

  3.   

    刚忘记写打开和释放了。public class SerialPortTransfer
    {
        private System.IO.Ports.SerialPort serialIn = new System.IO.Ports.SerialPort();
        private System.IO.Ports.SerialPort serialOut = new System.IO.Ports.SerialPort();
        int bufMax = 12;//default is 12
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="inport">读数据端口号</param>
        /// <param name="outport">转发数据端口号</param>
        /// <param name="inbaudrate">读入数据波特率</param>
        /// <param name="outbaudrate">转发数据波特率</param>
        /// <param name="buffersize">缓存长度</param>
        public SerialPortTransfer(int inport, int outport, int inbaudrate, int outbaudrate, int buffersize)
        {
            serialIn.PortName = "COM" + inport.ToString();
            serialIn.BaudRate = inbaudrate;
            serialOut.PortName = "COM" + outport.ToString();
            serialOut.BaudRate = outbaudrate;
            bufMax = buffersize;
            send = new byte[bufMax];
        }
        ~SerialPortTransfer()
        {
            Stop();
        }
        List<byte> buffer = new List<byte>();
        byte[] send = new byte[0];
        public void Start()
        {
            buffer.Clear();//清除缓存
            serialIn.DataReceived += DataReceived;
            serialIn.Open();
            serialOut.Open();
        }
        public void Stop()
        {
            serialIn.DataReceived -= DataReceived;
            serialIn.Close();
            serialOut.Close();
        }    void DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            int n = serialIn.BytesToRead;//获取有效长度
            byte[] temp = new byte[n];//分配空间
            serialIn.Read(temp, 0, n);//读取
            buffer.AddRange(temp);//追加缓存
            if (buffer.Count >= bufMax)//判断长度
            {
                buffer.CopyTo(0, send, 0, bufMax);//复制
                serialOut.Write(send, 0, bufMax);//发送
                buffer.RemoveRange(0, bufMax);//移除
            }
        }
    }