我通过SerialPort控件来读取串口信息
读取的时候会出现事件没有触发一样的效果,像是延时样
也就是本来是现在该触发的却要等到下次再触发
不知道是不是数据量过多
1,我要接收触摸屏的AD值
2,我要接收收音机的搜索到得频率

解决方案 »

  1.   

    你是用datareceived事件来接收的吧?
    代码贴上来看下。
      

  2.   

      try
                {
                    SerialPort sp = (SerialPort)sender;                if (sp.IsOpen)
                    {
                        int bytesRead = sp.BytesToRead;//得到输入缓冲区的大小
                        int i = 0;                    while (i < bytesRead)
                        {
                            byte firstbyte = Convert.ToByte(sp.ReadByte());//取得一个字节 
                            if (firstbyte == TBbyte1)
                            {
                                byte secondbyte = Convert.ToByte(sp.ReadByte());
                                if (secondbyte == TBbyte2)
                                {
                                    byte lenbyte = Convert.ToByte(sp.ReadByte());
                                    tempvalues = new byte[lenbyte + 2];                                tempvalues[0] = firstbyte;//同步字1
                                    tempvalues[1] = secondbyte;        //同步字2
                                    tempvalues[2] = lenbyte;                    //长度
                                    int sum = 0;
                                    sum = tempvalues[2];
                                    for (int j = 0; j < lenbyte - 1; j++)
                                    {
                                        tempvalues[j + 3] = Convert.ToByte(sp.ReadByte());
                                        sum += tempvalues[j + 3];
                                    }                                if ((sum & 0x0f) == 0) //校验是否通过
                                    {
                                        mes = 1;
                                        Invoke(ControlMes, tempvalues);
                                    }
                                    i = i + 2 + lenbyte;
                                }
                                else { i++; }
                            }
                            else
                            {
                                i++;
                            }
                        }
                    }
                }
                catch (Exception ei)
                {                MessageBox.Show(ei.Message);
                }
      

  3.   

    datareceived事件来接收,和缓冲区好像没有关系,我设置大点或者小点都会这样
    不好意思,我对触摸屏板不懂,我做的只是进行接收和处理
      

  4.   

    如果是按协议接收,知道要收多少几个字节,建议查询Bytetoread来接收,而不要用事件
      

  5.   

    楼主说的情况是正常的,MSDN帮助中datareceived事件的解释也说到这一点
      

  6.   

    datareceived事件里只做接收,处理数据不要在中断里吧,会有影响。按字节读就更慢了,看起来都不像是延迟了,跟死掉了似的。而且缓冲区定成固定的吧~似乎200到头了- -!
      

  7.   

    实际情况不能确定是有多少字节,因为命令的长度不一样
    协议都是前2个同步字 +长度+命令+信息+效验TO sleep0110
     
    我也想过只处理接收数据,不进行处理,不过具体应该怎么实现呢
      

  8.   

    那位用多线程做个这方面的
    给点思路
    现在是只接收收音机的返回信息或者只接收触摸屏的AD值的时候都正常
    在接收收音机信息的同时点击触摸屏就会出现不正常
    本来我是点击A B C D点,结果是我点击c点的时候鼠标位置却在A点
    点击D点的时候鼠标位置在B点,这样的结果
      

  9.   


    如果是这样的话,单独接收触摸屏,单独接收收音机都没问题,就不是串口数据接受的问题,是你解析串口数据的问题,如果出现延迟或者没有反应了,串口死掉之类才可能是串口问题。如果认为是串口接数据有问题,你可以用双缓冲区,譬如每次一个缓冲区接收100字节,第一缓冲区接满100字节去解析,第二缓冲区开始接,第二缓冲区接满了去解析再换第一缓冲区接,轮流交换。也可以用串口助手跟踪下数据看看,我认为串口数据是没错的,应该是你解析的问题。
    做不同的事情起不同的线程,不要跟主线程混了,也不要自己把自己绕进去。baidu,google多线程例子那么多,看也能看明白了吧?