Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> comport, чтение и запись 
V
    Опции темы
kooos
Дата 4.1.2012, 03:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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 и всё. дальше ничего не происходит.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0577 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.