Форум: "Начинающим";
Текущий архив: 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