2013-02-04 76 views
16

मैं एक छोटे टर्मिनल ऐप में आईओटीटीएल के साथ आरटीएस सेट करने में सक्षम हूं, लेकिन मेरे मैक प्लगइन कोड में नहीं, हालांकि दोनों एक ही कोड चलाते हैं। प्लगइन में मैं केवल सीरियल पोर्ट्स फ्लैग/पिन को "प्राप्त" कर सकता हूं, लेकिन उन्हें "सेट" नहीं कर सकता। टर्मिनल ऐप में मैं दोनों को "प्राप्त और" सेट कर सकता हूं। मुझे ईएनओडीईवी की गलती मिलती है। त्रुटि संख्या 1 9 है और संदेश "ऑपरेशन डिवाइस द्वारा समर्थित नहीं है।"मैं मैक प्लगइन में ioctl() के साथ आरटीएस कैसे सेट कर सकता हूं?

यदि यह एक सुरक्षा समस्या है (ब्राउज़र के संदर्भ में) क्या ioctl के साथ ध्वज को संशोधित करने की अनुमति प्राप्त करने का कोई तरीका है? मेरे पास एक यूएसबी पोर्ट से जुड़ा एक सीरियल डिवाइस है। मैं एफटीडीआई वीसीपी (वर्चुअल कॉम पोर्ट) ड्राइवर का उपयोग कर रहा हूं। विंडोज़ पर सब कुछ आसान ।। ओर Btw, मैं दोनों सफारी और Firefox का उपयोग कर ही परिणाम मिल नीचे मेरी कोड है:

int disableRTS() 
{ 
    char fd, ret, flags; 

    // open device 
    if ((fd = open("/dev/cu.mydevice", O_RDWR | O_NDELAY)) < 0) 
    { 
     fprintf(stderr, "failed to open device"); 
     return -1; 
    } 

    // Get the current state of the bits 
    ioctl(fd, TIOCMGET, &flags); 
    fprintf(stderr, "Flags are %x.\n", flags);  

    flags &= ~TIOCM_RTS; // Disable the RTS bit 
    ret = ioctl(fd, TIOCMSET, &flags); 

    if (ret == -1) 
     fprintf(stderr, "TIOCMSET failed\n"); 
    else 
     fprintf(stderr, "TIOCMSET succeeded. flags: %x.\n", flags); 

    return 0; 
} 

=========

अद्यतन

यदि मैं ब्राउज़र पेज को रीफ्रेश करता हूं, तो कोड को फिर से निष्पादित करने के लिए मजबूर करता है, ioctl() 0 देता है, सफलता का संकेत देता है। दुर्भाग्य से, मुझे पहली बार काम करने की ज़रूरत है। यहां तक ​​कि अगर मैं एक लूप लिखता हूं और क्षणिक रूप से रोकता हूं, तो नींद() विधि का उपयोग करके, और बाद में प्रयास करता है, यह विफल रहता है। लेकिन फिर, जब मैं ताज़ा करता हूं तो यह सफल होता है। मैंने इस मुद्दे को एक दूसरे, विशेष रूप से एनपीएपीआई प्रोजेक्ट "बेसिकप्लगिन.क्सकोडप्रोज़" में भी डुप्लिकेट किया है, जो मोज़िला द्वारा प्रदान किया गया है। मेरा पहला प्लगइन प्रोजेक्ट एक फायरब्रिथ प्रोजेक्ट है। वे दोनों पहले विफल हो जाते हैं, फिर पेज रीलोड पर सफल होते हैं। मेरे पास 2 अलग मैक ऐप्स भी हैं जो ठीक से काम करते हैं। एक SerialTools है, और यह मेरे टर्मिनल ऐप और प्लगइन्स के रूप में आरटीएस (और डीटीआर ऑफ) पर सेट करने की सटीक विधि का उपयोग करता है।

========

अद्यतन 2

मैं इस पर कोड स्तरीय एप्पल समर्थन प्राप्त कर लिया है, तो एक समाधान आ रहा सकता है। इंजीनियर ने कहा कि यह "विचित्र" था कि कोड एक प्लगइन में अलग-अलग चलता है, और सफारी प्लगइन इंजीनियरों के साथ बात कर रहा है।

+0

'fprintf' त्रुटि केस को 'perror (" TIOCMSET ") पर कॉल में बदलें और देखें कि त्रुटि क्या कहती है। –

+0

मुझे खेद है, मैं उल्लेख करना भूल गया। त्रुटि संदेश "ऑपरेशन डिवाइस द्वारा समर्थित नहीं है।" यह त्रुटि संख्या 19. ईएनडीईडीवी है। – Alyoshak

+0

अभी तक कोई सही उत्तर नहीं मिलने के बारे में बक्षीस के रूप में, मुझे नहीं पता कि क्या करना है। मुझे लगता है कि मैं इसे खोने जा रहा हूं भले ही एक ऐप्पल इंजीनियर ने इस मुद्दे को स्वीकार कर लिया है और समाधान ढूंढने की कोशिश कर रहा है। कहा गया था कि यह "विचित्र" था कि प्लगइन कोड गैर प्लगइन कोड से अलग काम करता है। कम से कम मैं किसी भी मदद के लिए एक सही उत्तर जोड़ने में सक्षम हो जाएगा। – Alyoshak

उत्तर

1

जवाब यह है कि जब भी TIOCMSET या TIOCMGET ioctl के लिए एक कॉल में किया जाता है() 3 पैरामीटर एक पूर्णांक होना चाहिए है किया जाएगा। मैं एक char का उपयोग कर रहा था। ओह। विश्वास नहीं कर सकता मैं इसे याद किया। TIOCMSET और TIOCMGET इस प्रकार परिभाषित कर रहे हैं:

#define TIOCMSET _IOW('t', 109, int) /* set all modem bits */ 
    … 
    #define TIOCMGET _IOR('t', 106, int) /* get all modem bits */ 

और इसलिए यह कल्पना करना कि मेरी "झंडे" वर के लिए प्रकार के रूप में एक चार का उपयोग कर अप्रत्याशित व्यवहार के कारण हो सकता मुश्किल नहीं है।

1

आप एक ऐप्पलस्क्रिप्ट प्लगइन बना सकते हैं, जो स्वचालित रूप से विशेष रूप से या आपके लॉगिन के दौरान, या लगातार पृष्ठभूमि में चलाएगा।

ऐप्पलस्क्रिप्ट टर्मिनल कोड चला सकता है। तो आप आसानी से टर्मिनल में चलने वाले प्राप्त/सेट कोड को स्वचालित रूप से चला सकते हैं।

AppleScript प्लगइन के लिए कोड कुछ इस तरह ::

tell application "Finder" 
    display dialog explanation buttons {"GET", "SET"} default button "GET" 
    if result = {button returned:"GET"} then 
     tell application "Terminal" 
       set status to (do shell script "terminal code for getting the RTS here") 
      end tell 
    else if result = {button returned:"SET"} then 
      tell application "Terminal" 
       set status to (do shell script "terminal code for setting the RTS here") 
      end tell 
    end if 
end tell