Новичок
Профиль
Группа: Участник
Сообщений: 4
Регистрация: 4.1.2012
Репутация: нет Всего: нет
|
Здравствуйте. Вроде всё написал, а ничего не работает. Может и некорректно, но что-то же должно передаваться и приходить. По кнопке инициализируется порт и создаются два потока (чтение и запись) Код | void CterminalDlg::OnBnClickedConnect() { int error; PortReady=1; LPCTSTR filename=TEXT("\\\\.\\COM4"); FilePath=CreateFile(filename,GENERIC_READ | GENERIC_WRITE,NULL,0,OPEN_EXISTING, FILE_FLAG_OVERLAPPED,NULL); if(!(PortReady = GetCommState(FilePath, &dcb))) error= GetLastError(); else { dcb.BaudRate =CBR_115200; dcb.ByteSize = 8; dcb.Parity = NOPARITY; dcb.StopBits = ONESTOPBIT;
if(!(PortReady=SetCommState(FilePath, &dcb))) error= GetLastError(); else if(!(PortReady = GetCommTimeouts (FilePath, &CommTimeouts))) error= GetLastError(); else { if(!(PortReady = SetCommTimeouts (FilePath, &CommTimeouts))) error= GetLastError(); }}
if (!PortReady) { s.Format(_T("Error: %u"),error); m_Status.SetWindowTextW(s); } else { s="ok"; m_Status.SetWindowText(s); }
ReadThread=CreateThread(NULL,0, &CterminalDlg::Read,this,0,0); WriteThread=CreateThread(NULL,0, &CterminalDlg::Write,this,0,0); }
|
Для записи Код | DWORD WINAPI CterminalDlg::Write(LPVOID pParam ) { char NumBuf[10]={0x9,0x8,0x7,0x6,0x5,0x4,0x3,0x2,0x1,0x0}; char WordBuf[6]={0xF,0xE,0xD,0xC,0xB,0xA};
wchar_t buff[256]; char buf[256]; int f=0,fl; DWORD NumOfBytes; DWORD i; CterminalDlg * pCterminalDlg = (CterminalDlg*) pParam; pCterminalDlg->overlappedwr.hEvent = CreateEvent(NULL, true, true, NULL); while(1) { NumOfBytes=sizeof(char)*(pCterminalDlg->m_SendInfo.GetWindowTextLength()); //wchar_t* buf= new wchar_t [NumOfBytes]; pCterminalDlg->m_SendInfo.GetWindowText(buff,NumOfBytes+1); WideCharToMultiByte(CP_ACP,0,buff,NumOfBytes,buf,NumOfBytes,NULL,NULL); for(unsigned int BytesToWrite=0; BytesToWrite<NumOfBytes;BytesToWrite++)//только большие буквы { if(BytesToWrite%2==0) { if(buf[BytesToWrite]<0x40) buf[BytesToWrite]=(NumBuf[0x39-buf[BytesToWrite]]<<4)&0xF0; else buf[BytesToWrite]=(WordBuf[0x46-buf[BytesToWrite]]<<4)&0xF0; } else { if(buf[BytesToWrite]<0x40) buf[BytesToWrite]=NumBuf[0x39-buf[BytesToWrite]]; else buf[BytesToWrite]=WordBuf[0x46-buf[BytesToWrite]]; f++;buf[BytesToWrite-f]=buf[BytesToWrite-1]|buf[BytesToWrite];
} } WriteFile(pCterminalDlg->FilePath,buf,NumOfBytes/2,&i,&(pCterminalDlg->overlappedwr)); int signal=WaitForSingleObject(pCterminalDlg->overlappedwr.hEvent, INFINITE);
if((signal == WAIT_OBJECT_0)&&(GetOverlappedResult(pCterminalDlg->FilePath, &(pCterminalDlg->overlappedwr), &i, true))) fl = true; else fl = false; // delete [] buf; SuspendThread(pCterminalDlg->WriteThread);} return 0; }
|
Для чтения Код | DWORD WINAPI CterminalDlg::Read(LPVOID pParam ){
CterminalDlg * pCterminalDlg = (CterminalDlg*) pParam; OVERLAPPED OverRead = {0}; COMSTAT ComStat; DWORD dwMask,signal,temp; char Buf[1024]; DWORD dwRead; OverRead.hEvent = CreateEvent(NULL, TRUE, TRUE, NULL); SetCommMask(pCterminalDlg->FilePath, EV_RXCHAR); while(1){ if (!WaitCommEvent(pCterminalDlg->FilePath, &dwMask, &OverRead)) if (GetLastError() == ERROR_IO_PENDING) signal= WaitForSingleObject(OverRead.hEvent, INFINITE); if(signal == WAIT_OBJECT_0) { if(GetOverlappedResult(pCterminalDlg->FilePath, &OverRead, &temp, true)) if((dwMask & EV_RXCHAR)!=0) { ClearCommError(pCterminalDlg->FilePath, &temp, &ComStat); dwRead = ComStat.cbInQue; if (dwRead) if (!ReadFile(pCterminalDlg->FilePath, Buf, dwRead, &temp, &OverRead)) return 1; // В Buf находятся прочитанные байты // Далее идет обработка принятых байтов CString s,j; for (DWORD b=0; b<temp;b++){ j.Format(_T("%c"),*(Buf+b)); s+=j;} pCterminalDlg->m_GetInfo.SetWindowText(s); return 0; } } } }
|
По другой кнопке активируется поток записи Код | void CterminalDlg::OnBnClickedButton2() {
ResumeThread(WriteThread); }
|
Добавлено через 8 минут и 44 секундыВ обоих потоках, как положено, программа доходит до WaitForSingleObject и всё. дальше ничего не происходит.
|