संपादित करने के साथ कोई समस्या होने के बाद: मैंने निम्न स्क्रिप्ट के साथ कुछ परीक्षण किया है (यहां पाया गया: PHP serial port data return from Arduino)। ऐसा प्रतीत होता है कि fwrite का उपयोग करने के लिए/dev/ttyUSB0 को भी मेरा नया कमांड और डिवाइस से भेजे गए अंतिम आदेश को आउटपुट करता है। इससे मुझे लगता है कि शायद धारावाहिक बंदरगाह सही ढंग से स्थापित नहीं किया गया था (उदाहरण के लिए बफर को साफ़ करने के लिए सेटिंग्स को बदलने के लिए stty का उपयोग करने की आवश्यकता हो सकती है) या बफर को साफ़ करने के लिए मुझे कुछ और करने की आवश्यकता है (php के साथ)/dev/एक नया आदेश भेजने से पहले ttyUSB0। किसी भी मदद को सराहा जाएगा, धन्यवाद।PHP का उपयोग कर सीरियल पोर्ट को कैसे लिखें? बफरिंग
$fp =fopen("/dev/ttyUSB0", "w+");
if(!$fp) {
echo "Error";die();
}
fwrite($fp, $_SERVER['argv'][1] . 0x00);
echo fread($fp, 10) . "\n";
fclose($fp);
मूल प्रश्न:
मैं सीरियल पोर्ट के माध्यम से एक डिवाइस के साथ संवाद करने के लिए php-धारावाहिक का उपयोग कर रहा हूँ। डिवाइस में स्क्रीन पर सीरियल पोर्ट में सभी इनपुट और आउटपुट प्रदर्शित करने के लिए एक फ़ंक्शन है। जब मैं निम्न स्क्रिप्ट चलाता हूं तो मैं डिवाइस पर देख सकता हूं कि स्क्रिप्ट डिवाइस द्वारा प्रत्येक कमांड आउटपुट ले रही है और इसे डिवाइस पर दोहरा रही है। मेरा मानना है कि इससे कोई समस्या आ रही है कि मैं बस डिवाइस पर 'ओके' का जवाब देना चाहता हूं, आउटपुट दोहराएं और फिर 'ओके' कहें। पहले एक ही कमांड को दोबारा दोहराते हुए इसे भ्रमित करना प्रतीत होता है और फिर यह 'ओके' कमांड का पालन नहीं करेगा। मैं लूप पर हर 0.1 सेकंड 'ओके' आउटपुट करके इसे प्राप्त कर सकता हूं, लेकिन मैं डिवाइस से आउटपुट को पढ़ूंगा और फिर तदनुसार इसका जवाब दूंगा। मुझे विश्वास नहीं है कि मेरी लिपि में कुछ भी है जो इसे आज्ञाओं को दोहराने के लिए कह रहा है। क्या यह php-serial class के साथ कोई समस्या है जिसे किसी ने अनुभव किया है? मैंने $ autoflush = false सेट करने का प्रयास किया; कोई फर्क नहीं पड़ता।
मेरे स्क्रिप्ट:
डिवाइस स्क्रीन परrequire_once('php_serial.class.php');
$serial = new phpSerial;
$serial->deviceSet('/dev/ttyUSB0');
$serial->confBaudRate(9600);
$serial->confParity("none");
$serial->confCharacterLength(8);
$serial->confStopBits(1);
$serial->confFlowControl("none");
$serial->deviceOpen();
while (true) {
$read = $serial->readPort();
if ($read) {
echo date("r") . ' ' . $read;
// $serial->sendMessage("\r\nOK\r\n");
}
}
$serial->deviceClose();
उदाहरण आउटपुट से पहले मेरी स्क्रिप्ट चलाया जाता है:
डिवाइस स्क्रीन परTx: AT
Tx: AT&F
Tx: ATE0
Tx: AT+IPR=9600
Tx: AT
Tx: AT
Tx: AT
Tx: ATH0
Tx: AT+CMGF=1
उदाहरण आउटपुट जबकि मेरी स्क्रिप्ट चल रही है:
Tx: AT
Rx: AT
Tx: AT&F
Rx: AT&F
Tx: ATE0
Rx: ATE0
Tx: AT+IPR=9600
Rx: AT+IPR=9600
Tx: AT
Rx: AT
Tx: AT
Rx: AT
Tx: AT
Rx: AT
Tx: ATH0
Rx: ATH0
Tx: AT+CMGF=1
Rx: ^[AT+CMGF=1