Hallo Wolfgang
och, ich sehe gerade, dass Du ja gar kein Problem mit COM (Component Object Model) und dem Zugriff auf Excel hast, sondern nur auf den Port zugreifen willst:
Kannst Du denn nicht auf die Windows-API zugreifen? Das läßt sich doch alles durch ganz einfache Funktionsaufrufe erledigen (CreateFile(), ReadFile(), WriteFile()) - meiner Erfahrung nach hat man die Sache dreimal selber geschrieben, bevor man bei einem fertigen Control durchsteigt und es wirklich gut läuft.
Ich kann Dir das mal als C++-Code aus einem Projekt kopiert vor die Füsse werfen, das müßte sich eigentlich leicht auf VB umsetzen lassen. Zum Einlesen brauchst Du aber einen Thread oder mußt per Timer toggeln
//--------------------------------------------------------------------------- HANDLE m_SerBus; //--------------------------------------------------------------------------- void t_crc_port::Open(string Port) { // Also z.B. Open("COM1"); if (m_SerBus!= INVALID_HANDLE_VALUE) CloseHandle(m_SerBus);
if (Port.empty()) { m_SerBus= INVALID_HANDLE_VALUE; // Keinen COM-Port benutzen } else { // mit COM-Port einrichten m_SerBus= CreateFile( Port.c_str(), GENERIC_READ|GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL|FILE_FLAG_WRITE_THROUGH, 0);
_DCB COM_Para; GetCommState(m_SerBus, &COM_Para); COM_Para.BaudRate= CBR_2400; COM_Para.fBinary= true; // binary mode, no EOF check COM_Para.fParity= false; // enable parity checking COM_Para.fOutxCtsFlow= false; // CTS output flow control COM_Para.fOutxDsrFlow= false; // DSR output flow control COM_Para.fDtrControl= DTR_CONTROL_DISABLE; // DTR flow control type COM_Para.fDsrSensitivity= false; // DSR sensitivity COM_Para.fTXContinueOnXoff= false; // XOFF continues Tx COM_Para.fOutX= false; // XON/XOFF out flow control COM_Para.fInX= false; // XON/XOFF in flow control COM_Para.fErrorChar= false; // enable error replacement COM_Para.fNull= false; // enable null stripping COM_Para.fRtsControl= RTS_CONTROL_DISABLE; // RTS flow control COM_Para.fAbortOnError= false; // abort reads/writes on error COM_Para.ByteSize= 8; // number of bits/byte, 4-8 COM_Para.Parity= NOPARITY; // 0-4=no,odd,even,mark,space COM_Para.StopBits= ONESTOPBIT; // 0,1,2 = 1, 1.5, 2
SetCommState(m_SerBus, &COM_Para); // Port konfigurieren _COMMTIMEOUTS NoTime={ MAXDWORD, MAXDWORD, 25, 5, 5}; // Beim Lesen max 25 ms auf Empfang warten, bzw. sofort zurückkehren, // wenn Empfang vorhanden // Timeout beim Schreiben mit 5 ms pro Byte berechnen ( bei 2400 Baud) // und mit Schreibzeit für ein Byte als Sicherheitskonstante SetCommTimeouts(m_SerBus, &NoTime); SetCommMask(m_SerBus, EV_TXEMPTY); } //--------------------------------------------------------------------------- // Schreiben: unsigned long ULen; if (!WriteFile(m_SerBus, &m_SendePuffer[0], S_Len, &ULen, NULL) || ULen!= S_Len) { RetVal= false; }
//--------------------------------------------------------------------------- // Lesen: uint32 Gelesen; // Referenz für Anzahl der gelesenen Bytes uint8 Zeichen; // Referenz für gelesenes Byte
if (ReadFile(m_SerBus, &Zeichen, 1, &Gelesen, 0) && Gelesen) { // Empfangene Bytes nacheinander aus Schnittstelle lesen
//--------------------------------------------------------------------------- Lesen kann man natürlich auch blockweise in einen Puffer - ich lese das nur byteweise, weil das meine Auswertungschleife stark vereinfacht.
HTH,
Ed