1,最主要的是想问大家有好的处理接收数据的逻辑么?
因为短信,每次数据都不固定.我现在是弄个缓冲区,在ataReceived 用SerialPort1.Read(mRecvData, 0, mSize)每次接收到的数据都放进去,然后去找cmt开头的.然后清掉无用的. 我感觉这里效率不高.因为测试发现,我发送的数据,就是write的内容,也都同样再被read一遍.
想问作过类似的朋友,你们怎么处理的.2 我一直都执行AT+CMGF=0;+CNMI=2,2,0,0,0;+CSMP=17,167,0,25,短信到达,直接处理.不要写卡.不知道大家是不是也都这样操作.
但昨天别人用一个usb猫,运行我的程序,报错. 具体原因还待我细查. 

解决方案 »

  1.   

    使用AT命令中的ATE0可以避免发给Modem的数据被“反射(Echo)”到应用程序。另外,由于串口数据是一个没有特定起始、结束标志的数据流(与TCP一样),所以应当采用一种机制来获取每次收到的数据包,通常我的做法是串口接收数据事件触发之后等待100ms,如果100ms之内没有后续数据到来,则将接收到的数据作为1个数据包传给应用层处理。
      

  2.   

    谢谢楼上的回答.也就是说在打开串口的时候,发个ate0的指令对不? 明天白天试验下.//串口接收数据事件触发之后等待100ms  这个怎么实现?每次dataReceivedde的时候,开个线程,线程里边100ms后,处理缓冲区数据?
      

  3.   

    需要理解以下几点:
    1、DataReceived的事件处理函数是由主线程以外的线程调用的
    2、DataReceived事件处理函数中调用Form对象的BeginInvoke函数,将接收到的数据转移到主线程
    3、被Invoke的函数在保存接收到的数据后重新启动100ms的定时器(timer.Enabled=false; timer.Enable=ture;)
    4、在timer的Tick事件处理函数中将已经接收到的数据作为一个完整的数据包来处理
      

  4.   

    DataReceived里收到的数据在主窗体上显示,是要用委托才行.  谢谢楼上2位的经验共享.尤其dz_huanbao继续等其他人讲讲经验.然后结贴.