Probeer een enkele char door te geven aan een serieel apparaat

Goedendag, Ik heb een serieel apparaat dat bij verbinding via Hyper Terminal mij een statusrapport geeft als ik op de letter 'd' druk, geen enter-toets of iets anders alleen de letter d. Ook geeft Ctrl-t me routinginformatie.

Ik wil graag op een knop drukken die is verbonden met de Arduino en de b naar het seriële apparaat sturen en de statusinformatie erachter bekijken.

Op dit punt heb ik het seriële apparaat aangesloten op de Arduino en kan ik er berichten van zien, maar wanneer ik op de schakelaar druk die verbonden is met pin 2, stuurt het seriële apparaat me de statusoutput niet zoals verwacht en gezien via directe seriële verbinding op mijn computer met hyper terminal.

Heeft iemand hier een ervaring of input over?

#include 
// software serial #1: TX = digital pin 10, RX = digital pin 11
 SoftwareSerial portOne(10, 11);
 const int buttonPin = 2;    //the number of the pushbutton pin
 const int button1Pin = 4;
 const int ledPin =  13;     //the number of the LED pin
//define char to send to serial

char stat = 'd';
char route = '\x14';
// variables will change:
int buttonState = 0;        //variable for reading the pushbutton status
int button1State = 0;

// the setup function runs once when you press reset or power the board
void setup() {
 //initialize digital pin 13 as an output.
                pinMode(ledPin, OUTPUT);
                pinMode(buttonPin, INPUT);
                pinMode(button1Pin, INPUT);
                Serial.begin(4800);
                while (!Serial) {;//wait for serial port to connect. Needed for native USB port only
                }
               //Start each software serial port
                portOne.begin(4800);
                while (!portOne) {;//wait for serial port to connect. Needed for native USB port only
                }
              }

// the loop function runs over and over again forever
void loop() {
            static int Once = 0;
            static int Once1 = 0;
            buttonState = digitalRead(buttonPin);
            button1State = digitalRead(button1Pin);
 //check if the pushbutton is pressed.
 //if it is, the buttonState is HIGH:
            if (buttonState == HIGH ) { 
                                      if (Once == 0) {
                                                        Once = 1;
                                                       //turn LED on so I can tell the button is working
                                                        digitalWrite(ledPin, HIGH);
                                                       //send d to Radio
                                                        portOne.write(stat);
                                                       //send d to serial monitor so I can see the charector
                                                        Serial.print(stat);
                                      }
                                      }


if (buttonState == LOW) {
                         //turn LED off:
                          Once = 0;
                          digitalWrite(ledPin, LOW);

                          }


 //check if the other pushbutton is pressed.
 //if it is, the buttonState is HIGH:
  if (button1State == HIGH) {
    if (Once1 == 0) {
          Once1 = 1;
   //turn LED on:
  //digitalWrite(ledPin, HIGH);
   //send ctrl-t to radio
    portOne.write(route);
    } 
  }
  if (button1State == LOW) {
   //turn LED off:
    //digitalWrite(ledPin, LOW);
    Once1 = 0;
  }
    portOne.listen();
     //read data from the Software Serial portOne
  //and send to the hardware serial port:
   while (portOne.available() > 0) {
     char inByte = portOne.read();
     Serial.print(inByte);
   }
}

Breadboard

1
In je intro schreef je "geeft me een statusrapport wanneer ik de letter 'b' druk." In de code schreef je //send d naar Radio (en de code lijkt dat ook te doen). Klopt dit en zou dat de bron van uw fout kunnen zijn?
toegevoegd de auteur caryden, de bron
Het was niet helemaal duidelijk uit je vraag, maar heb je geverifieerd dat de signalering spanning en polariteit van het seriële apparaat compatibel is met de Arduino? Traditionele seriële interfaces (bijv. RS232, enz.) Zijn niet, en vereisen een omkeerniveau-vertaler om te communiceren met een Arduino.
toegevoegd de auteur rossp, de bron
Ik ben blij dat je erachter bent gekomen. Pas op dat blootstelling aan dergelijke spanningen uw Arduino permanent kan hebben beschadigd. Wat betreft hoe het had kunnen werken, ik veronderstel dat het mogelijk is dat de software seriële implementatie (opzettelijk of per ongeluk) meer polariteit agnostisch is dan een hardware UART zou zijn. Mensen sturen soms RS232-ontvangers met een logisch niveausignaal dat slechts is omgekeerd naar de benodigde polariteit en niet is versterkt, en je kunt je voorstellen ze te proberen te ontvangen met een weerstands-/diodenetwerk.
toegevoegd de auteur rossp, de bron
We zouden een aardingsdraad naar het apparaat moeten zien gaan. Als conventie moet je 5V verbinden met de rode lijn op het breadboard en Gnd met blauw. Het is verwarrend om dat om te keren. Voeg enkele foutopsporingsschermen toe, bijv. Serial.println ("Verzenden van 'd' naar apparaat"); - dan weet je of het een switch-detectie probleem is, of een communicatieprobleem.
toegevoegd de auteur Nick Gammon, de bron
Misschien een tijdje toevoegen (Serial.available ()) portOne.print (Serial.read ()); om u toe te staan ​​karakters van de seriële monitor naar uw apparaat te injecteren. Dan zou je potentiële problemen kunnen omzeilen met stuiteren/debouncen.
toegevoegd de auteur Dave X, de bron
Ik zie wat je zegt, maar ik denk dat het meer een probleem is om de char te laten passeren naar het seriële apparaat. Je ziet of ik de char-stat van 'd' in 'c' verander, dit moet 'alles inschakelen', maar dit gebeurt niet, dus ik vermoed dat de char niet naar het apparaat gaat of zijn onleesbare manier van doen. ..
toegevoegd de auteur DormoTheNord, de bron
Begrepen, sorry dat mijn breadboard het blauw links en rood rechts heeft, dus deed ik het schema om mijn breadboard te matchen en veranderde het niet in het plaatje in Fritzing. Ik heb die Serial.println in mijn code gehad en zag de aanwijzing telkens als ik op de knop drukte. Ik heb ook af en toe een grond aangesloten van het apparaat op de Arduino. Ik zal die veranderingen aanbrengen en contact met je opnemen.
toegevoegd de auteur DormoTheNord, de bron
jrobert Dank u voor het opmerken van dit, om een ​​of andere reden tijdens het typen van dit heb ik een 'b' geplaatst, maar 'd' is correct. Nick I voegde een grond toe zonder verandering en moderniseerde de afbeelding om dat weer te geven, samen met de kracht/grond tot de broodplankveranderingen. Ook in mijn code hierboven zou je //send d naar Radio portOne.write (stat) moeten zien;//stuur d naar serieel scherm zodat ik de charisator Serial.print (stat); kan zien
toegevoegd de auteur DormoTheNord, de bron
@ChrisStratton Toen ik de seriële verbinding van het apparaat doseerde, vond ik de TX-lijnen -9.2v. Op basis van uw suggestie heb ik wat onderzoek gedaan en op basis van deze sparkfun.com/tutorials/215 it ziet eruit alsof ik inderdaad een MAX3323-chip (of vergelijkbaar) moet uitvoeren. Het was verbazingwekkend dat ik gegevens van het apparaat kon weergeven op de Arduino, en dat het zeker voor verwarring zorgde.
toegevoegd de auteur DormoTheNord, de bron

Geen antwoorden

0