Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

RS-232 Помогите! [D7, XP]


Viktor ©   (2014-09-22 22:22:00) 

Организовываю общение с микроконтроллером по СОМ порту.
Прога ложится: "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);

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


VICTOR_   (2014-09-23 16:29:00) [1]

В основном потоке в блоке Finally
   FreeMem(Pointer(Msg.WParam));


VICTOR_   (2014-09-23 16:26:00) [2]

У меня по пересылке в основной поток работает такой код
           
             if Kols > 0 then
             begin
               LenPacket := Kols;
               GetMem(Reciv, LenPacket);
               Move(Buff,Reciv^,LenPacket);
               //шлем сообщение основному потоку
               PostMessage(fmMain.Handle,cmRxByte,Integer(Reciv),LenPacket);
             end;


Viktor   (2014-09-23 14:26:00) [3]

Кажысь победил:

Cnt:byte;

выделял память GetMem(Reciv,sizeof(Cnt));  итого 1 байт

записывал в Reciv 65 байт
Move(Buff[0],Reciv^,Cnt);

передавал в основной поток PostMessage(Form1.Handle,rx_bup,Integer(Reciv),Cnt);

и при освобождении  FreeMem(Pointer(msg.WParam),msg.LParam); - AV

Поправте если это не то.


junglecat   (2014-09-23 14:24:00) [4]

> Ordinal type required

ну указатель типизированный нужен. Inc(PByte(Bf))


Viktor   (2014-09-23 13:56:00) [5]

junglecat   (23.09.14 12:59) [12]
> inc(Integer(Bf)) отладчик показывает смещение на 1

Inc(Bf);

[Error] main.pas(316): Ordinal type required


Viktor   (2014-09-23 13:44:00) [6]

MBo

BeginThread  -  та же история. При освобождении памяти сразу AV.


Viktor   (2014-09-23 13:00:00) [7]

MBo

У меня так же:
CommThread := CreateThread(nil,0,@ReadComm,nil,0,ThreadID);


junglecat   (2014-09-23 12:59:00) [8]

> inc(Integer(Bf)) отладчик показывает смещение на 1

Inc(Bf);


Viktor   (2014-09-23 12:55:00) [9]

Pointer  
Я эту версию сразу проверил, inc(Integer(Bf)) отладчик показывает смещение на 1.


Viktor   (2014-09-23 09:55:00) [10]

Res:array [0..128] of byte;     использую для приема  в ReadFile(CommHandle,Res,Kols,Kols,@Ovr);//читаем

хотя подозреваю можно и както использовать  буферный массив Buff[Cnt].


MBo   (2014-09-23 08:24:00) [11]

Проще буфер превратить в строку с помощью SetString.

Ещё один момент - у Василия в статье используется CreateThread, и при этом в потоке динамически выделяется память. Использование BeginThread (или хотя бы ручное выставление IsMultiThread) позволит менеджеру памяти правильно контролировать ситуацию.


Pointer   (2014-09-23 03:17:00) [12]

inc(Integer(Bf)) - сдвигает указатель на 4, а не на 1.
На каком-то витке цикла адрес уходит за строку и Bf^ дает AV.


Германн   (2014-09-23 00:44:00) [13]

А что такое Res?


Viktor   (2014-09-22 23:16:00) [14]

Эту статью и брал за основу. СПАСИБО Василию Пивко.


Jeer   (2014-09-22 23:04:00) [15]

http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1126


Jeer   (2014-09-22 22:53:00) [16]

То дяди Джиры, невзначай,
Наступят на мозоль..
И будет больно - так и знай,
Уж лучше рану - в соль.


Jeer   (2014-09-22 22:51:00) [17]

>Arduinа курит в сторонке

О, да! Мой юный нежный друг -
Не все нам ведомо, поверь.
То, завтра - наступает "вдруг",
То зимняя метель.


Viktor   (2014-09-22 22:47:00) [18]

Arduinа курит в сторонке. микр шлет всё гут можно подсмотреть в Гипертерминале. Програмку на Делфи хочу подружить с устройством.


Jeer   (2014-09-22 22:24:00) [19]

Возьми Arduino и наступит тебе счастье.


Наверх

Титульная страница Поиск, карта сайта Написать письмо