![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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 и наступит тебе счастье.