|
|
|
EAccessViolation
|
|||
|---|---|---|---|
|
#18+
int main(int argc, char* argv[]) { int data; unsigned short TransBytes; MSerial* com = new MSerial; cout << "Enter data number to write (from 0 to 31): "; cin >> data; if(com->Open("COM1", 1200, 5, 'N', 1)) { cout << "Transmitting..." << endl; TransBytes = com -> Write((BYTE*)&data, 1); cout << endl << TransBytes << endl; } else {cout << "Îøèáêà îòêðûòèÿ ïîðòà";} com->Close(); delete com; getch(); return 0; } Почему на delete выскакивает exception EAccesViolation. Я же не разыменовываю нулевой указатель и не суюсь в невыделенную память. Причем, если не вызывать функцию Open, то деструктор работает нормально. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2006, 01:40 |
|
||
|
EAccessViolation
|
|||
|---|---|---|---|
|
#18+
А что за MSerial такой? Код есть? давай в студию, будем в ём баги шукать. Особенно в Open'е. Ещё есть такая суперская вещь, как дебаггер... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2006, 03:00 |
|
||
|
EAccessViolation
|
|||
|---|---|---|---|
|
#18+
MSerial это самопальный класс для работы с COM-портом. Open соответственно функция для открытия порта и рядя соответствующих операций. Вообщето я его позаимствовал. И просьба выражаться яснее, я еще тока въезжаю))) class MSerial { public: MSerial(); ~MSerial(); boolean Open(char port[], int BaudRate, int ByteSize, char Parity, int StopBits); void Close(void); unsigned short Read(BYTE *buffer, unsigned short numbytes); unsigned short Write(BYTE *buffer, unsigned short numbytes); private: HANDLE handle; COMMTIMEOUTS CommTimeOuts; DCB dcb; COMSTAT ComState; OVERLAPPED Overlap; char String_Mode[]; }; MSerial::MSerial() { }; MSerial::~MSerial() { }; boolean MSerial::Open(char port[], int BaudRate, int ByteSize, char Parity, int StopBits) { handle = CreateFile ( port, GENERIC_READ, //| GENERIC_WRITE, NULL, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL ); if(handle == INVALID_HANDLE_VALUE){return FALSE;} dcb.DCBlength = sizeof(DCB); if(!BuildCommDCB("1200,n,5,1", &dcb)) { cout << "DCB faild" << endl; } CommTimeOuts.ReadIntervalTimeout = TimeoutInterval; CommTimeOuts.ReadTotalTimeoutMultiplier = NumBytesMultiplier; CommTimeOuts.ReadTotalTimeoutConstant = Constant; CommTimeOuts.WriteTotalTimeoutMultiplier = 0; CommTimeOuts.WriteTotalTimeoutConstant = 0; if(!SetCommState(handle, &dcb)) { return FALSE; } if(!SetCommTimeouts(handle, &CommTimeOuts)) { cout << "Configure faild" << endl; return FALSE; } return TRUE; }; void MSerial::Close(void) { if(!CloseHandle(handle)){cout << "Port not closed" << endl;} } unsigned short MSerial::Read(BYTE *buffer, unsigned short numbytes) { DWORD temp; ClearCommError(handle, &temp, &ComState); if (!temp) { boolean result=ReadFile(handle, buffer, numbytes, &temp, &Overlap); if(result) { return (unsigned short)temp; } } return 0; } unsigned short MSerial::Write(BYTE* buffer, unsigned short numbytes) { DWORD temp; if(numbytes) { ClearCommError(handle, &temp, &ComState); if((numbytes + ComState.cbOutQue)>=SizeBuffer) MessageBox(NULL, "Íå õâàòàåò ñâîáîäíîãî ìåñòà â âûõîäíîì áóôåðå ", "", MB_OK); boolean result=WriteFile(handle, buffer, numbytes, &temp, &Overlap); if(result) { return (unsigned short)temp; } } return 0; } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2006, 00:29 |
|
||
|
EAccessViolation
|
|||
|---|---|---|---|
|
#18+
Ну канешна, спёр класс на Телесистемах, дописал свой пустой конструктор и деструктор и вперёд ;) (кстати там и пример есть работы с классом). >>И просьба выражаться яснее, я еще тока въезжаю Просьба выражаться яснее: "въезжаю" во что? В С++ или в принципы работы с RS-232 ? Если второе, то вот, для затравки: http://rs232.ru/doc002.html ("KOI-8R, подумал Штирлиц" ) ) Ну а если первое (С++ то бишь), то не советую начинать с Com-porta, а потренироваться, для начала, на кошках )) (например, написать класс СStudent, содержащий ...... в т.ч. конструктор/деструктор, отнаследоваться от класса СHomoSapiens и т.д.) Попутно разобраться-таки с дебаггером ( желательно даже подружиться, он будет часто выручать в трудные моменты). Удачи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2006, 01:19 |
|
||
|
EAccessViolation
|
|||
|---|---|---|---|
|
#18+
Да читал я эту статью. И не на телесистемах я его взял. Дайте хоть ссылку на эти телесистемы. Если посмотреть внимательно, то он - гибрид как раз с этой статьей. Это конечно круто стебаться и все такое. Но по делу-то есть что-нибудь? Я ни в одной книжке не могу найти, какие проблемы могут быть у delete. А пустой конструктор и деструктор - это я уж изгалялся. По делу плиз и без апломба. А то нахрен вообще писать чего-то ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.08.2006, 00:20 |
|
||
|
EAccessViolation
|
|||
|---|---|---|---|
|
#18+
polizeiДа читал я эту статью. И не на телесистемах я его взял. Дайте хоть ссылку на эти телесистемы. Если посмотреть внимательно, то он - гибрид как раз с этой статьей. Это конечно круто стебаться и все такое. Но по делу-то есть что-нибудь? Я ни в одной книжке не могу найти, какие проблемы могут быть у delete. А пустой конструктор и деструктор - это я уж изгалялся. По делу плиз и без апломба. А то нахрен вообще писать чего-то Да шутю я, шутю... ужо и обиделся... Обычная реакция на нежелание человека разбираться в проблеме. 1. Если ты и читал статью, то читал невнимательно: из статьи lpDCB Указатель на заполняемую структуру DCB. При этом структура должна быть уже создана и заполнена нулями , кроме поля DCBlength, которое должно содержать корректное значение. Возможно так же использование уже заполненой структуры DCB, например полученой вызовом одной из функций чтения параметров порта. Поэтому нужно что-то вроде memset(&dcb,0,sizeof(dcb)); Иначе, подозреваю, Open даже не отработает нормально. Я уже не говорю про неиспользование входных параметров Open'a. (ясно что экспериментировал, но эксперименты тоже надо ставить аккуратно) 2. Судя по приведённому коду трудно сказать что могдо вызвать AV, поэтому в интересах следствия выложи именно тот код, на котором был получен AV. + укажи испоьлзуемый компилятор и состояние самого COMa - к нему подключено что-нибудь, стоит заглушка TxD-RxD или ещё что-нибудь... 3. Ссылка на Телесистемы - третья по счёту из Гугля по строке MSerial. Класс там, похоже, тот же, но не исковерканный + пример работы с ним: http://www.telesys.ru/projects/proj064/mserial.h http://www.telesys.ru/projects/proj064/prog.cpp Попробуй приведённый там код, сначала без конструктора/деструктора, потом добавь (если уж так нужно ) ) и попробуй получить AV. Ну и дебаггером пройдись, посмотри что где портится... Удачи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2006, 14:19 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=33945313&tid=2030630]: |
0ms |
get settings: |
9ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
152ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
37ms |
get tp. blocked users: |
1ms |
| others: | 236ms |
| total: | 459ms |

| 0 / 0 |
