реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Visual C++, не могу отправить байт через COM порт ПК.
_Алекс
сообщение Aug 17 2007, 01:43
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 252
Регистрация: 14-09-06
Пользователь №: 20 377



Скачал где то исходник класса для работы с COM портом, немного переписал, порт открывается, но функцией WriteFile не пишется.

Открытие порта
bool CComPort::Open(LPCTSTR port, DWORD BaudRate, byte ByteSize, byte Parity, byte StopBits){
handle = CreateFile
(
port,
GENERIC_READ | GENERIC_WRITE,
NULL,
NULL,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
NULL
);

if(handle == INVALID_HANDLE_VALUE){
return false;
};
if(!SetupComm(handle, SizeBuffer, SizeBuffer)){
return false;
};
if(!GetCommState(handle, &dcb)){
return false;
};
dcb.BaudRate = BaudRate;
dcb.fBinary = true;
dcb.fOutxCtsFlow = false;
dcb.fOutxDsrFlow = false;
dcb.fDtrControl = DTR_CONTROL_DISABLE ;
dcb.fDsrSensitivity = false;
dcb.fNull = false;
dcb.fRtsControl = RTS_CONTROL_DISABLE;
dcb.fAbortOnError = false;
dcb.ByteSize = ByteSize;
dcb.Parity = Parity;
dcb.StopBits = StopBits;

if(!SetCommState(handle, &dcb)){
return false;
};
if(!GetCommTimeouts(handle, &CommTimeOuts)){
return false;
};

CommTimeOuts.ReadIntervalTimeout = TimeoutInterval;
CommTimeOuts.ReadTotalTimeoutMultiplier = TimeoutChar;
CommTimeOuts.ReadTotalTimeoutConstant = TimeOutWait;
CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
CommTimeOuts.WriteTotalTimeoutConstant = 0;
if(!SetCommTimeouts(handle, &CommTimeOuts)){
return false;
};

ResetRB();
ResetWB();
return true;
};

Запись в порт
unsigned short CComPort::Write(byte *buffer, unsigned short numbytes){
DWORD temp;
if(numbytes){
ClearCommError(handle, &temp, &ComState);
if((numbytes + ComState.cbOutQue)>=SizeBuffer)
MessageBox(NULL, "Íåâîçìîæíî ïîìåñòèòü â âûõîäíîé áóôåð ", "", MB_OK);
boolean result=WriteFile(handle, buffer, numbytes, &temp, &Overlap);
if(result){
return (unsigned short)temp;
};
};
return 0;
};

Возвращает 0, и количество отправленных байтов 0.

Инициализация открытия порта
if(Open("COM1", CBR_57600, DATABITS_8, EVENPARITY, ONESTOPBIT))
MessageBox(NULL, "COM1 Îòêðûò", "Îòêðûò!" , MB_OK);
else
MessageBox(NULL, "COM1 íåâîçìîæíî îòêðûòü!", "Îøèáêà!" , MB_OK);
Go to the top of the page
 
+Quote Post
XVR
сообщение Aug 17 2007, 10:29
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(_Алекс @ Aug 17 2007, 05:43) *
Скачал где то исходник класса для работы с COM портом, немного переписал, порт открывается, но функцией WriteFile не пишется.

Открытие порта
Порт открывается в overlapped режиме
Цитата
Запись в порт
...

boolean result=WriteFile(handle, buffer, numbytes, &temp, &Overlap);
...


В порт записывают в overlapped режиме

Цитата
Возвращает 0, и количество отправленных байтов 0.
- Что означает ошибку записи, я даже знаю какую - ERROR_IO_PENDING, что означает что операция записи все еще выполняется, как вы и хотели (иначе зачем нужно было открывать порт в overlapped режиме).



См. MSDN, функции GetOverlappedResult и WaitForSingleObject
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 15th July 2025 - 09:51
Рейтинг@Mail.ru


Страница сгенерированна за 0.01377 секунд с 7
ELECTRONIX ©2004-2016