协议简单说明
1.协议三条数据分别是, 190个字符!200字符,。。2.字头ABCD,先拿第一条数据来说 190字符,只能拿这两个数据来判断一条命令了,总之这个协议定不不好
3.ABCD后面的字符,3131=控制返回命令, 3232=读电流, 3333= 读电表,    比如ABCD3232.....(共190字符长度),而且我的协议只能靠固定的位来判断每个字节是做什么用的(中间没有,或者分隔符,只能截取)程序写法
我的字符从串口是一个字符一个字符来的,比如先来A,在来B.......
请问我的程序 OnRxChar(ref byte c)函数里或者其他里,应该怎么写才能提高效率,并且保证数据不丢失.希望大家指教.
protected override void OnRxChar(ref byte c)
{
s += new string((char)c,1);//转换string
if(s.StartsWith("ABCD") && s.Substring(0,4) == "ABCD")
{
switch(s.Length)
{
case 190 :
ReceiveDataEventArgs reda = receData(ref s);
if (ReceiveDataEvent != null) ReceiveDataEvent (reda);
s = "";
break;
case 168 :
break;
}
}
}
public ReceiveDataEventArgs receData(ref string s)
{
dataevent.dataHead = s.Substring(0,4); //解析字头
dataevent.dataNum = byte.Parse(s.Substring(4,2)); //序号
dataevent.receiveFlag = short.Parse(s.Substring(6,4)); //标志位
dataevent.ctrlFlag = Convert.ToInt32(s.Substring(10,2),16);
dataevent.dateTime = s.Substring(12,10); //日期时间
dataevent.sendQuantum = Convert.ToByte(s.Substring(22,2),16); //发送量
dataevent.receiveQuantum = Convert.ToByte(s.Substring(23,2),16); //返回量
dataevent.on_off = Convert.ToByte(s.Substring(26,2),16); //门开关

..............................................

return dataevent;
}

解决方案 »

  1.   

    顺便说明一下我的代码很不好,if(s.StartsWith("ABCD") && s.Substring(0,4) == "ABCD")

     要判断很多次.而且其他方面处理的不好.效率不行.希望有效率高的代码,谢谢大家帮忙
      

  2.   

    给个标识
    如果接连出现ABCD,就置TRUE,如果true,就处理可以用char[],不一定非得用string
      

  3.   

    哦?那样还是得判断啊!!!true,用 char[]如何用?
      

  4.   

    =========================================
    顺便说明一下我的代码很不好,if(s.StartsWith("ABCD") && s.Substring(0,4) == "ABCD") 要判断很多次.而且其他方面处理的不好.效率不行.希望有效率高的代码,谢谢大家帮忙=======================================
    这句是不是有点重复判断了
    s.StartsWith("ABCD") 和 s.Substring(0,4) == "ABCD" 不是一样的结果吗你在程序中的把ref string类型的s可以考虑用其他的引用类型,本身string类型的数据在处理的时候就是效率非常低下的,虽然string类型也是引用类型,但是对string类型数据操作是相当耗费资源的
      

  5.   

    用StringBuilder (在System.Text)整个段读进去以后再分解处理。在这个地方是典型的应该用StringBuilder的地方(最大长度确定,需要多次反复的字符操作)可以极大节约资源提高效率。如果必须一个一个,你可以自己构建一个生成者模式的类来做。
      

  6.   

    这种东西的性能优化,我还是建议你用C写...
    .NET里面很难做这种optimization用了StringBuilder可以提高不少性能,但我估计还是比较慢(当然,这不是绝对的,取决于你对性能要求的预期)