Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.81/21: Рейтинг темы: голосов - 21, средняя оценка - 4.81
5 / 5 / 3
Регистрация: 18.10.2011
Сообщений: 156
1

external exception c0000008. Работа с COM портом.

19.10.2011, 16:53. Показов 3784. Ответов 2
Метки нет (Все метки)

Программа должна отправлять написанную диаграмму через COM порт.
После открытия порта и нажатия кнопки начинается побайтовая отправка. Но в какой-то момент возникает ошибка external exception c0000008
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//............................... поток WriteThead ............................
//----------------------------------------------------------------------------- 
 
WriteThread *writer;     //объект потока WriteThread
 
//--------------------------------------------------------------------------- 
 
//конструктор потока WriteThread, по умолчанию пустой 
__fastcall WriteThread::WriteThread(bool CreateSuspended) : TThread(CreateSuspended) 
{} 
//-----------------------------------------------------------------------------  
//главная функция потока, выполняет передачу байтов из буфера в COM-порт
void __fastcall WriteThread::Execute()
{
 DWORD temp, signal;    //temp - переменная-заглушка
 int lenbufwr=strlen(bufwr);
 if (lenbufwr<1) lenbufwr=1;
 overlappedwr.hEvent = CreateEvent(NULL, true, true, NULL);       //создать событие
 WriteFile(COMport, bufwr, lenbufwr, &temp, &overlappedwr);  //записать байты в порт (перекрываемая операция!)
 signal = WaitForSingleObject(overlappedwr.hEvent, INFINITE);     //приостановить поток, пока не завершится перекрываемая операция WriteFile
 if((signal == WAIT_OBJECT_0) && (GetOverlappedResult(COMport, &overlappedwr, &temp, true))) fl = true; //если операция завершилась успешно, установить соответствующий флажок
 else fl = false;
 Synchronize(Printing); //вывести состояние операции в строке состояния
 CloseHandle(overlappedwr.hEvent);  //перед выходом из потока закрыть объект-событие
}  <----------Здесь выдает ошибку
По нажатию этой кнопки начинается отправка:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
void __fastcall TForm3::Button1Click(TObject *Sender)                     //                     1st sending
{
 Memo1Read();
 SortEdit();
 PaintGraph();
 Memo1Write();
 memset(bufwr,0,BUFSIZE);    //очистить программный передающий буфер, чтобы данные не накладывались друг на друга
 PurgeComm(COMport, PURGE_TXCLEAR);             //очистить передающий буфер порта
 AnsiString S,Str="",StrMemo="";
 for (int j=0; j<=EditCount;j++)
   for (int i=1; i<=Edit[j][0].Length();i++)
     for (int a=0; a<32;a++)
       {
        Str=Edit[j][a];
        StrMemo+=Str[i];
       }
 /*if (StrMemo.Length()%8>0)
    for(int i=0; i<(8-(StrMemo.Length()%8)); i++)
       StrMemo+='0'; */
 int leng=StrMemo.Length();
 for (int j=0; j<StrMemo.Length()/8; j++)                 //разделяю StrMemo для отправки по 8 бит
       {
        int a=0,b=0;
        for(int i=j*8+1; i<=(j+1)*8; i++)                        //перевод из двоичной в десятичную 8 бит
        {
                S=StrMemo[i];
                a=S.ToInt();
                b+=(a*pow(2,(j+1)*8-i));         //b=b+a*2^(8-i)
        }
        char x = (char)b;                          //конвертирование из бинарной(десятичной) в символьную
        Str=(AnsiString)(x);                      //x в строковую
        char *y = Str.c_str();               // в char * для буфера
        strcpy(bufwr,y);                     //занести в программный передающий буфер строку из Edit1
        writer = new WriteThread(false);     //создать и активировать поток записи данных в порт
        writer->FreeOnTerminate = true;      //установить это свойство,
                                              //чтобы поток автоматически уничтожался после завершения
       }
}
Просто для проверки ставил Sleep и наблюдал в Terminale как на одном из байтов он стопорится, но не понял причины.
Объясните, плииз, в чём косяк и как его исправить.
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.10.2011, 16:53
Ответы с готовыми решениями:

External exception EEFFACE
Доброго вечера, ребята - кто может объяснить из - за чего бывает ошибка External exception EEFFACE...

External exception EEFFACE
Доброго времени суток. У меня такая проблемка, установил недавно Rad Studio 2010 (Delphi), начал...

External exception EEFFACE из за ShellExecute
не могу найти альтернативу запуска любого обьекта из приложения,в данном случае проект...

Ошибка: raised exception class 'External: SIGSEGV'
Мой код проходит компиляцию, но при запуске .exe после того, как нажимаю на кнопку, мной созданную...

2
192 / 190 / 15
Регистрация: 27.01.2009
Сообщений: 548
19.10.2011, 22:04 2
сделай один поток для работы с портом. так у тебя их много и каждый отпраляет по одному байту. вот тутто и начинаются проблемы с синхронизацией( overlappedwr скорее всего не поделили). лучше передай потоку "вот тебе укзатель на массив, пошли оттуда 14 байт" и пусть он шлет сам все 14 байт.
1
5 / 5 / 3
Регистрация: 18.10.2011
Сообщений: 156
20.10.2011, 15:38  [ТС] 3
Спасибо за подсказку
Побайтовую отправку сделал, чтобы нули не пропадали, вся проблема именно в этом.
Как можно переделать, чтобы нулевые байты не пропадали?

Добавлено через 35 минут
Да и вообще общим потоком никак не разберусь как управлять.
ПОМОГИТЕ!!

Добавлено через 2 часа 41 минуту
radiohobbyt, как это осуществить то?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.10.2011, 15:38

External exception EEFFACE при открытие файла в браузере
Подскажите плиз, первый раз сохранение и открытие отрабатывает, на второй раз ошибка, все виснет,...

Delphi XE3 + SQLite + Data Explorer - External Exception
Доброго времени суток, уважаемые форумчане! Имеется проблема в работе с БД SQLite. Используя...

Lazarus + Synapse: Project raised exception class 'External: SIGSEGV'
ОС Linux Mint 11 Lazarus 0.9.28 procedure TForm1.Button1Click(Sender: TObject); var str :...

Ошибка при создании новой компоненты (External exception eefface + code 87)
Никогда не создавал компоненты. Но вот пришлось, и не удачно... Видимо, из-за неправильного...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru