Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2016.04.24;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.002 c
2-1412352887
Желание
2014-10-03 20:14
2016.04.24
Имя метода procedure of object


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


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


2-1411245669
Stepan4ik
2014-09-21 00:41
2016.04.24
Function 2 значения


15-1439065887
xayam from NB
2015-08-08 23:31
2016.04.24
Таблица Менделеева





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский