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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ещё раз о ком-порте, или как с ним работать. 
:(
    Опции темы
UniBomb
Дата 4.12.2006, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 97



Пробежался по поиску, но ответов на следующие вопросы не нашёл, если баян - простите...

Итак, накачав кучу литературы по работе ком-портом в синхронном режиме - сдеал - всё работает, но в глаза бросаются откровенные минусы синхронной работы, скачал кучу литературы по работе в асинхронном режие - есть вопросы. Во-первых - у меня реализована инициализационная часть, части приёма/передачи данных, но не могу понять, куда мне надо впихнуть ожидающую часть. 

Код

lasterr = WaitCommEvent(port, &EventMask, &OL);
 if ((!lasterr) && (GetLastError()==ERROR_IO_PENDING))
  {
   WaitForSingleObject(OL.hEvent, 1);
  }
 ComPortAlfa->CheckBox1->Checked = !ComPortAlfa->CheckBox1->Checked;
 if(EventMask & EV_CTS)            cts->Visible = !cts->Visible;
 if(EventMask & EV_DSR)            dsr->Visible = !dsr->Visible;
 if(EventMask & EV_RXCHAR)
  {
   rxd->Visible = !rxd->Visible;
   ReceiveData();
   rxd->Visible = !rxd->Visible;
  }
 if(EventMask & EV_TXEMPTY)    txd->Visible = !txd->Visible;


По идее, этот кусок кода в фоновом режиме ожидает наступление одного из событий, после чего становится ясно, что произошло. Так вот, я не могу понять, куда его впихнуть, что бы вместе с ожиданием делать что либо ещё. Если вставить в тело программы в цикл с бесконечным числом иттераций (циклов), то программа попросту виснет (на самом деле просто ждёт события), чего по идее в асинхронном режиме не должно быть. Пока остановился на варианте выполнения этого куска по таймеру, установленному на 2 мс (во вотором параметре функции вейтворсинглобжект стоит значение 1 мс). Так как же всё таки должно быть???

Второй вопрос - какой функцией можно воздействовать на состояние таких выводов как RTS, CTS, DTR, DSR, RI, ERROR?

Вопрос третий - может проще работать с какой-либо компонентой? Если у кого есть пожелания - прошу высказать.

Ниже приведён полный код тестового проекта:

Код

//---------------------------------------------------------------------------
#include <vcl.h>
#include <stdio.h>
#include <conio.h>
#pragma hdrstop
#include "main.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TComPortAlfa *ComPortAlfa;
LPCTSTR pname = "COM1";
DWORD lasterr;
DWORD CommEventMask;
HANDLE port;
DCB dcb;
COMMTIMEOUTS ct;
OVERLAPPED OL;
DWORD EventMask;
FILE *fp;
String transsmited_data,received_data;
//---------------------------------------------------------------------------
__fastcall TComPortAlfa::TComPortAlfa(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void WriteErrorFile(DWORD errcode)
{
 String errordata = DateTimeToStr(Now());
 String errorword = _sys_errlist[errcode];
 fp = fopen("Error_List_report.rpt", "a+");
 fprintf(fp, " %s  |  %s  |  %d \n",errordata,errorword,errcode);
 fclose(fp);
}
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void TransmitData(String tdata)
{
 DWORD bc;
 lasterr = WriteFile(port,&tdata,tdata.Length(),&bc,&OL);
 if (lasterr != 0)
  {
   WriteErrorFile(lasterr);
   return;
  }
 ComPortAlfa->Terminal->Text = ComPortAlfa->Terminal->Text + tdata;
 ComPortAlfa->txd->Visible = !ComPortAlfa->txd->Visible; 
}
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void ReceiveData()
{
 DWORD bc;
 String rdata;
 DWORD ErrorMask = 0;
 COMSTAT CStat;
 ClearCommError(port, &ErrorMask, &CStat);
 DWORD rdata_count = CStat.cbInQue;

 lasterr = ReadFile(port,&rdata,rdata_count,&bc,&OL);
/* if (lasterr != 0)
  {
   WriteErrorFile(lasterr);
   return;
  }
*/
 if ((rdata_count == 0) && (GetLastError() == ERROR_IO_PENDING))
  {
   //DoSomeThink();
  }
 else
  {
   if /*(*/(rdata_count > 0)// && (rdata.Length() >0))
    {
     ComPortAlfa->Terminal->Lines->Add("[Rx]->");
     ComPortAlfa->Terminal->Text = ComPortAlfa->Terminal->Text + rdata;
     received_data = rdata;
     if( PurgeComm(port, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR) == NULL )
      {
       lasterr = GetLastError();
       WriteErrorFile(lasterr);
      }
     EventMask=0;
     ResetEvent(OL.hEvent);
    }
   else
    {
     lasterr = GetLastError();
     WriteErrorFile(lasterr);
    }
  }
}
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void WaitSomeObject()
{
 ComPortAlfa->CheckBox1->Checked = !ComPortAlfa->CheckBox1->Checked;
 lasterr = WaitCommEvent(port, &EventMask, &OL);
 if ((!lasterr) && (GetLastError()==ERROR_IO_PENDING))
  {
   WaitForSingleObject(OL.hEvent, 1000);
  }
 ComPortAlfa->CheckBox1->Checked = !ComPortAlfa->CheckBox1->Checked;
}
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool PortOpen(LPCTSTR portname)
{
 port = CreateFile(portname,GENERIC_READ | GENERIC_WRITE,
                   FILE_SHARE_READ | FILE_SHARE_WRITE,
                   NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);
 if (port == INVALID_HANDLE_VALUE)
  {
   lasterr = GetLastError();
   return false;
  }
 else
  {
   lasterr = 0;
   return true;
  }
}
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool PortIni(HANDLE iniport)
{
 dcb.DCBlength = sizeof(DCB);
 BuildCommDCB("baud=38400 parity=E data=8 stop=1",&dcb);
 dcb.fNull = false;
 lasterr = SetCommState(iniport, &dcb);
 if( lasterr==NULL )
  return false;
 ct.ReadIntervalTimeout = 250;
 ct.ReadTotalTimeoutMultiplier=ct.ReadTotalTimeoutConstant=150;
 ct.WriteTotalTimeoutMultiplier=ct.WriteTotalTimeoutConstant=0;
 lasterr = SetCommTimeouts(iniport,&ct);
 if( lasterr==NULL )
  return false;
 lasterr = 0;
 return true;
}
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void __fastcall TComPortAlfa::OpenPortClick(TObject *Sender)
{
 if (!PortOpen(pname))
  {
   ComPortAlfa->Caption = _sys_errlist[lasterr];
   ComPortAlfa->Caption = ComPortAlfa->Caption + "_" + IntToStr(lasterr);
   WriteErrorFile(lasterr);
   return;
  }
 if (!PortIni(port))
  {
   ComPortAlfa->Caption = _sys_errlist[lasterr];
   ComPortAlfa->Caption = ComPortAlfa->Caption + "_" + IntToStr(lasterr);
   WriteErrorFile(lasterr);
   return;
  }

lasterr = PurgeComm(port, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
 if (lasterr == NULL)
  {
   ComPortAlfa->Caption = _sys_errlist[lasterr];
   ComPortAlfa->Caption = ComPortAlfa->Caption + "_" + IntToStr(lasterr);
   WriteErrorFile(lasterr);
   return;
  }
lasterr = ClearCommBreak(port);
 if (lasterr == NULL)
  {
   ComPortAlfa->Caption = _sys_errlist[lasterr];
   ComPortAlfa->Caption = ComPortAlfa->Caption + "_" + IntToStr(lasterr);
   WriteErrorFile(lasterr);
   return;
  }

 CommEventMask = EV_BREAK | EV_CTS | EV_DSR | EV_ERR | EV_RING |
                      EV_RLSD | EV_RXCHAR | EV_RXFLAG | EV_TXEMPTY;

 lasterr = SetCommMask(port,CommEventMask);
 if(lasterr == NULL)
  {
   ComPortAlfa->Caption = _sys_errlist[lasterr];
   ComPortAlfa->Caption = ComPortAlfa->Caption + "_" + IntToStr(lasterr);
   WriteErrorFile(lasterr);
   return;
  }

OL.hEvent=CreateEvent(NULL, TRUE, FALSE, NULL);
EventMask = 0;

 ComPortAlfa->Caption = "Port is open";
 OpenPort->Enabled = !OpenPort->Enabled;
 ClosePort->Enabled = !ClosePort->Enabled;
 SendingMessage->Enabled = !SendingMessage->Enabled;
 SMess->Enabled = !SMess->Enabled;
 Terminal->Enabled = !Terminal->Enabled;
 SendingMessage->Clear();
 Terminal->Clear();

// WaitSomeObject();
 Timer1->Enabled = true;
}
//---------------------------------------------------------------------------
void __fastcall TComPortAlfa::ClosePortClick(TObject *Sender)
{
 Timer1->Enabled = false;
 CloseHandle(port);
 OpenPort->Enabled = !OpenPort->Enabled;
 ClosePort->Enabled = !ClosePort->Enabled;
 SendingMessage->Enabled = !SendingMessage->Enabled;
 SMess->Enabled = !SMess->Enabled;
 Terminal->Enabled = !Terminal->Enabled;
 SendingMessage->Clear();
 Terminal->Clear();
}
//---------------------------------------------------------------------------
void __fastcall TComPortAlfa::SettingPortClick(TObject *Sender)
{
 Timer1->Enabled = false;
 CloseHandle(port);
 OpenPort->Enabled = true;
 ClosePort->Enabled = false;
 SendingMessage->Enabled = false;
 SMess->Enabled = false;
 Terminal->Enabled = false;
 SendingMessage->Clear();
 Terminal->Clear();
}
//---------------------------------------------------------------------------
void __fastcall TComPortAlfa::SMessClick(TObject *Sender)
{
 Terminal->SelAttributes->Color = clRed;
 Terminal->Lines->Append("[Tx]->");
 Terminal->SelAttributes->Color = clLime;
// Terminal->Lines->Append(SendingMessage->Text);
// static char buf_out[10] = "0123456789";
 String buf_out;

// buf_out=new char[SendingMessage->Text.Length() + 1 ];
 transsmited_data = SendingMessage->Text;

// buf_out = SendingMessage->Text.c_str();
// Terminal->Text = Terminal->Text + transsmited_data.Length();
// Terminal->Text = Terminal->Text + transsmited_data;
 TransmitData(transsmited_data);
 SendingMessage->Clear();
}
//---------------------------------------------------------------------------


void __fastcall TComPortAlfa::Timer1Timer(TObject *Sender)
{
 ComPortAlfa->CheckBox1->Checked = !ComPortAlfa->CheckBox1->Checked;
 lasterr = WaitCommEvent(port, &EventMask, &OL);
 if ((!lasterr) && (GetLastError()==ERROR_IO_PENDING))
  {
   WaitForSingleObject(OL.hEvent, 1);
  }
 ComPortAlfa->CheckBox1->Checked = !ComPortAlfa->CheckBox1->Checked;
 if(EventMask & EV_CTS)            cts->Visible = !cts->Visible;
 if(EventMask & EV_DSR)            dsr->Visible = !dsr->Visible;
 if(EventMask & EV_RXCHAR)
  {
   rxd->Visible = !rxd->Visible;
   ReceiveData();
   rxd->Visible = !rxd->Visible;
  }
 if(EventMask & EV_TXEMPTY)    txd->Visible = !txd->Visible;
}
//---------------------------------------------------------------------------
void __fastcall TComPortAlfa::FormClose(TObject *Sender,
      TCloseAction &Action)
{
 CloseHandle(port);
}
//---------------------------------------------------------------------------


Если есть какие-то замечания, то прошу их высказать.

И наконец - есть ли у кого литература по кольцам защиты? Если есть, киньте линк, пожалуйста.

ЗЫ:. любителей посылать в гугл, яндекс и в прочие нечистивые места просьба не беспокоится - уже были, ничего толкового не найдено...
PM MAIL ICQ Skype   Вверх
UniBomb
Дата 7.12.2006, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 97



прошло три дня, ответов нет... smile  Я всегда знал, что у меня талант создавать мёртвые темы. Может хоть кто-то ответит  smile 
PM MAIL ICQ Skype   Вверх
witex
Дата 8.12.2006, 00:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 224
Регистрация: 16.10.2006
Где: Эстония

Репутация: 1
Всего: 4



Скажи что у тебя за прибор?? Это раз!
Во вторых, обычно приборы любят делать так! Вначале принимают какой то контрольный сигнал обычно или '\r' или  '\n'. Так что попробуй чтонить ему вначале послать чтобы потом принять!
--------------------
Я не волшебник, я только учусь."Шлёпни в Гугл" - Афтор Былов Ю.М. 
PM MAIL   Вверх
serge_mok
Дата 8.12.2006, 08:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 6.12.2006

Репутация: нет
Всего: нет



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

memset(&ovr,0,sizeof(ovr));
    ovr.hEvent=CreateEvent(NULL,FALSE,FALSE,NULL);
...

ReadFile(port,buf_in,strlen(buf_in),&bc,&ovr);
    
    if(WaitForSingleObject(ovr.hEvent,100)==WAIT_OBJECT_0) {
        GetOverlappedResult(port,&ovr,&bc,FALSE);
    } 
    else {
        // Обработка ошибки 
        MessageBox("Устройство не отвечает!","Error",MB_OK);
        ExitProcess(1);    
    }

кстати общий таймаут по передаче неплохо бы сделать например 150.
А просто в режиме оверлэпид не пробовал(при открытии порта), вроде тогда передача/приём должны быть в фоновом режиме?
Если я чего то недопонял, то это не со зла smile...

Добавлено @ 09:08 
кстати вот ещё:

EscapeCommFunction(port,SETDTR);  //установка DTR,... RTS

е установить dcb->fDtrControl=RTS_CONTROL_TOGGLE;
то RTS будет автоматически уст-ся при предаче

соот-но: CTS, DSR, RI, - входа, на них воздействуй внешним устр-ом
либо своими же DTR, RTS
а зачем тебе они нужны, делаешь RS485?
PM MAIL   Вверх
UniBomb
Дата 8.12.2006, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 97



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

Код

lasterr = WaitCommEvent(port, &EventMask, &OL);    
 if ((!lasterr) && (GetLastError()==ERROR_IO_PENDING))    
  {    
   WaitForSingleObject(OL.hEvent, 1);    
  }    
 ComPortAlfa->CheckBox1->Checked = !ComPortAlfa->CheckBox1->Checked;    
 if(EventMask & EV_CTS)            cts->Visible = !cts->Visible;    
 if(EventMask & EV_DSR)            dsr->Visible = !dsr->Visible;    
 if(EventMask & EV_RXCHAR)    
  {    
   rxd->Visible = !rxd->Visible;    
   ReceiveData();    
   rxd->Visible = !rxd->Visible;    
  }    
 if(EventMask & EV_TXEMPTY)    txd->Visible = !txd->Visible;


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


serge_mok, 
а почему ты сначала читаеш из файла, а потом ждёш каких либо событий?
А по сигналам всё просто - хочется побаловаться....
PM MAIL ICQ Skype   Вверх
serge_mok
Дата 8.12.2006, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 6.12.2006

Репутация: нет
Всего: нет



По твоему коду... не знаю, скажу только одно пробовал также через 
WaitCommEvent(port, &EventMask, &OL);
толку никакого, не пошло.

Сначала читаю , а потом жду?...ну это,я как бы пытаюсь отловить ошибку приёма. поскольку я считаю что задал асинхр режим , то насчёт подвисаний не озадачиваюсь(хотя я озадачился в корректности smile )...ааа, кстати, у меня было мнение,
что твой вариант для синхр работы порта. не пробовал в своём случае задавать синхр режим ?
А в чём подвисание выражается?, при приёме?

Есть ещё такой примерчик:

port=CreateFile("COM2",GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL);
PurgeComm(port,PURGE_RXCLEAR);

. . .

SetCommMask(port,EV_RXCHAR);
WaitCommEvent(port,&mask,NULL); //ожидаем первый символ в буфере, а потом читаем в синхр реж

ReadFile(port,buf,100,&bc,NULL);
   
. . . 

Про нулевое кольцо?, по моему где то попадалось, мне эта тема тоже интересна
По сигналам ещё, там хрень такая...задержки на вкл/выкл неопределённые, от 5 до 20 мс ,так что...
Да вот ещё , по поводу иниц порта:

dwShareMode  -
  Задает параметры совместного доступа к файлу. Коммуникационные порты нельзя делать   
 разделяемыми
, поэтому данный параметр должен быть равен 0.
 
а у тебя там чего то задано...глянь ещё раз...

кстати , не в тему, перешёл с асма на СИ...это просто сказка, прогр пишется с пол пинка...

PM MAIL   Вверх
UniBomb
Дата 9.12.2006, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 97



[quote]
serge_mok, 

Насчёт синхронной/асинхронной работы - если шестой параметр функции CreateFile равен значению FILE_FLAG_OVERLAPPED, то он открывается в асинхронном режиме, если 0, то в синхронном. Поэтому перечитай то, что ты читал до этого... Насчёт "читаю а потом жду" - вообщето есть другой механизм (он есть у меня в коде) - ты когда вызвал функцию чтения, но она ничего не прочитала, то смотри значение GetLastError(), если оно  равно кажися значению ERROR_IO_PENDING, то это значит в данный момент асинхронная операция выполняется и следует обождать ещё немного времени. 

Код

port=CreateFile("COM2",GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL);
PurgeComm(port,PURGE_RXCLEAR);


в данном примере ты открываеш порт только на чтение, причём в синхронном режиме. Второй строчкой ты просто очищаеш буфер приёма порта (тот самый файл). Тут нет ничего необычного.

Код

SetCommMask(port,EV_RXCHAR);
WaitCommEvent(port,&mask,NULL); //ожидаем первый символ в буфере, а потом читаем в синхр реж

ReadFile(port,buf,100,&bc,NULL);


Если бы всё было так просто... Как раз такой кусок кода и будет подвисать, так как фнкция ReadFile прочтёт только тогда, когда все байты будут приняты или не истечёт время на чтение. А так как в синхронном режиме чтение происходит в том же потоке где и работает твоя программа, то соответсвенно она просто на какое-то время зависнет (т.е. просто не будет возврата из функции чтения)

Цитата

dwShareMode  -
  Задает параметры совместного доступа к файлу. Коммуникационные порты нельзя делать   
 разделяемыми, поэтому данный параметр должен быть равен 0


У меня там вообщето стоит FILE_SHARE_READ | FILE_SHARE_WRITE, но если чесно, то не помню откуда я это взял... Просто ctrl+c, ctrl+v и больше CreateFile не трогал...

Код

void __fastcall TRealForum::FloodForever(TObject *Writer)
{


Цитата

кстати , не в тему, перешёл с асма на СИ...это просто сказка, прогр пишется с пол пинка...


Чего и следовало ожидать, ты ещё попробуй Си++ - это вообще пипец!!! smile  Я же на асме пищу только под ATMeg'у...

Код

return  :) ;
}

PM MAIL ICQ Skype   Вверх
serge_mok
Дата 11.12.2006, 05:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 6.12.2006

Репутация: нет
Всего: нет



Я про ATMeg'у и имел ввиду, ты думал я для персоналки на асме пишу?...

про разницу между синх и асинх реж , а также что у меня в моём коде задано я в курсе...
Если так критично, тогда выделяй работу с портом в отдельный поток...
PM MAIL   Вверх
UniBomb
Дата 11.12.2006, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 97



serge_mok,

Цитата

Я про ATMeg'у и имел ввиду, ты думал я для персоналки на асме пишу?...


 А-А-А-А-А-А, вот оно что...

Цитата

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


Вообще кретично, но с асинхрроным режимом выпендриваться со вторым потоком не нужно... Надо только да конца с ним раобраться... 

Обращение к модерации:

Раз уж тема не является источником ответов на мои вопросы, то воизбежании дальнейшего флудоблудия прошу тему дизасемблировать и аннигилировать в анналы истории...
PM MAIL ICQ Skype   Вверх
takedo
Дата 11.12.2006, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 501
Регистрация: 1.6.2005

Репутация: -1
Всего: 3



UniBomb, пля! Сразу бы сказал, что протокол у тебя 485. Там ведь надо реально регистры подергать. Я не нашел в свое время. Но у меня было все проще - делали переходник 232 - 422 и все было нормально. Тебе надо делать железяку переходник, который будет дергать(взводить) регистры или чего там а соответствии с 485.  Походу в виндовс 2000 и выше нельзя без нулевого кольца, но потом новая версия - новый драйвер. Нафига это надо? Работай по 232 и через переходник его... smile

Добавлено @ 14:55 
И ещё, в асинхронном не работай, поищи по форуму, я там долго тему подымал. В итоге сейчас сосу постоянно и синхронно в отдельном потоке по 1 байту, ничего особенно не тормозит. Ты только свой асинхронный/синхронный не путай с виндосовским


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
UniBomb
Дата 11.12.2006, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 97



takedo, 

 smile  может я чего не так сказал? 

Во-первых - не надо путать протокол с интерфейсом! Протокола rs485 не существует, есть только интерфейс.

Во-вторых - реально регистры дёргать не надо! Их вообще дёргать не надо!

В-третьих - есть прибор, который общается по интерфейсу RS-485, протокол самопальный, но это не суть. До этого времени приборы отлично между собой общались, общаются и будут общаться, но возникла необходимость всё это дело мониторить на компьютере. Конвертер RS-232 - RS-485 есть, он полнофункционален и, что самое главное, рабочий.

В-четвёртых  - в интерфейсе RS-485 используются только информационные линии (две синфазные в полудуплексном режиме и четыре в полнодуплексном), никаких линий состояния и в помине нет!

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

В-шестых - основной вопрос изложен в первом посте топика...

Это сообщение отредактировал(а) UniBomb - 11.12.2006, 17:48
PM MAIL ICQ Skype   Вверх
serge_mok
Дата 12.12.2006, 06:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 6.12.2006

Репутация: нет
Всего: нет



вчера попробовал работать со скоростью 38400, как у тебя, устойчивой связи не получил...точнее вообще никакой, начались сработки таймаутов, начались тормоза...правда у меня атмега с внутр рц-осциллятором, калибровочный байт не помог. Ты не задумывался что проблема не в программной части, а в аппаратной...е уже долго персоналку трахаешь ,а толку нет, может дело не в ней?, чюдес ведь не бывает...
Цитата

...ты себя иссушил долгими поисками истины, а она уже давно внутри тебя...

smile...
PM MAIL   Вверх
takedo
Дата 12.12.2006, 08:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 501
Регистрация: 1.6.2005

Репутация: -1
Всего: 3




Цитата

Вообще кретично, но с асинхрроным режимом выпендриваться со вторым потоком не нужно...
 - все равно нужно, ибо пока ты будешь ждать, поток в котором ты ждешь, то есть основной, отрисовывающий твои данные тоже умрет.
Делай синхронно в отдельном потоке - меньше запарки.
Ну а вообщето я сначала не врубился, что у тебя проблема с асинхронным режимом smile . Там у тебя 217 строк кода приведено - думаешь есть люди, которые дочитают? разбирутся?


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
UniBomb
Дата 12.12.2006, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 97



serge_mok, 

Цитата

вчера попробовал работать со скоростью 38400, как у тебя, устойчивой связи не получил...точнее вообще никакой


ну это зависит только от внутренего рц-осцилятора. Выходная скорость расчитывается по формуле BAUD = f(ck)/16(UBRR+1), где BAUD - это полученная скорость, f(ck) - частота камня, а UBRR - регистр "скорости". Эта формула справедлива для асинхронного режима (в смысле без стробирующей линии, не путать с асинхронным режимом работы с файлом) без удвоения скорости. Внутренний осцилятор естетсвенно никогда не выдаст то значение, которое указано в даташите и в связи с этим и так неточный баудрейт может гулять ещё больше... А может ты просто не так его сконфигурировал. Кинь лучше инициализационную часть....

Цитата

 Ты не задумывался что проблема не в программной части, а в аппаратной...е уже долго персоналку трахаешь ,а толку нет, может дело не в ней?, чУдес ведь не бывает...


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


takedo, 

Цитата

- все равно нужно, ибо пока ты будешь ждать, поток в котором ты ждешь, то есть основной, отрисовывающий твои данные тоже умрет.
Делай синхронно в отдельном потоке - меньше запарки.


На моё нежелание создавать второй поток есть несколько причин:

1 - проще всё таки работать в асинхронном режиме
2 - фамильная упёртость, непозволяющая мне бросить незаконченное
3 - я не умею работать с потоками.... я ничего о них не знаю... smile

Цитата

Ну а вообщето я сначала не врубился, что у тебя проблема с асинхронным режимом  . Там у тебя 217 строк кода приведено - думаешь есть люди, которые дочитают? разбирутся?


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

ЗЫ:. А вообще прости меня за мой последний пост...
PM MAIL ICQ Skype   Вверх
serge_mok
Дата 12.12.2006, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 6.12.2006

Репутация: нет
Всего: нет



UniBomb, 

Цитата

Кинь лучше инициализационную часть....


да это не проблема, моё устройство(е его можно так назвать) вообще не для этого предназначено было, это макет для работы с граф ЖКИ smile...это типа пример/рассуждения вслух, на тему "правильно ли работает апп часть" на скорую руку ...ладно проехали..
а по поводу иниц , я ж говорю, на СИ перешёл, там встроенный билдер периферии - иниц автоматич делается, только нужно крыжиком не ошибиться smile

а ты наверно немецкий учил, или мне показалось? smile...  
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.

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


 




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


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

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