1

MCP3421 18 ビット ADC を使用してアナログ データを読み取るアプリケーションがあります。セットアップは Xbee+Xbee Sheild+Arduino + MCP3421 を送信機として使用します。これを読んで、LCD付きのリモートxbee + arduinoモジュールに送信しています。データはLCDにきれいに表示されます。ただし、シリアルポートでデータを受信したい。tp Do a Serial.println(s); を試すと、受信コードでは、シリアルポートで取得したデータが文字化けしています。助けていただければ幸いです

これが私のコードです

送信中

#include  <Wire.h>
#include <LiquidCrystal.h>
#define TRUE 1
#define FALSE 0
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup(void)
{
  Serial.begin(9600);
  Wire.begin();
  delay(100);
  Serial.println(">>>>>>>>>>>>>>>>>>>>>>>>");  // just to be sure things are working
  lcd.begin(16, 2);
}

void loop(void)
{

  byte address, Hi, Lo, Config;
  int ADVal;

  while(1)
  {
    address = 0x68;
    Wire.beginTransmission(address);
    Wire.write(0x88);   // config register %1000 1000
    // /RDY = 1, One Conversion, 15 samples per, PGA = X1

    Wire.endTransmission();

    delay(1);
    Wire.requestFrom((int)address, (int) 3);
    Hi = Wire.read();
    Lo = Wire.read();
    Config = Wire.read();
    Wire.endTransmission();

    ADVal = Hi;
    ADVal = ADVal * 256 + Lo;

    //  Serial.print(ADVal, DEC);
    //Serial.print("  ");
    //Serial.println(Config, DEC);
    Serial.print("<");
    Serial.print(ADVal);
    Serial.print(">");


    //lcd.setCursor(0,0);
    //lcd.print(ADVal);
    lcd.setCursor(0,1);
    //float val = ADVal * 0.00006244087;
    //lcd.print(val,3); 
    delay(1);
  }
}

これが受信コードです

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // initialize the library with the numbers of the interface pins
bool started = false;
bool ended= false;
char inData[10]; // Leave plenty of room
byte index;
float i;

//char inData[24]; // Or whatever size you need
//byte index = 0;

void setup(){
  // set up the LCD's number of columns and rows: 
  lcd.begin(16, 2);
  // initialize the serial communications:
  Serial.begin(9600);
}

void loop()
{
  //Serial.println(s);
  while(Serial.available() > 0)
  {
    char aChar = Serial.read();
    if(aChar == '<')
    {
      // Start of packet marker read
      index = 0;
      inData[index] = '\0'; // Throw away any incomplete packet
      started = true;
      ended = false;
    }
    else if(aChar == '>')
    {
      // End of packet marker read
      ended = true;
      break; // Done reading serial data for now
    }
    else
    {
      if(index < 10) // Make sure there is room
      {
        inData[index] = aChar; // Add char to array

        index++;
        inData[index] = '\0'; // Add NULL to end

      }
    }
  }

  // When we get here, there is no more serial data to read,
  // or we have read an end-of-packet marker
  if(started && ended)
  {
    // We've seen both markers - do something with the data here
    lcd.setCursor(0,0);
    i = atoi (inData);
    float s = (i * 0.3051851); //multiplying with calibration factor
    float value = ( s / 1000 );

    lcd.setCursor(1,0);
    lcd.print(value,3); // print value after multiplying with calibration factor to LCD

    lcd.setCursor(0,1 );
    lcd.print(i); // Print raw ADC counts as recieved from transmitter

    index = 0;
    inData[index] = '\0';
    started = false;
    ended = false;

  }
} 

受信側の arduino は Xbee を介してデータを取得し、値を LCD (接続された PIC) に完全に表示します。また、USB/シリアル ポートを介して受信側の arduino に接続された PC でデータを受信する必要があります。

シリアルモニタを使用しようとすると、LCD の表示が消え、シリアルモニタの値が文字化けします。XBEE SHIELD で DO と DI の両方の LED が点滅し始めると、Serial.print(s) がデータを XBEE に送り返していると思います。

4

0 に答える 0