var
  s: string;
  i:Integer;
  mystr,showstr:String;
begin
  mystr := '';   //初始化分析用字符串为空
  showstr := '';     //初始化显示用字符串为空
  SetLength(s, Len);  //设定接收长度
  CopyMemory(PChar(s), PChar(Integer(Buffer)), Len); //接收数据  //忽略网络测试命令
  if s='net test' then //net test 为自定义的网络测试命令
  begin
    mmoReceive.Lines.add(Format('收到来自: %s:%d'#13#10, [FromIP, Port]) + s +'网络测试命令');
    Exit;
  end;  for i := 1 to Length(s) do   //将接收数据转换为16进制字符串
  begin
    try
    mystr := mystr+ IntToHex(Ord(s[i]), 2);   //分析用字符串
    showstr := showstr+' '+ IntToHex(Ord(s[i]), 2); //显示用字符串
    except
    end;
  end;
  mystr:=Trim(mystr);  //去除前后空字符
  showstr:= Trim(showstr);
  mmoReceive.Lines.add(Format('收到来自: %s:%d'#13#10, [FromIP, Port]) + showstr);
  //////////////////
  while Length(mystr)>0 do  //处理分析字符串
  begin
    if copy(mystr,1,2)= '81' then //81信号状态,不需存储,直接显示
    begin
      try
        RedGreenLight(mystr,FromIP);  //信号状态更新显示
        mystr := Copy(mystr,21,Length(mystr));//出错的时候 程序停止到这儿      except        
      end;
    end
从单片机接受数据,运行一段时间会出错,不是一运行就报错

解决方案 »

  1.   

    应该是这个函数里面将字符串转为整型数据时出错了:RedGreenLight(mystr,FromIP);  //信号状态更新显示
    将这个函数的代码贴出来看下。
      

  2.   

    RedGreenLight(InputData,IpAddress:string)函数有段代码 LightState:=copy(InputData,19,2);// 联机状态
      //if LightState = '00' then ;
      // 检测器/////////////////////////////////////////////////////////////
      LightState:=copy(InputData,15,2);// 检测器位置
      if LightState = '03' then ChechPlace:='东口';
      if LightState = '02' then ChechPlace:='南口';
      if LightState = '01' then ChechPlace:='西口';
      if LightState = '00' then ChechPlace:='北口';  LightState:=copy(InputData,17,2);
      ChechSubPlace:=  IntToStr(StrToInt('$'+LightState));//16进制转成10进制
      //1相位
      LightState:=copy(InputData,3,2);
      sDiffer:= IntToStr(StrToInt('$'+LightState));//16进制转换10进制
        LightState:=copy(InputData,5,2);
      sCountDown:= IntToStr(StrToInt('$'+LightState));//16进制转换10进制
    是不是这里有问题
      

  3.   

    InputData肯定是长度不够19位,LightState:=copy(InputData,17,2);返回的是空;ChechSubPlace:=  IntToStr(StrToInt('$'+LightState));//16进制转成10进制这句相当于是:ChechSubPlace:=  IntToStr(StrToInt('$'));//16进制转成10进制
    所以报错。