COM - порт

markmsk

Народ кто -н программил на Visual C++ для передачи и приёмки данных через СОМ - порт.
А то чего-то не получается.

Dasar

юзаешь, следующие функции и все у тебя будет:
OpenFile ("COM1", ....);
ReadFile/WriteFile
SetCommState/SetCommTimeOuts
а что конкретно не получается?

markmsk

Да - да именно так я всё и делаю, но всё равно данные с девайса в мою прогу не идут и тайм аут выставляю и дсб структуру потом посылаю в девайс ( буфер с данными) команду и по идее он должен выдать в мою прогу данные, но не выдаёт. Причём из нортоновского телемакса нормально работает.

Dasar

код покажи

markmsk

Вот мой код
СString com=combo->com;
CString rBuild;
rBuild="baud="+combo->speed+" parity=N data=8 stop=1";
char *build=rBuild.GetBuffer(rBuild.GetLength+1);
opening=CreateFile(com,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
DCB dcb_com;
ZeroMemory(&dcb_com,sizeof(dcb_com;
if(!::BuildCommDCB(build,&dcb_com {AfxMessageBox("ÎØÈÁÊÀ ïðè ïîñòðîåíèè DCB ñòðóêòóðû ÑÎÌ ïîðò íå ìîæåò áûòü îòêðûò.");els=FALSE;}
if(opening==INVALID_HANDLE_VALUE||opening==0){AfxMessageBox("Ñîì ïîðò íå ìîæåò áûòü îòêðûò.");els=FALSE;}
if(!:: EscapeCommFunction(opening,CLRDTR{AfxMessageBox("ÎØÈÁÊÀ ïðè óñòàíîâëåíèè ñòàòóñà ñîåäèíåíèÿ ÑÎÌ ïîðò íå ìîæåò áûòü îòêðûò.");els=FALSE;}
if(!:: EscapeCommFunction(opening,SETDTR{AfxMessageBox("ÎØÈÁÊÀ ïðè óñòàíîâëåíèè ñòàòóñà ñîåäèíåíèÿ ÑÎÌ ïîðò íå ìîæåò áûòü îòêðûò.");els=FALSE;}
if(!:: EscapeCommFunction(opening,CLRRTS{AfxMessageBox("ÎØÈÁÊÀ ïðè óñòàíîâëåíèè ñòàòóñà ñîåäèíåíèÿ ÑÎÌ ïîðò íå ìîæåò áûòü îòêðûò.");els=FALSE;}
if(!:: EscapeCommFunction(opening,SETRTS{AfxMessageBox("ÎØÈÁÊÀ ïðè óñòàíîâëåíèè ñòàòóñà ñîåäèíåíèÿ ÑÎÌ ïîðò íå ìîæåò áûòü îòêðûò.");els=FALSE;}
if(!::SetCommState(opening,&dcb_com {AfxMessageBox("ÎØÈÁÊÀ ïðè óñòàíîâëåíèè ñòàòóñà ñîåäèíåíèÿ ÑÎÌ ïîðò íå ìîæåò áûòü îòêðûò.");els=FALSE;}
if(!::SetupComm(opening,256,256 {AfxMessageBox("ÎØÈÁÊÀ ïðè óñòàíîâëåíèè ñòàòóñà ñîåäèíåíèÿ ÑÎÌ ïîðò íå ìîæåò áûòü îòêðûò.");els=FALSE;}
_COMMTIMEOUTS commout;
сommout.ReadIntervalTimeout=10;
сommout.ReadTotalTimeoutMultiplier=1;
commout.ReadTotalTimeoutConstant=5000;
commout.WriteTotalTimeoutMultiplier=1;
commout.WriteTotalTimeoutConstant=5000;
if(!::SetCommTimeouts(opening,&commout {AfxMessageBox("Îøèáêà");els=FALSE;}
DWORD lpNumberOfBytesRead;
DWORD tick1=GetTickCount;
DWORD d_tick;
int d_tic;
BOOL bResult;
CString rrString="";
char pBuffer='\0';
if(combo->m_iRadio==2)
{//combo->m_iRadio==2
DWORD lpNumberOfBytesWritten;
char* nChar="+_*&^%$#ASuy";
bResult=WriteFile(opening,nChar,14,&lpNumberOfBytesWritten,NULL);
}//combo->m_iRadio==2

Dasar

запости нормально, плиз, без извратов с русскими символами
зы
А зачем ты так пишешь?


CString rBuild;
rBuild="baud="+combo->speed+" parity=N data=8 stop=1";
char *build=rBuild.GetBuffer(rBuild.GetLength+1);
...
if(!::BuildCommDCB(build,&dcb_com


можно писать короче и правильнее:


CStirng build = "baud=" + combo->speed + " parity=N data=8 stop=1";
...
if(!::BuildCommDCB(build,&dcb_com

markmsk

Вставляю код нормально
CString com=combo->com;
CString rBuild="baud="+combo->speed+" parity=N data=8 stop=1";
char *build=rBuild.GetBuffer(rBuild.GetLength+1);
opening=CreateFile(com,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
DCB dcb_com;
ZeroMemory(&dcb_com,sizeof(dcb_com; f(!::BuildCommDCB(build,&dcb_com ;els=FALSE;
if(opening==INVALID_HANDLE_VALUE||opening==0) ;els=FALSE;
if(!:: EscapeCommFunction(opening,CLRDTR ;els=FALSE;
if(!:: EscapeCommFunction(opening,SETDTR;els=FALSE;
if(!:: EscapeCommFunction(opening,CLRRTS;els=FALSE;
if(!:: EscapeCommFunction(opening,SETRTS;els=FALSE;
if(!::SetCommState(opening,&dcb_com ;els=FALSE;
if(!::SetupComm(opening,256,256 ;els=FALSE;
_COMMTIMEOUTS commout;
сommout.ReadIntervalTimeout=10;
commout.ReadTotalTimeoutMultiplier=1;
commout.ReadTotalTimeoutConstant=5000;
commout.WriteTotalTimeoutMultiplier=1;
commout.WriteTotalTimeoutConstant=5000;
if(!::SetCommTimeouts(opening,&commout els=FALSE; lpNumberOfBytesRead;
DWORD tick1=GetTickCount;
DWORD d_tick;
int d_tic;
BOOL bResult;
CString rrString="";
char pBuffer='\0';
if(combo->m_iRadio==2)
{//combo->m_iRadio==2
DWORD lpNumberOfBytesWritten;
char* nChar="+_*&^%$#ASuy";
bResult=WriteFile (opening,nChar,14,&lpNumberOfBytesWritten,NULL);
}//combo->m_iRadio==2
for(unsigned int i=0,k=0;;k++)
{//for.Read.for
bResult=ReadFile(opening,&pBuffer,sizeof(char&lpNumberOfBytesRead,NULL);
DWORD tick2=GetTickCount;
d_tick=tick2-tick1;
if(lpNumberOfBytesRead) tick1=tick2;
d_tic=d_tick;
if(lpNumberOfBytesRead==0&&(d_tic>=10000
{//if break
CloseHandle(opening);
els=TRUE;
break;
}//if break
if(pBuffer=='\r' || pBuffer=='\n')
{//pBuffer=='\r'
arr_str.SetAtGrow(i,rrString);
i++;
rrString="";
if(combo->m_iRadio==2 && combo->m_bClear)
{//m_bClear
DWORD lpNumberOfBytesWritten;
char *nChar="+_*&^%$#ACn";
bResult=WriteFileopening,nChar,13,&lpNumberOfBytesWritten,NULL);
}//m_bClear
continue;
}//pBuffer=='\r'
if(pBuffer=='\n') continue;
if(pBuffer=='\r') continue;
if(pBuffer=='\0') continue;
rrString+=pBuffer;
}//for.Read.for

Dasar

а что за железяка?

markmsk

Буфер последовательного канала на 2 метра считывает данные с различных устройств затем его подсоединяют к компу и считывают данные с него. Наример можно программой телемакс из нортона, но мне нужно считать из своей проги.

Dasar

а зачем ты EscapeCommFunction дергаешь? так в документации к железке написано?

Dasar

по опыту могу сказать, что если что-то не коннектится, значит не правильно заданы настройки соединения, либо не правильные запросы.

markmsk

Нет Escape дёргаю потому что надо пытаться что-то сделать ( первоночально пытался без него). Нет в инструкции нет ничего к нему. Единственнное я забыл в команде \r добавить, но добавил сегодня и никаких изменнений.

Dasar

сложно что-то конретно посоветовать, на первый взгляд, все делаешь правильно. Значит остается только шаманить и прыгать с бубном: проверить еще раз правильность настроек, посмотреть идут ли данные на железяку, в чем разница при подсоединении термина и твоим подсоединением.

markmsk

Что бы проверить выходят ли данные нужен нуль модем.
У тебя случайно нет нуль модемного кабеля. А вообще если ты жиёшь в общаге может зайёдшь в гости глянишь на мою софтину свежим взглядом. Я живу 1366лев.
Оставить комментарий
Имя или ник:
Комментарий: