2009-02-20 10 views
6

वीबीए से सीरियल पोर्ट तक पहुंचने का सबसे अच्छा तरीका क्या है?वीबीए से सीरियल पोर्ट तक पहुंचने का सबसे अच्छा तरीका क्या है?

मुझे हमारे कुछ विक्रय प्रतिनिधिों को पावरपॉइंट में एक्शन बटन से सीरियल पोर्ट पर एक साधारण स्ट्रिंग भेजने में सक्षम होने की आवश्यकता है। मैं आमतौर पर वीबीए का उपयोग नहीं करता, खासकर इस तरह के किसी भी चीज़ के लिए। आम तौर पर मैं इसे किसी प्रकार के अनुप्रयोग में बदल दूंगा, लेकिन मुझे नहीं लगता कि यह विचार बुरा है। प्रोजेक्टर के साथ और अन्य बिक्री लोगों और गैर तकनीकी लोगों से बात करने के लिए यह इस डिवाइस को डेमो करने के लिए एक आसान उपकरण होगा। साथ ही, इस बिक्री लड़के को वीबीए या पावरपॉइंट प्रेजेंटेशन में छोटे बदलाव करने में कोई समस्या नहीं होगी, लेकिन एक .NET एप्लिकेशन को पुन: सम्मिलित करने के साथ-साथ ऐसा नहीं होगा।

मुझे पता है कि हम इसे कार्रवाई पर प्रस्तुति से चलने वाली बैच फ़ाइल के माध्यम से कर सकते हैं, लेकिन इससे मुझे बहुत खुशी नहीं मिलती है। मुझे लगता है कि हम शायद एक COM ऑब्जेक्ट तक पहुंच सकते हैं और वहां से चल सकते हैं, लेकिन फिर मैं वीबीए में उपयोग करने के लिए नवीनतम और महानतम पुस्तकालयों पर वास्तविक नहीं हूं, और यह आसानी से खोलने के तरीके में एक त्वरित छोटा प्राइमर प्राप्त करना भी अच्छा होगा, कनेक्शन भेजें और बंद करें।

चूंकि इसे कई लोगों के कंप्यूटर पर चलाने की आवश्यकता होगी, यह अच्छा होगा अगर यह अन्य मशीनों के लिए आसानी से परिवहन योग्य होगा। मुझे यह कहना चाहिए कि इसे Office 2007 और Windows XP पर चलाना है। हालांकि किसी और चीज के साथ संगतता एक अच्छा बोनस होगा।

मुझे इसे संभालने के बारे में कैसे जाना चाहिए? कोई अच्छी युक्तियाँ या चालें? लाइब्रेरी सिफारिशें?

उत्तर

11

Win32 API फ़ाइल के रूप में धारावाहिक पोर्ट को संभालता है। आप इन एपीआई कार्यों को वीबीए के भीतर से कॉल करके सीधे सीरियल पोर्ट तक पहुंच सकते हैं। मुझे इसे पुराने .NET एप्लिकेशन के लिए करना था लेकिन वीबीए अलग नहीं था।

इस साइट पर आपके लिए हैश की बजाय, यहां एक संदर्भ है जिसे मैंने वर्षों से लटका दिया है। How to perform serial port communications in VBA

+0

+1 साइट के लिए एक कामकाजी उदाहरण है। – Oorang

0
Sub Stinky() 
Dim COM_Byte As Byte 
Dim Received_Lines As Long 
Dim Input_Buffer As String 
Dim Output_Buffer As String 
Dim Chars2Send As Long 
Dim CharsRemaining As Long 
Dim lfsr As Long 
    Open "COM7:9600,N,8,1" For Random As #1 Len = 1 
    Input_Buffer = "" 
    CharsRemaining = 0 
    Do 
    Get #1, , COM_Byte 
    If COM_Byte Then 
     If COM_Byte = 13 Then   ' look for CR line termination 
      Debug.Print Input_Buffer, Now ' print it 
      Input_Buffer = ""    ' and clear input buffer 
     ' generate some output (9 characters) 
      lfsr = &H3FFFFFFF - 2^(Received_Lines And 15) 
      Output_Buffer = "[email protected]@@@@@@@" 
      Chars2Send = 9 
      CharsRemaining = 9 
      For j = 0 To 2 
       Mid(Output_Buffer, 2 + j, 1) = Chr(Asc(Mid(Output_Buffer, 2 + j, 1)) + (31 And Int(lfsr/32^(2 - j)))) 
      Next j 
      Debug.Print Output_Buffer 
     ' show what I generated 
      Received_Lines = Received_Lines + 1 ' keep track of received line count 
     Else 
      Input_Buffer = Input_Buffer & Chr(COM_Byte) ' assemble output buffer 
     ' process any characters to send 
      If CharsRemaining Then 
       CharsRemaining = CharsRemaining - 1 
       COM_Byte = Asc(Mid(Output_Buffer, Chars2Send - CharsRemaining, 1)) 
       Put #1, , COM_Byte 
      End If 
     End If 
    End If 
    DoEvents 
    Loop 
    Close 
End Sub 

यह मेरे लिए काम करता है। मुझे यकीन नहीं है कि ओपन वास्तव में बाउड दर सेट करता है, क्योंकि मैंने पहले टेराटर्म का उपयोग किया था। मेरा COM पोर्ट एक बेसिस 3 प्रोटोटाइप किट के लिए एक यूएसबी कनेक्शन है। यह 9600 पर पात्रों को फेंक रहा है, सीआर के साथ समाप्त होने वाले 36 वर्णों के रिकॉर्ड। मैं यादृच्छिक रूप से 9 वर्णों के आदेश भेज सकता हूं। उपर्युक्त कोड में, जब भी मुझे एक नई लाइन प्राप्त होती है, तो मैं इन कमांड स्ट्रिंग उत्पन्न करता हूं। जिस तरह से मैंने चुना है कि कौन सा चरित्र भेजना है, वह थोड़ा सा गुंजाइश है: शायद एक बेहतर तरीका है कि एक चरित्र सूचक और कई वर्ण हों, और जब वे दोनों को शून्य पर सेट करने के बराबर हो जाएं।

+0

यदि COM पोर्ट रैंडम के रूप में खोला गया है, तो ऐसा प्रतीत होता है कि ईओएफ आपको बताता है कि जब आपके पास कोई चरित्र प्राप्त होता है। इसका मतलब है कि कोई एक नल चरित्र प्राप्त कर सकता है। ईओएफ का कहना है कि कोई पात्र इंतजार नहीं कर रहा है। –

+0

ओपन में बाउड दर सेट करना काम नहीं लगता है। लेकिन शैल "mode.com com7: 9600, n, 8,1" काम करता है, यदि आप OPEN "COM7:" खोलने से पहले एक सेकंड प्रतीक्षा करते हैं, तो यह सभी एक्सेल 2010 है। –

+0

कॉम पोर्ट के साथ ईओएफ पर यादृच्छिक के रूप में अपडेट करें: ऐसा लगता है जैसे ईओएफ प्राप्त चरित्र के साथ नहीं बदलता है, लेकिन जीईटी की स्थिति को दर्शाता है। तो # 1 प्राप्त करने के बाद, vByte, ईओएफ गलत होगा जब vByte मान्य है। –

संबंधित मुद्दे