Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2016.04.24;
Скачать: CL | DM;

Вниз

RS-232 Помогите!   Найти похожие ветки 

 
Viktor   (2014-09-22 22:22) [0]

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

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


 
Jeer ©   (2014-09-22 22:24) [1]

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


 
Viktor   (2014-09-22 22:47) [2]

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


 
Jeer ©   (2014-09-22 22:51) [3]

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

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


 
Jeer ©   (2014-09-22 22:53) [4]

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


 
Jeer ©   (2014-09-22 23:04) [5]

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


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

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


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

А что такое Res?


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

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


 
MBo ©   (2014-09-23 08:24) [9]

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

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


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

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

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


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

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


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

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

Inc(Bf);


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

MBo

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


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

MBo

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


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

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

Inc(Bf);

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


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

> Ordinal type required

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


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

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

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

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


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

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2016.04.24;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.006 c
15-1439386977
K-1000
2015-08-12 16:42
2016.04.24
Как сделать список TBitmap ов?


15-1438863349
Кто б сомневался
2015-08-06 15:15
2016.04.24
Win10 EULA - новые проблемы от новой ОСи


2-1412050405
Stepan4ik
2014-09-30 08:13
2016.04.24
Обрезать после запятой (Float)


15-1439457626
NailMan
2015-08-13 12:20
2016.04.24
Помогите с написанием функции для ардуинки


4-1276949542
lexi
2010-06-19 16:12
2016.04.24
Проверить существование родительского процесса