2012-04-29 8 views
8

में PHP सीरियल संचार मैंने फेडोरा 13. में xampp स्थापित किया है। मैं php सीरियल क्लास का उपयोग कर सीरियल पोर्ट के माध्यम से माइक्रोकंट्रोलर के साथ संवाद करने की कोशिश कर रहा हूं। मेरे कोड example.phpलिनक्स

include("php_serial.class.php"); 
$serial = new phpSerial(); 
$serial->deviceSet("0"); 

$serial->confBaudRate(9600); //Baud rate: 9600 
$serial->confParity("none"); //Parity (this is the "N" in "8-N-1") 
$serial->confCharacterLength(8); //Character length (this is the "8" in "8-N-1") 
$serial->confStopBits(1); //Stop bits (this is the "1" in "8-N-1") 
$serial->confFlowControl("none"); //Device does not support flow control of any kind, so set it to none. 

//Now we "open" the serial port so we can write to it 
$serial->deviceOpen(); 

$serial->sendMessage("*1"); //sleep(1); // echo "hi"; $serial->deviceClose(); 

?> 

php स्क्रिप्ट के निष्पादित हो जाता है लेकिन निम्न चेतावनियों देता है।

चेतावनी: निर्दिष्ट सीरियल पोर्ट पर लाइन 147 चेतावनी /opt/lampp/htdocs/xampp/php_serial.class.php में मान्य नहीं है: बॉड दर निर्धारित करने में अक्षम: डिवाइस या तो सेट या में खोला नहीं है/लाइन 241 पर ऑप्ट/लैंप/htdocs/xampp/php_serial.class.php चेतावनी: समानता सेट करने में असमर्थ: डिवाइस या तो 2 9 5 पर /opt/lampp/htdocs/xampp/php_serial.class.php में सेट या खोला नहीं गया है

... मैंने आदेश दिया है: chmod 0777/dev/ttyUSB0 अनुमति देने के लिए। मैंने आदेश का उपयोग करके डायलआउट समूह में अपाचे उपयोगकर्ता "प्रधवी" जोड़ने का भी प्रयास किया है: $ usermod -a -G डायलआउट प्रध्वी

लेकिन यह काम नहीं करता है। जब मैं कमांड का उपयोग कर टर्मिनल से सीधे एक कमांड भेजता हूं: echo 1>/dev/ttyUSB0 यह काम करता है और '1' धारावाहिक बंदरगाह पर प्रेषित होता है। लेकिन PHP का उपयोग करके मुझे उपरोक्त चेतावनियां मिलती हैं।

मैंने उपयोगकर्ता के नाम की जांच करने के लिए "$ whoami" का उपयोग किया है और उस उपयोगकर्ता को "prudhvi" डायलआउट समूह में जोड़ा है। यह अभी भी काम नहीं करता है। कृपया मुझे लोगों की मदद करो।

+3

क्या आप निश्चित हैं कि php ttyUSB0 तक पहुंच रहा है? यह डिफ़ॉल्ट रूप से ttyS0 का उपयोग करने का प्रयास कर सकता है। –

उत्तर

0

सबसे पहले मूलभूत स्थापना का परीक्षण करने के लिए एक हैलो वर्ल्ड टाइप php स्क्रिप्ट का परीक्षण करें।

तो सत्यापित करें वेब सर्वर/php इंजन एक उपयोगकर्ता जो एक समूह लागू/dev/ttyWHATEVER उपकरण फ़ाइल सीरियल पोर्ट के लिए इसी का उपयोग करने की अनुमति दी है के रूप में चल रहा है। यह आश्चर्यजनक होगा अगर डिफ़ॉल्ट रूप से यह सच था - आपको शायद इसे 'डायलआउट' या इसी तरह के समूह में जोड़ना होगा।

अपने कोड में कुछ गलती जांच/रिपोर्टिंग जोड़ें।

2

आप "लाइन 147 पर /opt/lampp/htdocs/xampp/php_serial.class.php" से संबंधित लाइनों के पास/पोस्ट कर सकते हैं?

मुझे संदेह है कि आप डिवाइस को गलत तरीके से सेट करने की कोशिश कर रहे हैं (जैसा कि मार्क इंगित किया गया है)। या तो वह या बंदरगाह पहले से ही अन्य परीक्षणों से उपयोग में है जो आप एक ही समय में कर रहे हैं। मुझे यकीन नहीं है कि आप जिस स्क्रिप्ट को चला रहे हैं, वह बंदरगाहों के लिए विशिष्ट त्रुटियां प्रदान करता है जिन्हें आप पहले से उपयोग में संलग्न करने के लिए संलग्न कर रहे हैं।

3

मैंने इसे एक बार डेबियन के साथ एक PHP स्क्रिप्ट के साथ एक Arduino बोर्ड को नियंत्रित करने के लिए किया था और शुरुआत में एक ही समस्या में भाग गया।

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

डेबियन में आदेश है:

useradd -G dialout www-data 

हालांकि मैं फेडोरा नाम के बजाय अपाचे के रूप में अपाचे उपयोगकर्ता विश्वास करते हैं। मैं एक फेडोरा मशीन पर परीक्षण करने के लिए नहीं है, लेकिन मैं यह मान लेगा आदेश आप चलाने की आवश्यकता है:

useradd -G dialout apache 

तब आप अपने XAMPP सर्वर को पुनः आरंभ करने की आवश्यकता होगी।

संदर्भ के लिए निम्नलिखित देखें:

http://www.cyberciti.biz/faq/howto-linux-add-user-to-group/ http://fedoraproject.org/wiki/Administration_Guide_Draft/Apache#Apache_File_Security

नील

0

क्रेडिट मुझे के कारण इस को देखने के लिए के लिए मार्क बी की टिप्पणी को जाता है, और वह पर मर चुका है: http://www.phpclasses.org/browse/file/17926.html

function deviceSet ($device) 
{ 
    if ($this->_dState !== SERIAL_DEVICE_OPENED) 
    { 
     if ($this->_os === "linux") 
     { 
      if (preg_match("@^COM(\d+):[email protected]", $device, $matches)) 
      { 
       $device = "/dev/ttyS" . ($matches[1] - 1); 
      } 

      if ($this->_exec("stty -F " . $device) === 0) 
      { 
       $this->_device = $device; 
       $this->_dState = SERIAL_DEVICE_SET; 
       return true; 
      } 
     } 
     elseif ($this->_os === "windows") 
     { 
      if (preg_match("@^COM(\d+):[email protected]", $device, $matches) and $this->_exec(exec("mode " . $device)) === 0) 
      { 
       $this->_windevice = "COM" . $matches[1]; 
       $this->_device = "\\.\com" . $matches[1]; 
       $this->_dState = SERIAL_DEVICE_SET; 
       return true; 
      } 
     } 

     trigger_error("Specified serial port is not valid", E_USER_WARNING); 
     return false; 
    } 
    else 
    { 
     trigger_error("You must close your device before to set an other one", E_USER_WARNING); 
     return false; 
    } 
} 

मुझे विश्वास है कि $serial->deviceSet("/dev/ttyUSB0"); पर कॉल करने से यह ठीक हो जाएगा, बी आपको /dev/ttyS के बजाय /dev/ttyUSB पर काम करने के लिए php_serial.class.php के स्रोत को संशोधित करना पड़ सकता है।