سؤال

أنا أعمل على روفر على شبكة الإنترنت وأست باستخدام منفذ تسلسلي للتواصل مع اردوينو. وبعد كتبت بعض PHP التي تستخدم فقط fwrite() وكتابة ASCII 1 أو ASCII 2 إلى المنفذ التسلسلي. يستمع Arduino إلى هذا المنفذ ويفعل الأشياء بناء على ما يسمعه. أعرف أن PHP يعمل، لأنه كلما قل ذلك لإرسال الأشياء، يتلقى Arduino ذلك. هنا هو رمز اردوينو:

//This listens to the serial port (USB) and does stuff based on what it is hearing.

int motor1Pin = 13; //the first motor's port number
int motor2Pin = 12; //the second motor's port number
int usbnumber = 0; //this variable holds what we are currently reading from serial


void setup() { //call this once at the beginning
    pinMode(motor1Pin, OUTPUT);
    //Tell arduino that the motor pins are going to be outputs
    pinMode(motor2Pin, OUTPUT);
    Serial.begin(9600); //start up serial port
}

void loop() { //main loop
    if (Serial.available() > 0) { //if there is anything on the serial port, read it
        usbnumber = Serial.read(); //store it in the usbnumber variable
    }

    if (usbnumber > 0) { //if we read something
        if (usbnumber = 49){
          delay(1000);
          digitalWrite(motor1Pin, LOW);
          digitalWrite(motor2Pin, LOW); //if we read an ASCII 1, stop
        }

        if (usbnumber = 50){
              delay(1000);
              digitalWrite(motor1Pin, HIGH);
              digitalWrite(motor2Pin, HIGH); //if we read an ASCII 2, drive forward
        }

        usbnumber = 0; //reset
    }
}

لذلك يجب أن يكون هذا مستقيما إلى حد ما إلى الأمام. في الوقت الحالي، عندما أرسل إما ASCII 1 أو ASCII 2، فإن LED الذي أقوم باختباره (على رقم التعريف الشخصي) يتحول ويظل. ولكن، إذا أرسلت ASCII 1 أو 2 آخر، فسيتم إيقاف تشغيلها ثم يتم الرجوع إليها. الهدف هو أن يتم تشغيله إلا إذا كان ASCII 1 آخر شيء أرسله والبقاء عليه حتى الساعة الثانية هو آخر شيء أرسله.

تحرير: إليك PHP:

<?php
    $verz="0.0.2";
    $comPort = "com3"; /*change to correct com port */

    if (isset($_POST["rcmd"])) {
        $rcmd = $_POST["rcmd"];
        switch ($rcmd) {
            case Stop:
                $fp =fopen($comPort, "w");
                fwrite($fp, chr(1)); /* this is the number that it will write */
                fclose($fp);


                break;
            case Go:
                $fp =fopen($comPort, "w");
                fwrite($fp, chr(2)); /* this is the number that it will write */
                fclose($fp);
                break;
            default:
                die('???');
        }
    }
?>
<html>
    <head><title>Rover Control</title></head>
    <body>
        <center><h1>Rover Control</h1><b>Version <?php echo $verz; ?></b></center>

        <form method="post" action="<?php echo $PHP_SELF;?>">
            <table border="0">
                <tr>
                    <td></td>
                    <td>

                    </td>
                    <td></td>
                </tr>
                <tr>
                    <td>
                        <input type="submit" value="Stop" name="rcmd"><br/>
                    </td>
                    <td></td>
                    <td>
                        <input type="submit" value="Go" name="rcmd"><br />
                    </td>
                </tr>
                <tr>
                    <td></td>
                    <td><br><br><br><br><br>

                    </td>
                    <td></td>
                </tr>
            </table>
        </form>
    </body>
</html>
هل كانت مفيدة؟

المحلول

إذا كانت ج ثم لديك مهمة بدلا من مقارنة في كلا الاختبارين، لذلك كلاهما true, ، لذلك يتم كل الكتب في كل مرة. تجميع مع مستوى تحذير عالية (مثل -Wall -pedantic في دول مجلس التعاون الخليجي). جرب هذا:


int a = 0;
if ( a == 1 ) printf( "a is not one: %d\n", a );
if ( a = 1 ) printf( "a is one: %d\n", a );

من كود PHP الذي نشرته (أنا لست خبيرا هنا) يبدو أنك تكتب ثنائي 1 ك char، وهو ليس ASCII 49، ولكن ASCII 1 (SOH)، نفسه بالنسبة 2. حاول تغييره '1' في رمز PHP (أو 1 في كود ج.)

إليك رابط لبعض المقالات السيطرة على الميناء التسلسلي مع PHP - أنا غوغل، ولا فكرة عن جودته - ولكن لا يبدو أنه يكفي كتابة عدد صحيح في "com1" - هذا خارج نطاقي، حتى حظ سعيد :)

نصائح أخرى

كما ذكر NIKOLAI، يبدو أنك تقوم بتعيين (=) بدلا من المقارنة (==) في عبارات "إذا".

عادة جيدة أن بعض المبرمجين C قيد التنفيذ هو وضع RVALUES على الجانب الأيسر من المقارنات، بحيث يقوم المحول البرمجي بإنشاء خطأ إذا كنت تستخدم عن طريق الخطأ مشغل الواجب بدلا من مشغل المقارنة:

إذا (50 == usbnumber) {// هذا على ما يرام. ...} إذا كان (50 = usbnumber) {// compiler سيقوم بإنشاء خطأ هنا. ...}

هذا يعمل، بغض النظر عن أعلام المترجم أو مستوى التحذير الذي تستخدمه منذ تعيين RVALUE غير قانوني.

يجب أن أضيف أن "صافي الأمان" لا يعمل إذا كنت بحاجة إلى مقارنة خطين.

قد تكون متأخرة جدا، لكنني أعتقد أن مشكلتك هي أن Serial.Read () يقرأ فقط حرف واحد في وقت واحد. إذا قمت بإرسال "49" من جهاز الكمبيوتر، عند الاتصال usbnumber = serial.Read () سوف تحصل على "4" الحلقة الأولى و "9" الحلقة الثانية. لا شيء من هؤلاء إرضاء الشروط حتى لا يتم إجراء أي شيء ويتم إعادة تعيين usbnumber إلى 0.

لإصلاح، يمكنك إما تغيير حالة المسلسل.

if (Serial.available() == 2)

ثم افعل شيئا مثل ما يلي لتحويل إلى رقم:

usbnumber = Serial.read() * 10 + Serial.read();

خيار آخر هو استخدام مكتبة TextFinder - لقد كتبت تعليميا موجزا على موقع الويب الخاص بي http://mecharyusprojects.com/thunderbolt/؟p=60.

ميشن

لقد وجدت إجابتك تبحث عن أشياء أخرى، على أي حال، واجهت للتو (أعتقد) نفس المشكلة التي كان لديك.

في حال لم تحلها بالفعل، أعتقد أن المشكلات ليست رمزك، ولكن آلية إعادة الضبط التلقائي على لوحة أردوينو. هذا هو: في كل مرة يتم فيها إعداد اتصال جديد على المنفذ التسلسلي، تتم إعادة تعيين لوحة Arduino، وهذا يسمح بتحميل برنامج ثابت جديد عند البرمجة عن طريق المنفذ التسلسلي.

للتحقق من ذلك، حاول وامض LED في الخاص بك setup() وظيفة، إذا كان يومض في كل مرة تقوم فيها بتحميل الصفحة، فهذا يؤكد أطروحتي.

إلقاء نظرة هنا: http://www.arduino.cc/playground/main/main/disablingautoresetonsonnection.

أنا حلها عن طريق التمسك مقاوم 120 أوم بين + 5V وإعادة تعيين. فقط تذكر إزالتها في كل مرة تريد فيها تحميل البرامج الثابتة الجديدة لوحدك.

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