Код ошибки есть ? GetLastError() ClearCommError() Вероятнее всего, неправильная настройка dcb... http://msdn.microsoft.com/en-us/library/ms679360%28VS.85%29.aspx
http://msdn.microsoft.com/en-us/library/aa363180%28v=vs.85%29.aspx
/*====================================================================================================================*/
int industrial_control::rs232_init(QString port_name)
{
#ifdef __WINDOWS__
unsigned int err_code;
char str[256];
COMMTIMEOUTS CommTimeouts;
DCB PortDCB;
#endif
rs232_release();
#ifdef __WINDOWS__
rs232 = CreateFile((TCHAR*)port_name.utf16(), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); // Handle to port with attribute to copy
if ( rs232 == INVALID_HANDLE_VALUE )
{err_code= GetLastError();
sprintf(str,"нРЙПШРХЕ ОНПРЮ com_%d МЕСЯОЕЬМН. яБЕДЕМХЪ:( %x)", ui->rs232_ch->value(), err_code);
QMessageBox::critical( 0, _ERROR_TEXT, QString::fromLocal8Bit(str), _EXIT_TEXT );
return 0;
}
PortDCB.DCBlength = sizeof (DCB); // sizeof(DCB)
GetCommState (rs232, &PortDCB);
PortDCB.BaudRate = 115200; // Current baud rate
PortDCB.fBinary = FALSE; // Binary mode, no EOF check
PortDCB.fParity = FALSE; // Enable parity checking
PortDCB.fOutxCtsFlow = FALSE; // No CTS output flow control
PortDCB.fOutxDsrFlow = FALSE; // No DSR output flow control
PortDCB.fDtrControl = DTR_CONTROL_DISABLE;// DTR flow control type
PortDCB.fDsrSensitivity = FALSE; // DSR sensitivity
PortDCB.fTXContinueOnXoff = FALSE; // XOFF continues Tx
PortDCB.fOutX = FALSE; // No XON/XOFF out flow control
PortDCB.fInX = FALSE; // No XON/XOFF in flow control
PortDCB.fErrorChar = FALSE; // Disable error replacement
PortDCB.fNull = FALSE; // Disable null stripping
PortDCB.fRtsControl = RTS_CONTROL_TOGGLE;// RTS flow control
PortDCB.fAbortOnError = FALSE; // Do not abort read/write on error
PortDCB.XonLim=4; // Transmit X-ON threshold
PortDCB.XoffLim=16; // Transmit X-OFF threshold
PortDCB.ByteSize = 8; // Number of bits/byte, 4-8
PortDCB.Parity = NOPARITY; // 0-4=no,odd,even,mark,space
PortDCB.StopBits = ONESTOPBIT; // 0,1,2 = 1, 1.5, 2
PortDCB.XonChar=0x11; // Tx and Rx X-ON character
PortDCB.XoffChar=0x13; // Tx and Rx X-OFF character
if (!SetCommState (rs232, &PortDCB))
{err_code= GetLastError();
sprintf(str,"НЬХАЙЮ (мЕ СЯРЮМЮБКХБЮЕРЯЪ DCB) %x", err_code);
QMessageBox::critical( 0, _ERROR_TEXT, QString::fromLocal8Bit(str), _EXIT_TEXT );
rs232_release();
return 0;
}
GetCommTimeouts (rs232, &CommTimeouts);
CommTimeouts.ReadIntervalTimeout = 1000;
CommTimeouts.ReadTotalTimeoutMultiplier = 0;
CommTimeouts.ReadTotalTimeoutConstant = 1;
CommTimeouts.WriteTotalTimeoutMultiplier = 0;
CommTimeouts.WriteTotalTimeoutConstant = 1000;
if (!SetCommTimeouts (rs232, &CommTimeouts))
{err_code= GetLastError();
sprintf(str,"НЬХАЙЮ (мЕ СЯРЮМЮБКХБЮЕРЯЪ DCB) яБЕДЕМХЪ:( %x)", err_code);
QMessageBox::critical( 0, _ERROR_TEXT, QString::fromLocal8Bit(str), _EXIT_TEXT );
rs232_release();
return 0;
}
EscapeCommFunction (rs232, SETDTR);
EscapeCommFunction (rs232, SETRTS);
#endif
return 1;
}
/*====================================================================================================================*/
int industrial_control::rs232_tx(unsigned char *tx_buf, unsigned int tx_len)
{unsigned long v;
unsigned long err;
COMSTAT comStat;
WriteFile (rs232, tx_buf, tx_len, &v, NULL);
if (v != tx_len)
{char str[256];
sprintf(str, "- ОЕПЕДЮВЮ ОЮЙЕРЮ %s Б TPM101 МЕСЯОЕЬМЮ ", tx_buf);
if (!ClearCommError(rs232, &err, &comStat))
{log_add_str(QString::fromLocal8Bit(str)); rs232_tx_err++;return 0;}
if(err & CE_DNS) strcat(str," fDNS-error; ");
if(err & CE_IOE) strcat(str," fIOES-error; ");
if(err & CE_OOP) strcat(str," fOOP-error; ");
if(err & CE_PTO) strcat(str," fPTO-error; ");
if(err & CE_MODE) strcat(str," fMODE-error; ");
if(err & CE_BREAK) strcat(str," fBREAK-error; ");
if(err & CE_FRAME) strcat(str," fFRAME-error; ");
if(err & CE_RXOVER) strcat(str," fRXOVER-error; ");
if(err & CE_TXFULL) strcat(str," fTXFULL-error; ");
if(err & CE_OVERRUN) strcat(str," fOVERRUN-error; ");
if(err & CE_RXPARITY) strcat(str," fRXPARITY-error; ");
log_add_str(QString::fromLocal8Bit(str));
rs232_tx_err++;
return 0;
}
rs232_tx_ok++;
return 1;
}
/*====================================================================================================================*/
int industrial_control::rs232_rx(unsigned char *rx_buf, unsigned int nbytes)
{unsigned long n;
unsigned long err;
COMSTAT comStat;
ClearCommError(rs232, &err, &comStat);
if(err)
{return 0;}
ReadFile (rs232, rx_buf, nbytes, &n, 0); /* Read the data from the serial port. */
if(!n)
{char str[256];
sprintf(str, "%s schedule=0x%x: МЕР НРБЕРЮ НР ЙНМРПНККЕПЮ.", _PLC_EXCHANGE_TXT, schedule_tm);
log_add_str(QString::fromLocal8Bit(str));
memset(tx_buf, 0, TXBUF_SIZE);
return 0;
}
if (!ClearCommError(rs232, &err, &comStat))
{log_add_str(QString::fromLocal8Bit(str)); rs232_tx_err++;return 0;}
if(err & CE_DNS) strcat(str," fDNS-error; ");
if(err & CE_IOE) strcat(str," fIOES-error; ");
if(err & CE_OOP) strcat(str," fOOP-error; ");
if(err & CE_PTO) strcat(str," fPTO-error; ");
if(err & CE_MODE) strcat(str," fMODE-error; ");
if(err & CE_BREAK) strcat(str," fBREAK-error; ");
if(err & CE_FRAME) strcat(str," fFRAME-error; ");
if(err & CE_RXOVER) strcat(str," fRXOVER-error; ");
if(err & CE_TXFULL) strcat(str," fTXFULL-error; ");
if(err & CE_OVERRUN) strcat(str," fOVERRUN-error; ");
if(err & CE_RXPARITY) strcat(str," fRXPARITY-error; ");
log_add_str(QString::fromLocal8Bit(str));
rs232_tx_err++;
return 0;
}
return n;
}
++
http://msdn.microsoft.com/en-us/library/aa363180%28v=vs.85%29.aspx
-
- есть пару скользких моментов koyodza(756 знак., 23.05.2011 14:14)
- Спасибо, как сотня баксов для нищего! :) - Vladimir Ljaschko(23.05.2011 14:02)
- Спасибо в стакан не нальёшь и в карман не положишь. - fk0(23.05.2011 14:57)