dnwpy 2019-06-11 15:02 采纳率: 0%
浏览 124

delphi单步调试没问题,全速运行时,保存的txt文件里是乱码?

我要保存串口传输来的数据“//>+0.0084+0.0017+0.0008-0.0020+0.0011-0.0023+0.0111+0.0037”图片说明
保存以后就是这样。但是单步运行的时候没问题图片说明

代码如下

procedure TComm3.execute;   //rawimu
var
  i,x:Integer;
  overlapped:TOverlapped;
  readstrbuffer:string;
  clear:Boolean;
  comstat:TComStat;
  lpErrors, dwEvtMask, dwTranser, ReadNumber3:Cardinal;
  cbNum:Word;
  tempstr:string;
  qnum, Remainnum, tempnum:Word;

begin
  FreeOnTerminate:=True;
  receive3:=True;
  readstrbuffer:='';
  x:=0;
  str1:='#01'#13;
  num1:=Length(str1);
  fillchar(overlapped,sizeof(Toverlapped),0);
    //创建重叠读事件对象,手动复位,初始化为无信号状态
  overlapped.hEvent := CreateEvent(nil,true,false,nil);
    //在主线程中可设置receive来终止线程的执行

  assignfile(filevar3,'E:\数据采集\3\'+savename+'.txt');
  rewrite(filevar3);

  while receive3 do
  begin
    WriteFile(hcom3,str1[1],num1,num2,@writeos3);

    dwEvtMask:=0;
    if not WaitCommEvent(hcom3,dwEvtMask,@overlapped) then
    begin
      if GetLastError = ERROR_IO_PENDING then
      begin
        GetOverLappedResult(hcom3,overlapped,dwTranser,true);
      end;
    end
    else ;

    if ((dwEvtMask and EV_RXCHAR)=EV_RXCHAR) then
    begin
      clear:=ClearCommError(hcom3,lpErrors,@comstat);
      if clear then
      begin
        cbNum:=comstat.cbInQue;
        if cbNum>0 then
        begin
          if ( ReadFile(hcom3,readbuffer3,cbnum,ReadNumber3,@ReadOs3)) then
          begin
            if GetLastError = ERROR_IO_PENDING then
            begin
              GetOverLappedResult(hcom3,ReadOs3,ReadNumber3,false);
            end;
//>+0.0084+0.0017+0.0008-0.0020+0.0011-0.0023+0.0111+0.0037
//包头,8组数据  从第三个开始读,Vol1,Vol2,Vol3,Vol4,Vol5,Vol6
            if ReadNumber3>0 then
            begin
              for i:=1 to ReadNumber3 do readstrbuffer := readstrbuffer + readbuffer3[i];
              while True do
              begin
                qnum:=Pos('>',readstrbuffer);
                if qnum>0 then
                begin
                  Remainnum:=Length(readstrbuffer)-qnum+1;
                  if Remainnum>= 58 then
                  begin
                    tempstr := copy(readstrbuffer,qnum+1,Length(readstrbuffer)-qnum);//去除>
                    Vol1:=Copy(tempstr,15,7);
                    Vol2:=Copy(tempstr,22,7);
                    Vol3:=Copy(tempstr,29,7);
                    Vol4:=Copy(tempstr,36,7);
                    Vol5:=Copy(tempstr,43,7);
                    Vol6:=Copy(tempstr,50,7);
                    Inc(x);
                    Writeln(filevar3, format('%5d%10s%10s%10s%10s%10s%10s',[x,Vol1,Vol2,Vol3,Vol4,Vol5,Vol6]));
                    readstrbuffer:=Copy(readstrbuffer,qnum+50,Length(readstrbuffer)-qnum-49);
                    sleep(1000);
                    //Delay(1000);
                  end
                  else Break;
                end
                else Break;
              end;
            end;
          end;
        end;
      end;
    end;
  end;
  CloseFile(filevar3);
  CloseHandle(overlapped.hEvent);
end;
  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-10 06:50
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    这段代码使用Delphi进行串行通信,并且尝试将接收到的数据写入文本文件。然而,在输出数据到文本文件的过程中遇到了问题:输出的数据看起来是乱码。

    要解决此问题,可以采取以下步骤:

    1. 检查编码设置:确保你的文本文件和接收的数据使用的编码一致。如果它们不匹配,可能会导致乱码。
    2. 检查字符集:确认发送的数据和接收到的数据使用的字符集相同。例如,如果你发送的是UTF-8数据,但接收到的是Unicode,则会遇到乱码问题。
    3. 使用适当的缓冲区大小:在处理大容量数据时,适当增大缓冲区大小可以帮助防止乱码问题。
    4. 检查文件路径:检查文本文件路径是否正确。有时,路径错误可能导致无法打开或写入文件。
    5. 调整等待时间:检查是否有足够的时间让系统完成操作。如果等待时间太短,可能会出现乱码。

    根据上述建议,你可以对代码进行调整以修复乱码问题。例如,可以在循环中添加一个检查语句来验证字符集是否匹配,或者增加缓冲区大小。此外,也可以考虑使用更强大的编码转换库来处理复杂的字符集问题。

    评论

报告相同问题?