1

Тема: RS - 232 Програма завешується помилкою

Організовано обмін з мікроконтролером по СОМ порту.
Прога лягає: "Access violation fat address 00403694"

Ось такий й прийом:

Cnt:=0;
     while true do
    begin
      TransMask:=0;
      WaitCommEvent(CommHandle,TransMask,@Ovr);
      if (TransMask and EV_RXCHAR)=EV_RXCHAR then
       begin
         ClearCommError(CommHandle,Errs,@Stat);
         Kols := Stat.cbInQue;
         ReadFile(CommHandle,Res,Kols,Kols,@Ovr);
         if Kols>0 then
          begin
            Move(Res,Buff[Cnt],Kols);
            Inc(Cnt,Kols);
            if Cnt > 64 then
              begin
               GetMem(Reciv,sizeof(Cnt));
               Move(Buff[0],Reciv^,Cnt);
               PostMessage(Form1.Handle,rx_bup,Integer(Reciv),Cnt);
               Cnt:= 0;
              end;
          end;
       end;//mask
    end;//while


Обробляю прийняте:

Bf := Pointer(msg.WParam);
  Cnt := msg.LParam;
  S := '';
  for i := 0 to Cnt-1 do
    begin
      S := S + Chr(Byte(Bf^));
      inc(Integer(Bf));
    end;
  if Form1.checkbox1.Checked then Form1.Memo2.lines.Add(S);
  FreeMem(Pointer(msg.WParam),msg.LParam);

Дані передаються в основний потік і обробляються. Краш кажись при вивільненні памяті, ЧОМУ?

2

Re: RS - 232 Програма завешується помилкою

У цих кусках можуть бути помилки, а можуть і не бути - в залежності від решти коду, який ви не показали.
Тому можу дати лише посилання на статтю із загальними порадами: http://www.gunsmoker.ru/2009/05/access-violation.html І ще більш загальні поради: http://www.gunsmoker.ru/2010/03/blog-post.html

3

Re: RS - 232 Програма завешується помилкою

Дякую за поради-відповіді. Помилку знайшов. Проблема була в тому, що виділялась память на масив   1байт записувалось в нього 65 байт і при вивільненні памяті розміром 65 байт  - помилка. Не вірно GetMem(Reciv,sizeof(Cnt));   потрібно GetMem(Reciv,Cnt);

Подякували: Torbins, 0xDADA11C72