Softwareserial отправляет неправильные значения
Я пытаюсь использовать программный материал для обмена данными с датчиком. После нескольких попыток без какого-либо ответа от датчика я проверил arduino TX с помощью своего прицела, и то, что я увидел, - это не то, что я отправил.
Мой исходный массив байтов (до функции настройки):
static byte simple_write[] = {0xfe, 0x41, 0x00, 0x80, 0x01, 0x10, 0x28, 0x7e};
Что у меня на прицеле:
0X77 , 0x61 , 0x69 , 0x74 , ...
Каждый отправленный байт неверен. Я не понимаю, почему. Единственное, что на пути, - это мостовой делитель для уменьшения 5 В TTL с arduino до 3,3 В CMOS.
Если у кого-то есть идея, заранее спасибо.
EDIT2: Я использую IS.MDuino.21+ (ATmega2560)
ИЗМЕНИТЬ: Вот части моего кода, в которых задействован программный материал
#include "SoftwareSerial.h"
SoftwareSerial LP8_Serial(1, 0);
static byte simple_write[] = {0xfe, 0x41, 0x00, 0x80, 0x01, 0x10, 0x28, 0x7e}; ///Запись 0x010 в адрес 0x0080
void setup(){
LP8_Serial.begin(9600); //Открывает виртуальный последовательный порт с 9600 бод
}
void loop(){
LP8_val1 = GetDatas_uart();
}
int GetDatas_uart() {
if (first_loop == 0) {
//reset_device(); // включает запрос на отправку с задержкой 500 мс
sendRequest(simple_write, 8, 4); // отправить по адресу 0x0080 a 0x10
first_loop = 1;
}
else
sendRequest(write_to_0x20, 8, 4); // отправить по адресу 0x0080 a 0x10
delay(2000);
unsigned long valCO2 = getValue(response);
delay(3000);
Serial.println("Now reading 32 bytes"); //sendRequest(read_16_bytes,7,21);
sendRequest(read_32_bytes, 7, 37);
Serial.print("CO2 from 0x9a-0x9b = ");
Serial.print(response[29], HEX);
Serial.print(response[30], HEX);
Serial.print(" = ");
int decimal = 256 * response[29] + response[30];
Serial.print(decimal);
Serial.println("d");
return decimal;
}
void sendRequest(byte packet[], int m, int n)
{
while (!LP8_Serial.available()) //продолжать отправлять запрос, пока мы не начнем получать ответ
{
Serial.println("waiting for Software.serial port availability");
LP8_Serial.write(packet, m);
//LP8_Serial.write(simple_write, m);
delay(1000); // Необходима для получения последовательной загрузки response[i]
}
int timeout = 0; //установить счетчик времени ожидания
while (LP8_Serial.available() < n ) //Ждать получения n байт ответа
{
timeout++;
if (timeout > 10) //если это займет слишком много времени, вероятно, произошла ошибка
{
while (LP8_Serial.available()) //сбросить все, что у нас есть
LP8_Serial.read();
break; //выйти и повторить попытку
}
delay(50);
}
for (int i = 0; i < n; i++)
{
response[i] = LP8_Serial.read();
// Serial.print("response[i] = ");
Serial.print("response[");
Serial.print(i);
Serial.print("] = ");
Serial.println(response[i], HEX);
}
Serial.print("\n\n");
Serial.flush();
}
@Prof_Sims, 👍0
Обсуждение1 ответ
Оооо, мне немного стыдно...
После повторного чтения документации Arduino из промышленных экранов, которые я использую (модель 21+), я обнаружил, что использование Serial0 на этой плате нецелесообразно, потому что эти контакты совместно используются с USB.
Я подключил свои последовательные провода к соединению Serial1, и теперь мой прицел показывает мне именно то, что я хотел видеть на своей линии TX.
Извини за это. Как часто бывает, проблема была между экраном и стулом.
Спасибо,
итак, вы использовали программное обеспечение на аппаратных последовательных выводах? Arduino Mega имеет 4 аппаратных сериала. не используйте библиотеку программных материалов с Arduibo Mega, @Juraj
ДА. Я сделал. Когда я использую Arduino, я редко утруждаю себя использованием последовательного оборудования, за исключением отладки. Мне нужна была "готовая к использованию" электронная система для проекта., @Prof_Sims
Я имею в виду не внешний последовательный порт USB-to-TLL, а встроенное периферийное устройство UART, @Juraj
Этот модуль (промышленные экраны M21+) обеспечивает только сериалы уровня TTL и RS232. Более того, я хотел быстро создать новый датчик, и кто-то написал для него библиотеку arduino. В примере используется программный материал, поэтому в основном "Скопируйте / Вставьте / проверьте"., @Prof_Sims
а затем быстро переключитесь на обмен стеками, @Juraj
- AT-команда не отвечает на последовательный монитор
- Получить данные с сайта с помощью ESP8266 с помощью AT-команд
- Как отправить команду AT на sim800l с помощью SoftwareSerial
- Как остановить SoftwareSerial от получения данных и повторно включить его в какой-то другой момент?
- SIM800L не регистрируется в сети
- Ардуино для чтения с преобразователя RS232 в последовательный модуль TTL
- Модуль SIM808 GSM работает нормально, GPS не работает (нет сообщения о готовности GPS при включении питания)
- Как читать и записывать на устройство rs232 с/на Arduino
Пожалуйста, покажите нам свой код. Как вы проанализировали данные о масштабах? Через функцию области видимости? Вы уверены, что это настроено правильно?, @chrisl
Код довольно большой. Это единственная функция, которая не работает. Я добавлю соответствующие части в исходное сообщение. Но да, это через функцию моей области видимости., @Prof_Sims
Затем, пожалуйста, создайте меньший рабочий пример кода, который показывает вашу проблему, вырезав код, который не имеет никакого отношения к программному коду, @chrisl
@chrisl, это ATmega2560, и OP использует программное обеспечение на аппаратных последовательных выводах (на Mega!), @Juraj
Так что чем [это answer](https://arduinoprosto.ru/q/9989/softserial-freezes-on-comparing-getint-to-int/13006#13006) может быть уместно здесь, @chrisl