Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Visual C++, не могу отправить байт через COM порт ПК.
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > Программирование
_Алекс
Скачал где то исходник класса для работы с 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);
XVR
Цитата(_Алекс @ 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
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.