ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Воскресенье
19 мая
255147 Топик полностью
++ (23.05.2011 13:51, просмотров: 303) ответил Vladimir Ljaschko на Ком-порт PC затыкается после трех символов.
Код ошибки есть ? 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; }
++