这个问题很莫名其妙,我自己也在网上查了些资料,感觉老是没抓住重点,希望懂的人点拨我一下,谢谢。
问题是这样的,点击读取数据按钮,启动两个线程:
...
Thread read = new Thread(new ThreadStart(delegate()
                {
                    ReadPortDataToQueue(串口对象实例ps, 队列ref queue);
                }));
Thread write = new Thread (new ThreadStart(delegate()
                {
                    AddDataToDataTable(队列ref queue, 全局临时表ref dt);
                }));
                read.Start();
                write.Start();
...
private void ReadPortDataToQueue(SerialPort sp,Queue<byte[]> queue)
{
   sp.ReadToQueue(命令command, ref dt) 
}
...
void ReadToQueue(byte[] command,ref Queue<byte[]> queue)
{
  for(int i = 0; i < LoopTimes; i++)
  {
   sp.Write(command,0,4);//给串口发命令;
    Thread.Sleep(BUFFER_TIME);//等待数据缓冲好;
   byte[] buffer = new byte[sp.BytesToRead];
   sp.Read(buffer,0,buffer,Length);
   sp.DiscardInBuffer();//情况串口缓冲数据;
   queue.Enqueue(buffer);//入队列;
  }
 sp.Close();
}
...
private void AddDataToDataTable(ref Queue<byte[]> queue, ref DataTable dt)
{
   byte[] tempDataStr = null;
   while(true)
    {
       if(queue.Count > 0)
       {
       tempDataStr = queue.Dequeue();
       一个字符串数组 s =  TranslateData(tempDataStr);
       dr = dt.NewRow();
       dr.ItemArray  = new Object[] {s[0], ....};
       dt.Rows.Add(dr);
       }       
    }
}
...
string[] TranslateData(byte[] data)
{
  //将每一个字节转换成16进制;
  //处理各个字节信息;
  这里跳出错误,因为我要把信息赋值给字符串,所以将上面转换的信息赋值给了一个stringbuild对象实例,
装箱后为string,用substring方法时,抛出错误,ArgumentOutOfRangeException,我查看了是因为字符串为空,但是,我一步一步调试却没有发生这种情况,不知道为什么,我明明从队列中取出数据,处理的时候也没有删除操作什么的,为什么就成空了呢?
  //赋值给字符串数组s;
  
}
若还需要什么信息,请更贴我会解释,希望大家帮忙一下,在下感激不尽。C#线程串口

解决方案 »

  1.   

    ArgumentOutOfRangeException范围超出,substring截取时,索引超出了内容的长度,肯定是接受的内容有问题啊,慢慢调试吧
      

  2.   

    queue.Count > 0不一定代表你的数据完整
    你截取出错也正常
    说明你的串口数据还没读取完
      

  3.   

    关于解码那部分的程序太多了,所以就没发,现在问题是这样的,关于串口我有几个问题:
    1.我发送命令到串口,然后那边返回数据到串口缓冲,这个中间时间是多少,是和机器相关的一个固定值吗?
    2.我读取数据后,serialPort.Read(...)后,这些数据还在串口缓冲区呢,还是已经被清除了呢?
      串口缓冲区也是一个阻塞模型吗?它的容量是多大?是在我的电脑上呢?还是在和我连接的串口机子上呢?
    3.我现在想用队列操作这些数据,本来一个线程往里面添加数据,另一个线程从队列取数据理论上可行,但是我实现的时候需要两个线程都引用(ref)这个队列呢? 那这样是不是会有访问临界资源的问题?En/De Queue是在队列的两头操作,是两个指针不相关的,会有问题吗?我在书上看C#队列在内存中实际上维护的是一个环形数组,这个和我要实现的有牵连吗?还是每次不要加ref关键字,使用队列的copy?这样会不会太费资源了,感觉也不优雅。我乱乱的说了一大堆,希望有明白的人指点一下,或者相互讨论。谢谢
      

  4.   


    是这样的,我处理字节的时候是已经把串口发送的结束字节删去了,在队列中我只添加每一个数据条,然后处理每一个byte[],这个是固定的81个字节,但是到其中某一个,或者最后一个,就会出问题抛出处理后的字符串为"",因为我解码时遇到整个通信结束字节就断定结束,但是我查看我的字节数组,是正确的,没有一个是81+4字节,不知道是什么原因。
      

  5.   

    串口丢数据时很严重的,一个小引脚松了都会差别很大。
    关于上面的:
    1.时间不固定,根据机器硬件和其他延迟会有几MS的误差吧。
    2.已经清除了
    3.没理解,sorry