الأحداث/الانقطاعات في الاتصال التسلسلي

StackOverflow https://stackoverflow.com/questions/255337

  •  05-07-2019
  •  | 
  •  

سؤال

أريد القراءة والكتابة من المسلسل باستخدام الأحداث/المقاطعات.حاليًا، لدي في حلقة زمنية وهو يقرأ ويكتب بشكل مستمر من خلال المسلسل.أريد أن يقرأ فقط عندما يأتي شيء ما من المنفذ التسلسلي.كيف يمكنني تنفيذ ذلك في C++؟

هذا هو الكود الحالي الخاص بي:

    while(true)
    {
        //read
        if(!ReadFile(hSerial, szBuff, n, &dwBytesRead, NULL)){
        //error occurred. Report to user.
        }

        //write
        if(!WriteFile(hSerial, szBuff, n, &dwBytesRead, NULL)){
        //error occurred. Report to user.
        }


        //print what you are reading
        printf("%s\n", szBuff);

    }
هل كانت مفيدة؟

المحلول

إستخدم select البيان، الذي سيتحقق من المخازن المؤقتة للقراءة والكتابة دون حظر ويعيد حالتها، لذلك تحتاج فقط إلى القراءة عندما تعلم أن المنفذ يحتوي على بيانات، أو الكتابة عندما تعلم أن هناك مساحة في المخزن المؤقت للإخراج.

المثال الثالث في http://www.developerweb.net/forum/showthread.php?t=2933 والتعليقات المرتبطة بها قد تكون مفيدة.

يحرر: تحتوي صفحة الدليل الخاصة بالتحديد على مثال أبسط وأكثر اكتمالًا بالقرب من النهاية.يمكنك العثور عليه في http://linux.die.net/man/2/select لو man 2 select لا يعمل على النظام الخاص بك.

ملحوظة: إتقان select() سيسمح لك بالعمل مع كل من المنافذ والمقابس التسلسلية؛إنه في قلب العديد من عملاء وخوادم الشبكة.

نصائح أخرى

لبيئة Windows نهج أكثر الأصلي سيكون لاستخدام <لأ href = "http://msdn.microsoft.com/en-us/library/aa365683(VS.85).aspx" يختلط = "نوفولو noreferrer "> غير المتزامن I / O . في هذا الوضع لا يزال استخدام المكالمات لطلب & ReadFile و WriteFile، ولكن بدلا من حظر لك تمر في وظيفة رد الاتصال التي سيتم استدعاؤه عند اكتمال العملية.

وأنها صعبة إلى حد ما للحصول على كل التفاصيل على الرغم من الحق.

وهنا هو نسخة من التي نشرت في ج / C ++ المستخدمين مجلة قبل بضع سنوات. وغني في التفاصيل على API Win32 و.

وهنا رمز التي تقرأ البيانات الواردة التسلسلية باستخدام انقطاع على ويندوز يمكنك معرفة الوقت المنقضي خلال وقت الانتظار انقطاع

int pollComport(int comport_number, LPBYTE buffer, int size) { BYTE Byte; DWORD dwBytesTransferred; DWORD dwCommModemStatus; int n; double TimeA,TimeB; // Specify a set of events to be monitored for the port. SetCommMask (m_comPortHandle[comport_number], EV_RXCHAR ); while (m_comPortHandle[comport_number] != INVALID_HANDLE_VALUE) { // Wait for an event to occur for the port. TimeA = clock(); WaitCommEvent (m_comPortHandle[comport_number], &dwCommModemStatus, 0); TimeB = clock(); if(TimeB-TimeA>0) cout <<" ok "<<TimeB-TimeA<<endl; // Re-specify the set of events to be monitored for the port. SetCommMask (m_comPortHandle[comport_number], EV_RXCHAR); if (dwCommModemStatus & EV_RXCHAR) { // Loop for waiting for the data. do { ReadFile(m_comPortHandle[comport_number], buffer, size, (LPDWORD)((void *)&n), NULL); // Display the data read. if (n>0) cout << buffer <<endl; } while (n > 0); } return(0); } }

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top