Чтение 2-х байт из Serial

Добрый день форумчане! укажите на ошибку уже всю голову сломал…
Суть проблемы: обращаюсь к устройству оно в ответ шлёт данные через 1-wire uart, но при попытке их принять получаю ерунду…
Вот собственно код:

#include <SoftwareSerial.h>
SoftwareSerial mySerial(7, 3);
const byte zero = 0x12; 
char buffer1[4];
byte com[9];
void setup()
{

  pinMode(4, OUTPUT); //управление питанием устройства
  pinMode(3, OUTPUT); 
  digitalWrite(4, LOW);
  digitalWrite(3, LOW);
  delay(1000);
  digitalWrite(4, HIGH);
  delay(20);
  digitalWrite(3, HIGH);
  delay(9);
  mySerial.begin(9600);
  readZGC();
  if (mySerial.available())
    for (int i=0; i<8; i++)
    com[i] = mySerial.read();
  Serial.begin(9600);
  for (int i=0;i<9;i++)
  Serial.println(com[i]);}
void loop() {
  
  }

void readZGC()
{
  readpgaep(zero);
}
void readpgaep(byte a)
{
  mySerial.write((byte)0x55); //Обращение к устройству
  mySerial.write((byte)0x02); //Обращение к EEPROM устройства
  mySerial.write((byte)a);    //Адрес EEPROM 1*
  mySerial.write((byte)0x00); //Адрес EEPROM
  mySerial.write((byte)0x55); //Обращение к устройству
  mySerial.write((byte)0x20); //Чтение данных из адреса a

  
}

Данные из монитора порта:
16:52:50.711 → 85
16:52:50.711 → 2
16:52:50.744 → 18
16:52:50.744 → 0
16:52:50.744 → 85
16:52:50.744 → 255
16:52:50.744 → 255
16:52:50.744 → 255
А вот что показывает Logic:


Почему он корректно принимает только первые 5 byte

Это что еще за покемон?

Ошибка №1. Код вставлен неправильно. Так его никто изучать и обсуждать не будет;
Ошибка №2. Протокол из монитора порта надо вставлять текстом, а не картинкой.

1 лайк

RX и TX соединены вместе

надеюсь через диод соединил?

Tx идёт через 2-а транзистора

а на той стороне что?

то есть КЗ

ifsnj

Что-то в коде вы накрутили ерунды:

Вы проверяете наличие данных в mySerial только один раз, а читаете отттуда восемь байт. А если там всего один? Или три? - в остальных будет мусор.

Дальше больше - вы печатаете содержимое массива в Сериал в любом случае - прочитали ли вы что-то из mySerial или нет.

И непонятно - в заголовке написано “2 байта”, читаете вы из софтсериала 8, а печатаете в монитор все девять :slight_smile:

насколько я вижу, это вовсе не “ерунда”, а всего лишь та самая последовательность байт, что вы запихивали в порт:

похоже с вашей схемой соединения RX c TX у вас получился обычный loopback - то есть все, что послано в TX, возвращается через RX.

В чем был смысл использования этого 1-wire uart,

Обычный 1-wire не проще было?

Я не ищу лёгких путей) Хорошо если это loopback вопрос открытый почему только 5 байт обратно принимаю? отправил 6

так вы ж не проверяете, пришли они уже или нет. Добавьте между своей командой отсылки и приемом задержку в 50мс - может тогда будет шесть?

А лучше перепишите прием нормально, с проверкой наличия байта перед чтением.

1 лайк

для чтения DS есть библиотека OneWare.h она для этого и предназначена

Спасибо поставил задержку и проверку и всё получилось!
Не уверен что корректно:

  mySerial.begin(9600);
  readZGC();
  delay(50);
  n = mySerial.available();
  while (i<n)
   if (mySerial.available())
     {com[i] = mySerial.read();
     i++;}
  Serial.begin(9600);
  
  for ( i=0;i<n;i++)
  Serial.println(com[i],HEX);

ну и ну…
а вот так не проще?

while (mySerial.available())
     {com[i] = mySerial.read();
     i++;}

что получилось-то?
В ответ получаете 6 байт, что послали или от чипа что-то начало приходить?

Ваш код приема все еще очень кривой, ибо его работа напрямую зависит от задержки в операторе delay(). Уберите задержку - у вас даже с вашими “проверками” ничего работать не будет.

Все 8 байт:
18:05:20.656 → 55
18:05:20.656 → 2
18:05:20.656 → 12
18:05:20.689 → 0
18:05:20.689 → 55
18:05:20.689 → 20
18:05:20.689 → A0
18:05:20.689 → 79