如果可能收不到数据,那么在你的服务中应该使用 Timer。

解决方案 »

  1.   


    我看到你在博文中写的串口接收数据包的了。我要记录接受的条数的话,在serialPort1_DataReceived()中添加一个变量int receivenum = 0;然后在while循环中添加receivenum++;,是吗?        可是如何先判断接受的条数,再对每条数据进行处理?因为我需要做的是:当接收到的数据条数为1时,执行A()对数据进行处理;当数据条数大于1时,执行B()对每条数据进行处理。        还有一个问题,假如服务端一次性一共接受了3条数据,我想先处理第3条数据,再处理第二条数据,最后处理第一条数据。这有如何做呢?谢谢!!!
      

  2.   

    1、把接收到的数据放到一个队列
    2、定时一个timer,如十秒或者二十秒执行一次
    3、在触发timer的时候去判断当前队列的长度不知道能否满足要求
      

  3.   

    为什么要封装成2个函数呢,一个函数就可以办到的事情
    反正就是for循环嘛
    先将收到的数据放队列里,你是放list里还是放数组里还是放datatable里,就看你喜好了
    然后for循环倒序执行,先处理最后一条,最后处理第一条
    如果只有1条,那就只循环一次嘛.
      

  4.   

    每次数据长度不一致,可以用二维数组来存放啊
    byte[ ][ ]形式
    byte[ ][ ] dataList=new byte[100][ ];
    dataList[i]=new byte[recive.length];
      

  5.   


    我用的是GPRS来进行服务端和单片机之间进行通信的,有时候会出现网络拥塞,服务端会接收不到单片机发来的数据,那么这些数据就会缓存在单片机中。等网络比较通畅的时候,单片机会在一瞬间将这些缓存的数据发给服务端。  再看服务端,由于一直接收不到数据,所以,服务端会向数据库中自动填补一些数据,等网络恢复的时候,回一下接收到很多条数据,然后我需要将这些数据把之前服务端自己向数据库中填补的数据依次覆盖掉。
      

  6.   

    或者你就定义个足够大的二维数组byte[100,2000],再定义个一维数组bytelength[100]来存放每个包的长度
    这样就不用动态的修改数组长度了
      

  7.   

    如果是入库的话,单片机发来的每个数据应该都是固定长度的吧,先缓存在datatable里就行了,不用扔数组里
    阻塞的数据如果都是拼成一个包发来的,也只是接收数据用的BYTE数组长度不固定,不是数据结构不固定
    你判断一下接收到的数组可以拆成几个包,循环一下将数据先放datatable里,再循环datatable写入数据库就好了嘛.
      

  8.   

    另外,自动填补数据的意义在哪里,我不太清楚,有这个必要么?
    就算确实有这个需求,也没必要从后往前去依次update
    可以先执行一下删除操作,将所有自动填补的删除掉,然后依次insert就行了
      

  9.   


    比如有三个单片机,每一个单片机发来的数据格式都不一样,但同一个单片机发的数据格式是一样的。当服务端接收数据时,服务端先要判断是哪个单片机发来的数据,然后将数据解析,比如一条数据中包含了一个人的年龄,籍贯等信息,我要解析出来,然后把这些信息插到数据表中。
    客户端的IP是能获取的,可以通过判断IP来给数据分组
    然后将不同单片机发来的数据分装到不同的数组里去
    每个包标准长度是已知的,不知道你单片机在重发的时候是同时发来N个包,还是将数据都打成一个包发过来
    如果是一个大包,就先按标准长度拆分成二维数组,然后循环去处理每组数据
    如果直接是发来N个包,就直接放到二维数组里就好了嘛.
      

  10.   


    我看到你在博文中写的串口接收数据包的了。我要记录接受的条数的话,在serialPort1_DataReceived()中添加一个变量int receivenum = 0;然后在while循环中添加receivenum++;,是吗?        可是如何先判断接受的条数,再对每条数据进行处理?因为我需要做的是:当接收到的数据条数为1时,执行A()对数据进行处理;当数据条数大于1时,执行B()对每条数据进行处理。        还有一个问题,假如服务端一次性一共接受了3条数据,我想先处理第3条数据,再处理第二条数据,最后处理第一条数据。这有如何做呢?谢谢!!!在while循环中添加receivenum++; 中是没错的,但变量int receivenum = 0不能定义在serialPort1_DataReceived这个方法中,要定义成类的私有字段,让他去累加 然后再用一个计时器按时间去统计receivenum 这个值在两个时间内发生了多少变化。