Как принять данные из COM-порта
От: Starwarrior  
Дата: 16.06.04 05:44
Оценка:
Кто-нибудь в курсе, какие надо ставить флаги в SetCommMask чтобы при поступлении любых данных в порт они тут же обрабатывались?
Re: Как принять данные из COM-порта
От: PauseBreak  
Дата: 16.06.04 08:49
Оценка:
Здравствуйте, Starwarrior, Вы писали:

S>Кто-нибудь в курсе, какие надо ставить флаги в SetCommMask чтобы при поступлении любых данных в порт они тут же обрабатывались?

Флаг EV_RXCHAR. При нем сразу вызывается обработчик, когда в буфер порта поступают данные, дальше ты сам считываешь.
P.S. Если не секрет, что за устройство, где ты выбрал ассинхронный режим работы COM-порта?
Re[2]: Как принять данные из COM-порта
От: Аноним  
Дата: 19.06.04 08:26
Оценка:
Здравствуйте, PauseBreak, Вы писали:

PB>Здравствуйте, Starwarrior, Вы писали:


S>>Кто-нибудь в курсе, какие надо ставить флаги в SetCommMask чтобы при поступлении любых данных в порт они тут же обрабатывались?

PB>Флаг EV_RXCHAR. При нем сразу вызывается обработчик, когда в буфер порта поступают данные, дальше ты сам считываешь.
PB>P.S. Если не секрет, что за устройство, где ты выбрал ассинхронный режим работы COM-порта?
Эх, не хочет EV_RXCHAR работать... А работаю с русской радиоаппаратурой
Re[3]: Как принять данные из COM-порта
От: PauseBreak  
Дата: 21.06.04 11:52
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, PauseBreak, Вы писали:


PB>>Здравствуйте, Starwarrior, Вы писали:


S>>>Кто-нибудь в курсе, какие надо ставить флаги в SetCommMask чтобы при поступлении любых данных в порт они тут же обрабатывались?

PB>>Флаг EV_RXCHAR. При нем сразу вызывается обработчик, когда в буфер порта поступают данные, дальше ты сам считываешь.
PB>>P.S. Если не секрет, что за устройство, где ты выбрал ассинхронный режим работы COM-порта?
А>Эх, не хочет EV_RXCHAR работать... А работаю с русской радиоаппаратурой
А при простом синхронном режиме данные получаешь?
Re[4]: Как принять данные из COM-порта
От: Аноним  
Дата: 22.06.04 06:03
Оценка:
еще один вопрос по теме — есть некое устройство (носимый терминал транкинговой связи), понимающее АТ команды. необходимо написать небольшую программку которая бы эти команды слала и получала ответ. Почитал все ветки, посвященные работе с портами, написал примерно следующее:

char *buf_out="AT\r";
char *buf_in;

DWORD bc;
DCB *dcb;
COMMTIMEOUTS ct;
HANDLE port;
DWORD mask;


dcb=(DCB*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(DCB));
BuildCommDCB("baud=38400 parity=N data=8 stop=1",dcb);
dcb->fNull=TRUE;

ct.ReadIntervalTimeout=50;
ct.ReadTotalTimeoutMultiplier=ct.ReadTotalTimeoutConstant=0;
ct.WriteTotalTimeoutMultiplier=ct.WriteTotalTimeoutConstant=0;


port=CreateFile("COM1",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
if(port==INVALID_HANDLE_VALUE) {
MessageBox("Error");
ExitProcess(1);
}
else m_status.AddString("Com1 connected...");

GetCommState(port,dcb);
SetCommState(port,dcb);
SetCommTimeouts(port,&ct);
HeapFree(GetProcessHeap(),0,dcb);



buf_in=(char*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,strlen(buf_out)+1);

WriteFile(port,buf_out,strlen(buf_out),&bc,NULL);

ReadFile(port,buf_in,strlen(buf_out),&bc,NULL);


Вообщем все как в приведенном примере. А в итоге вместо отмета "OK" я получаю в buf_in тоже самое что я слал в buf_out.

Подскажите что я делаю не так!
Re[5]: Как принять данные из COM-порта
От: PauseBreak  
Дата: 22.06.04 09:35
Оценка:
Здравствуйте, Аноним, Вы писали:

А>еще один вопрос по теме — есть некое устройство (носимый терминал транкинговой связи), понимающее АТ команды. необходимо написать небольшую программку которая бы эти команды слала и получала ответ. Почитал все ветки, посвященные работе с портами, написал примерно следующее:


А>char *buf_out="AT\r";

А>char *buf_in;

А>DWORD bc;

А>DCB *dcb;
А>COMMTIMEOUTS ct;
А>HANDLE port;
А>DWORD mask;


А>dcb=(DCB*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(DCB));

Не надо забывать указать dcb->DCBlength=sizeof(DCB);
А>BuildCommDCB("baud=38400 parity=N data=8 stop=1",dcb);
dcb->>fNull=TRUE;

А>ct.ReadIntervalTimeout=50;

А>ct.ReadTotalTimeoutMultiplier=ct.ReadTotalTimeoutConstant=0;
А>ct.WriteTotalTimeoutMultiplier=ct.WriteTotalTimeoutConstant=0;


А>port=CreateFile("COM1",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);

А>if(port==INVALID_HANDLE_VALUE) {
А>MessageBox("Error");
А>ExitProcess(1);
А>}
А>else m_status.AddString("Com1 connected...");

А>GetCommState(port,dcb);

А>SetCommState(port,dcb);
А>SetCommTimeouts(port,&ct);
А>HeapFree(GetProcessHeap(),0,dcb);



А>buf_in=(char*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,strlen(buf_out)+1);


А>WriteFile(port,buf_out,strlen(buf_out),&bc,NULL);

Между этими функциями должна быть временная задержка!
А>ReadFile(port,buf_in,strlen(buf_out),&bc,NULL);

Все функции выполняются? Проверки на ошибки есть?

Надо посмотреть полное описание устройства. wabo@inbox.ru.
Re[6]: Как принять данные из COM-порта
От: Аноним  
Дата: 23.06.04 11:27
Оценка:
Здравствуйте, PauseBreak, Вы писали:


PB>Все функции выполняются? Проверки на ошибки есть?


PB>Надо посмотреть полное описание устройства. wabo@inbox.ru.


Спасибо большое, все наконец-то заработало!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.