Невозможно прочитать последовательный порт через Arduino так, как ПО монитора последовательного порта читает его

У меня есть устройство, которое каждую минуту передает данные Rx Tx. Я подключил его к компьютеру. Я загрузил программное обеспечение монитора последовательного порта, и вот данные, которые я захватил с помощью этого программного обеспечения.

Теперь, когда я пытаюсь захватить те же данные с помощью Arduino, он захватывает что-то еще, как вы можете видеть на изображении ниже. Я попытался прочитать его как hex, char, byte, unsigned int, но он просто не читает данные должным образом.

Здесь я предоставил свой код. Может кто-нибудь, пожалуйста, определить проблему для меня? Я застрял на этом, по крайней мере, на 2 недели, и это просто нехорошее чувство! Любая помощь будет очень признательна.

Использование Arduino Ethernet со слотом для карт microSD

//#include <SoftwareSerial.h>
#include <SPI.h>
#include <SD.h>


static const int baud = 19200;
static const int chipSelect = 4;
static const int rx = 0;
static const int tx = 1;


File dataFile;
//SoftwareSerial serialPort = SoftwareSerial(rx, tx);


void setup() {

  Serial.begin(baud);     // opens serial port, sets data rate to 19200 bps
  while (!Serial) {
    ;
  }
  //serialPort.begin(baud);

 // pinMode(rx, INPUT);
 // pinMode(tx, OUTPUT);

   Serial.print("Initializing SD card...");

   if (!SD.begin(chipSelect)) {
       Serial.println("initialization failed!");
       return;
   }
   Serial.println("initialization done.");


   dataFile = SD.open("data.txt", FILE_WRITE);
   Serial.println("Data file created!");
   dataFile.close();
}

unsigned int incomingByte = 0;
void loop() 
{
  if (Serial.available() > 0) {
                // read the incoming byte:
     incomingByte = Serial.read();
     Serial.print(incomingByte, HEX);
    }

  dataFile = SD.open("data.txt", FILE_WRITE);
  dataFile.println(incomingByte, HEX);
  dataFile.close();
}

Вы можете создать программное обеспечение монитора последовательного порта с помощью консольного приложения C#, вот код для этого:

using System;
using System.IO.Ports;
using System.Text;

class PortDataReceived
{
    public static void Main()
    {

        SerialPort mySerialPort = new SerialPort("COM3");

        mySerialPort.BaudRate = 19200;
        mySerialPort.Parity = Parity.None;
        mySerialPort.StopBits = StopBits.One;
        mySerialPort.DataBits = 8;
        mySerialPort.Handshake = Handshake.None;
        mySerialPort.RtsEnable = true;


        mySerialPort.Open();
        while (true)
        {
            string data = ReadData(mySerialPort);

            if (!string.IsNullOrEmpty(data))
            {
                Console.WriteLine(data);

            }
        }

    }

    public static string ReadData(SerialPort serial)
    {
        byte[] buffer = new byte[serial.BytesToRead];
        serial.Read(buffer, 0, buffer.Length);

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < buffer.Length; i++)
            sb.AppendFormat("{0:X2} ", buffer[i]);

        return sb.ToString();
    }
}

, 👍0

Обсуждение

Не рекомендуется использовать контакты 0 и 1 для программного обеспечения, так как они обычно подключены к последовательному, @Visual Micro

Не только это, но и то, что они, похоже, смешивают и сопоставляют как аппаратные, так и программные серийные номера на одних и тех же выводах. Это никогда не будет очень хорошо в лучшие времена. На самом деле я подозреваю, что все последовательные вызовы программного обеспечения завершатся неудачей, так как контакты настроены для связи с периферийным устройством UART., @Majenko

Я обновил ответ, чтобы объяснить, почему 0/1-плохая идея :), @Visual Micro

Спасибо вам за вашу быструю реакцию, ребята. Как бы это можно было исправить? Я хочу прочитать последовательный порт. И только контакты 0 и 1 могут дать мне доступ к линиям RX и TX., @JayB

Удалите все ссылки на software serial. Просто используйте Серийный номер. SoftwareSerial предназначен для тех случаев, когда вы хотите использовать контакты, ОТЛИЧНЫЕ ОТ контактов TX/RX., @Majenko

Обновил свой код в соответствии с вашими предложениями. Однако он по-прежнему дает те же шестнадцатеричные значения!, @JayB

И что бы вы ожидали, что он отправит, когда вы скажете ему отправить шестнадцатеричные значения?, @Majenko

Майенко: Значения на первом изображении, начиная с F8 до BF, в следующей строке-это один набор данных. Я хочу захватить все данные точно так, как это программное обеспечение захватывает, но с помощью arduino. Visual-Micro: Я обновил код. Прокомментировал ранее существовавшие разделы., @JayB

Просто прочитайте строку из последовательного порта. строка str = Последовательный.ReadToEnd(), На arduino .print() отправляет строку, .write() отправляет байт, @Visual Micro


1 ответ


0

Не рекомендуется использовать контакты 0 и 1 для программного обеспечения, так как они обычно подключены к последовательному

,

И не только это, но они, похоже, смешивают и сопоставляют как аппаратное, так и программное обеспечение, последовательное на одних и тех же выводах. Это никогда не будет очень приятно даже в лучшие времена. На самом деле я подозреваю, что все последовательные вызовы программного обеспечения завершатся неудачей, так как контакты настроены для подключения к периферийному устройству UART., @Majenko

Я обновил ответ, чтобы объяснить, почему 0/1-это плохая идея :), @Visual Micro

Спасибо вам за вашу быструю реакцию, ребята. Каково было бы решение для этого? Я хочу прочитать последовательный порт. И только контакты 0 и 1 могут дать мне доступ к линиям RX и TX., @JayB

Удалите все ссылки на программный последовательный порт. Просто используйте Серийный. Программный материал предназначен для тех случаев, когда вы хотите использовать контакты, ОТЛИЧНЫЕ ОТ контактов TX/RX., @Majenko

Обновил свой код в соответствии с вашими предложениями. Хотя он все еще дает те же шестнадцатеричные значения!, @JayB

И чего бы вы ожидали от него, когда вы говорите ему отправлять шестнадцатеричные значения?, @Majenko

Majenko: Значения на первом изображении, начиная с F8 до BF, в следующей строке представляют собой один набор данных. Я хочу захватить все данные точно так, как это программное обеспечение захватывает, но с помощью arduino. Визуальный-Микро: Я обновил код. Закомментировал ранее существовавшие разделы., @JayB

Просто прочитайте строку из последовательного порта. строка str = Последовательный.ReadToEnd(), На arduino .print() отправляет строку,. write() отправляет байт, @Visual Micro