我使用的是serialport类写的一个串口通信程序,在本机上使用虚拟串口,通信正常,接收都正确。 
但是在我用其与下位机(DSP)进行通信的时候,发现接收的总是最后5个字符,不知道为什么,下位机一共向PC机发送1000多个字节,最后以"*****"结束。循环按字节进行发送,一次发送一个字节。但是我在PC机上接收的时候,发现问题了,当datareceiverd事件触发时,我使用messageBox.show(serialport.databyread)操作,发现对话框只出现一次,而且显示的是5,我就很纳闷为什么会这样? 
我的接受代码是这样的,不在实验室啊,源码不能copy,只能手写了。 
void datareceivered(....) 

  string rs=""; 
  int k = serialPort1.byteToRead;
  byte data  ;
  //messagebox.show(serialport1.bytetoread); 
  try{ 
  data = serialport1.read(data,0,k); 
  rs += Encoding.ASCII.GetString(data); 

  catch(Exception ex) 

  messagebox.show(ex.message); 

  //然后是异步处理显示在textbox中 textbox.text += rs; 

我郁闷,每次都是只能接受最后的5个字符,也就是“*****”。 
希望大家做过这方面东西的,能帮我解释一下,在本机上使用虚拟串口,用串口调试精灵和自己通信,一切正常。
是不是我程序哪里有问题呢?DSP发送的数据2个电机的速度+‘#’。比如 电机1速度 电机2速度 #,一次类推,速度都是2个字节,#是1个字节。最后以5个‘*’作为结束符。再数据传输过程中,是怎么回事呢?怎么每次只能读5个字节的数据,而且是最后5个字节数据,是不是我前面读的数据被覆盖呢?我搞不明白了,希望大家能帮帮我,高分求解,一定结贴。

解决方案 »

  1.   

    我缓冲区是serialport控件默认的,我看了下,接收缓冲区是4096个字节啊
      

  2.   

    http://www.cnblogs.com/tuyile006/archive/2006/09/29/517882.html
    http://hi.baidu.com/iiyouxia/blog/item/fe7d05fbea4796156d22ebb5.html
    http://blog.sina.com.cn/s/blog_5443949f0100bk38.html
      

  3.   

    看着上面的函数。。 我指出错误的地方。。  
    你的 rs每次进来清空成   string rs=""; 
    你进去的时候变成rs += Encoding.ASCII.GetString(data);
    但是因为事件datareceiverd 会触发多次。。 所以最后进去的时候 rs还是会清空 , 
    然后才会rs += Encoding.ASCII.GetString(data)(最后一次的值)你应该在外面建立一个全局变量 加入rs的数据 ,应该这么写string receiveData;
    void datareceivered(....)
    {
      string rs="";
      int k = serialPort1.byteToRead;
      byte data  ;
      //messagebox.show(serialport1.bytetoread);
      try{
      data = serialport1.read(data,0,k);
      receiveData += Encoding.ASCII.GetString(data);
    }
      catch(Exception ex)
    {
      messagebox.show(ex.message);
    }
      //然后是异步处理显示在textbox中 textbox.text += rs;

      

  4.   

    不好意思上面搞错。。虽然说最后结果没有什么错的
    保守一点应该这么写
    string receiveData="";
    void datareceivered(....)
    {
      string rs="";
      int k = serialPort1.byteToRead;
      byte data  ;
      //messagebox.show(serialport1.bytetoread);
      try{
      data = serialport1.read(data,0,k);
      rs+= Encoding.ASCII.GetString(data);
     receiveData += rs;
      
    }
      catch(Exception ex)
    {
      messagebox.show(ex.message);
    }
      //然后是异步处理显示在textbox中 textbox.text += rs;
    } 直接点就这么写
    string receiveData="";
    void datareceivered(....)
    {
      int k = serialPort1.byteToRead;
      byte data  ;
      //messagebox.show(serialport1.bytetoread);
      try{
      data = serialport1.read(data,0,k);
     receiveData += Encoding.ASCII.GetString(data);;
      
    }
      catch(Exception ex)
    {
      messagebox.show(ex.message);
    }
      //然后是异步处理显示在textbox中 textbox.text += rs;

    另外 有一点错误  byte data  ; 这个定义是错误的。 应该是 byte[] data  ; 
      

  5.   

    不好意思上面搞错。。虽然说最后结果没有什么错的
    保守一点应该这么写
    string receiveData="";
    void datareceivered(....)
    {
      string rs="";
      int k = serialPort1.byteToRead;
      byte data  ;
      //messagebox.show(serialport1.bytetoread);
      try{
      data = serialport1.read(data,0,k);
      rs+= Encoding.ASCII.GetString(data);
     receiveData += rs;
      
    }
      catch(Exception ex)
    {
      messagebox.show(ex.message);
    }
      //然后是异步处理显示在textbox中 textbox.text += rs;
    } 直接点就这么写
    string receiveData="";
    void datareceivered(....)
    {
      int k = serialPort1.byteToRead;
      byte data  ;
      //messagebox.show(serialport1.bytetoread);
      try{
      data = serialport1.read(data,0,k);
     receiveData += Encoding.ASCII.GetString(data);;
      
    }
      catch(Exception ex)
    {
      messagebox.show(ex.message);
    }
      //然后是异步处理显示在textbox中 textbox.text += rs;

    另外 有一点错误  byte data  ; 这个定义是错误的。 应该是 byte[] data  ; 
      

  6.   

    用串口调试精灵和自己通信,一切正常。你用调试精灵跟DSP通信正常么?是不是波特率设置的问题呢
      

  7.   

    在读取前加延时,然后 readexisting一次性读取,就可以不用设全局变量了
      

  8.   

    串口接收数据不是一次性接收完。你用个字符串“str+=你定义接收数据包的变量“,一直接收到你的帧尾,就停止!这是再把str显示出来就不是5位数了。比如:你的通信协议是01开头,02结尾,那每次就从01开始接收,接收到02就停止。