Зачем посылать мой Arduino когда-нибудь Hex, а иногда и не так?

Привет, у меня есть Arduino mega 2560, я отправляю данные с Arduino через USB на ПК. Это работает, когда я тестирую простой Serial.print («Hello»); но это не то, что мне нужно. Я отправляю временную метку как значение longge и databyte в качестве короткого значения. Когда я отправляю timestamp как BIN следующим образом:

      //Initialisisation

const int RX = 0;
const int TX = 1;
const int RX1 = 19;
const int TX1 = 18;
unsigned long currentMillis;

void setup()
{
  pinMode(RX, INPUT);   //Readpin for USB
  pinMode(TX, OUTPUT);  //Writepin for USB
  pinMode(RX1, INPUT);  //Readpin for bus
  pinMode(TX1, OUTPUT); //Writepin for für bus

  Serial.begin(38400);   //open interface for USB
  Serial1.begin(4800);   //open interface for bus

  while (!Serial & !Serial1 &! Serial2)
  {
    ;//wait for serial port connect.
  }
}

void loop()
{
  //Ask if the timestamp over 8 hours, when yes,
  //send the time to the pc and reset currentMillis.
  currentMillis = millis();
  if (currentMillis >= 28800000)  //milli() 8 hours is a 4 byte  timestamp 28.800.000 millisec.
  {
    unsigned long timestamp = currentMillis;
    sendBinaryTime(timestamp);
    currentMillis = 0;
  }//end if

  //if the businterface available, read a byte
  //and send it with the timestamp to the PC.
  //If the businterface not available send an error.
  //short incomingByte = Serial1.read();
  //sendBinaryValue(incomingByte);
  if(Serial1.available()>0) //if the bus (serial1) available?
    {
      short incomingByte = Serial1.read(); //read the next byte from _rx_buffer
      sendBinaryValue(incomingByte);
      sendBinaryTime(currentMillis);   //sendBinary send a long over the bus
    }//end if 
}//end Loop()


//Methods for sending long values

void sendBinaryValue(short incomingByte)
  {
    int temp = (incomingByte & 0xFF00)>>8;
    Serial.println(temp, HEX);
    temp = (incomingByte & 0x00FF);
    Serial.println(temp, HEX);
    return;
  }

void sendBinaryTime(unsigned long currentMillis)//send milliseconds after every byte
{
  int temp = (currentMillis & 0xFF000000)>>24; //send 16 bit of the low value
  Serial.print(temp, BIN);
  temp = (currentMillis & 0x00FF0000)>>16;      //send 16 bit of the high value
  Serial.print(temp, BIN);
  temp = (currentMillis & 0x0000FF00)>>8;
  Serial.print(temp, BIN);
  temp = (currentMillis & 0x000000FF);
  Serial.print(temp, BIN);
  return;
}

Все в порядке, я не ошибся. Но я хочу, чтобы временная метка была DEC, поэтому я изменил код на:

       void sendBinaryValue(short incomingByte)
 {
   int temp = (incomingByte & 0xFF00)>>8;
   Serial.println(temp, HEX);
   temp = (incomingByte & 0x00FF);
   Serial.println(temp, HEX);
   return;
 }

void sendBinaryTime(unsigned long currentMillis)
{
 int temp = (currentMillis & 0xFF000000)>>24;
 Serial.print(temp, DEC);
 temp = (currentMillis & 0x00FF0000)>>16;
 Serial.print(temp, DEC);
 temp = (currentMillis & 0x0000FF00)>>8;
 Serial.print(temp, DEC);
 temp = (currentMillis & 0x000000FF);
 Serial.print(temp, DEC);
 return;
}

Теперь, когда я смотрю на серийный монитор, я получаю сообщение об ошибке. Здесь вы можете увидеть:

 введите описание изображения здесь>> </a> </p>

<p> Я посылаю знак A как ASCII, который должен быть Hex 41, и я получаю Hex 5, но почему? Когда я отправляю timestamp как BIN, я получаю 41 и не испытываю никаких проблем. </p>

<p> Я надеюсь, что кто-то может помочь мне с дружескими пожеланиями sniffi </p></body></html>

2 голоса | спросил sniffi 11 J000000Monday16 2016, 11:39:52

1 ответ


2

Я нашел несколько проблем с вашей программой, хотя они могут не быть связанными с вашей основной проблемой:

 while (!Serial & !Serial1 &! Serial2)

Вы имеете в виду while (!Serial || !Serial1 || !Serial2), хотя это только полезно с виртуальными последовательными портами, например, на Leonardo. На мега, все эти порты представляют собой реальные аппаратные порты.

 void sendBinaryValue(short incomingByte)

То, как вы называете параметр, вводит в заблуждение: a short не является байтом, это два байта.

 int temp = (incomingByte & 0xFF00)>>8;

Вы смещаете бит-значение знакового числа, которое будет делать знак расширение. Вероятно, это не то, что вы хотите.

 Serial.print(temp, DEC);

Вы печатаете несколько номеров один за другим без разделителя. Это вызовет неоднозначность: вы не можете знать, означает ли «345» «3 45» или «34 5».

Наконец, я не понимаю цели ваших функций. Почему бы вам не просто напечатайте такие цифры?

 Serial.println(incomingByte, HEX);
Serial.println(currentMillis);
ответил Edgar Bonet 11 J000000Monday16 2016, 12:13:59

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132