문제

나는 웹 제어 로버에서 작업 중이며 일련 포트를 사용하여 아르두노. 나는 단지 사용하는 PHP를 썼습니다 fwrite() ASCII 1 또는 ASCII 2를 직렬 포트에 씁니다. Arduino는 그 항구를 듣고 있으며 듣는 내용에 따라 물건을 수행합니다. 나는 내 PHP가 작동하고 있다는 것을 알고 있습니다. 왜냐하면 내가 물건을 보내라고 말할 때마다 Arduino는 그것을 받기 때문입니다. 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를 보낼 때 (핀 13에서) 테스트중인 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>
도움이 되었습니까?

해결책

그것이 C라면 당신은 가지고 있습니다 과제 대신에 비교 두 테스트 모두에서 true, 모든 글은 매번 완료됩니다. 높은 경고 수준으로 컴파일하십시오 (예 : -Wall -pedantic GCC에서). 이 시도:


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을 숯으로 쓰고있는 것 같습니다. '1' PHP 코드에서 (또는 1 C 코드에서.)

다음은 일부 기사에 대한 링크입니다 PHP로 직렬 포트 제어 - 나는 Googled, 품질에 대해 알지 못했지만 정수를 "com1"에 작성하는 것만으로는 충분하지 않습니다.

다른 팁

Nikolai가 언급했듯이, "if"진술에서 비교 (==)보다는 과제 (=)를하고있는 것처럼 보입니다.

일부 C 프로그래머가 얻는 좋은 습관은 비교의 왼쪽에 RValues를 넣는 것입니다. 비교 연산자 대신 할당 연산자를 실수로 사용하면 컴파일러가 오류가 발생합니다.

if (50 == usbnumber) {   // This is okay.
    ...
}

if (50 = usbnumber) {    // The compiler will generate an error here.
    ...
}

RValue에 할당이 불법 이후 사용하는 컴파일러 플래그 또는 경고 레벨에 관계없이 작동합니다.

두 개의 lvalues를 비교 해야하는 경우이 "안전망"이 작동하지 않는다고 덧붙여 야합니다.

너무 늦었을 수도 있지만 문제는 serial.read () 한 번에 한 캐릭터 만 읽습니다. PC에서 "49"를 보내면 전화 할 때 usbnumber = serial.read () "4"첫 번째 루프와 "9"는 두 번째 루프를 얻을 것입니다. 이들 중 어느 것도 조건을 만족시키지 않으므로 아무것도 수행되지 않고 Usbnumber가 0으로 재설정됩니다.

수정하려면 Serial.ailable 조건을 변경할 수 있습니다.

if (Serial.available() == 2)

그런 다음 다음과 같은 것을 수행하여 숫자로 변환하십시오.

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

또 다른 옵션은 TextFinder 라이브러리를 사용하는 것입니다. 내 웹 사이트에서 간단한 자습서를 작성했습니다. http://mechariusprojects.com/thunderbolt/?p=60

기계

나는 당신의 대답이 다른 것들을 찾고있는 것을 발견했습니다. 어쨌든 나는 당신이 가진 것과 같은 문제를 방금 직면했습니다.

아직 해결하지 못한 경우 문제가 코드가 아니라 Arduino 보드의 자동 리세스 메커니즘이라고 생각합니다. 즉, 시리얼 포트에 새 연결이 설정 될 때마다 Arduino 보드가 재설정되므로 직렬 포트를 통해 프로그래밍 할 때 새 펌웨어를로드 할 수 있습니다.

이를 확인하려면 LED를 깜박이십시오. setup() 기능, 페이지를로드 할 때마다 깜박이면 내 논문이 확인됩니다.

여기를 살펴보십시오 : http://www.arduino.cc/playground/main/disablingautoresetonserialconnection

+5V와 재설정 사이에 120 옴 저항을 고착하여 해결했습니다. 새 펌웨어를 보드에 업로드 할 때마다 제거하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top