МК меня не понимать. Serial команды не опознаются.
- Войдите на сайт для отправки комментариев
Снова здравствуйте всеуважаемые.
Снова я. Сновас с трудностью и надеждой хоть какой-то подскзки)
Суть: Организовал softwareSerial между двумя девайсами. Команды устроены таким образом что одни идут с ПК конкретно на девайс 1, другие команды идут транзитом через 1-й второму. Причем отсылаю на аппаратный порт строку TX2690XT а тот понимает то нужно сделать и шлет его дальше на программный порт второму с изменением первой цифры чтобы тот принял команду. Первая цифра это адрес кому сообщение. Метки TX-XT маркеры пакета команды.
Кусочек активного кода. (Упрощен)
#include <ShiftRegister74HC595.h>
#include <SoftwareSerial.h>
SoftwareSerial softSerial(3, 4); // RX, TX
int netReqpin = 19;
int errSignalPin = 12;
String rxData; //receive data buffer patriculator
String rxCheck; //receive packer validator
String netComm; // receive command (net - network)
String netOutbuffer; // ouput data buffer. for what? i thing this is better than formatting directly in Serial.println("data"blablabla_vars) size? i don't know....
String netDatax; //received data in 3-rd section
int netCommSwitch; //var for define 3-rd part of command stores a 0, 1, 3 difits (disable, enable + switch, error)
int compare; //compare strings var for compare function for detect errore on receive
int netCommdigit; //extracted from srting typed variable and converted to integer digit (tell about number of device)
int devPinouts[61] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; //variable for store status of switchers&leds
void setup() {
Serial.begin(9600);
softSerial.begin(9600);
softSerial.println("Started///_W");
Serial.println("Write_module_started///");
pinMode(netReqpin, INPUT);
pinMode(13, OUTPUT);
}
void loop() {
readSerialDatax();
}
void readSerialDatax() {
//function for write data to another controller when he request that
//if (digitalRead(netReqpin) == 1)
//{
val = rxData;
rxData = "";
netDatax = "";
netComm = "";
netCommdigit = 0;
while (Serial.available()) //if we have something on serial buffer
{
char buff = Serial.read(); //read that
rxData += buff; //add to string
}
while (softSerial.available()) //if we have something on serial buffer
{
char buff = softSerial.read(); //read that
rxData += buff; //add to string
}
rxCheck = rxData.substring(0, 2); //copy portion of start string mark
compare = rxCheck.compareTo("TX"); //compare to
if (compare == 0) //if compare success
{
rxCheck = rxData.substring(6); //copy a ner end mark string portion to another variable
compare = rxCheck.compareTo("XT"); //compare to
if (compare == 0) //if start and end marks are ok
{
//packet valid, continue...
if (rxData.substring(2, 3) == "3") //Read device address
{
netComm = rxData.substring(3, 5); //current number
netCommdigit = netComm.toInt(); /////////////////////////////////////////////////////////optimize?!
if (netCommdigit == 61) {
//|00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Serial.print("DISABLE---");
softSerial.println("DISABLE---");
sr.setAllLow();
for(int i=0; i<61; i++){
devPinouts[i] = 0;
}
}
if (netCommdigit == 62) {
//|00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Serial.print("ENABLE---");
softSerial.println("ENABLE---");
sr.setAllHigh();
for(int i=0; i<61; i++){
devPinouts[i] = 1;
}
}
if (netCommdigit > 20 && netCommdigit < 41)
{
netDatax = rxData.substring(5, 6); //this is define command or req
if (netDatax == "0") {
//this is an disable device command
devPinouts[tS1] = 0;
devPinouts[tS2] = 0;
Serial.println("Off");
softSerial.println("Off");
}
if (netDatax == "1") {
devPinouts[tS1] ++; //do what we do
}
}
}
}
if (compare != 0) //if compare fail (bad packet)
{
if (compare != -84) //-84 this is empty data, ignore this
{
//|00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Serial.print("ERR receivening||| i receive: ");
Serial.println(rxData);
softSerial.print("ERR receivening.WRITER||| i receive: ");
softSerial.println(rxData);
rxData = "";
}
}
}
delay(200);
}
Такие пирожки. Проблема в том что я шлю с ПК комманду, та по идее принимается и дублируется с изменением адреса устройства (в нашем случае он 3) и шлет ее по программому порту. А тот пишет правильный пакет в ошибке. ERR receivening.WRITER||| i receive: TX3621XT
Прямое подключение рабоатет как нужно, транзит не понимает. Маркеры TX-XT на месте. Длина команды фиксированная. Что я упустил?
Ах да, я научил первый МК читать что отвечает второй МК. Поэтому я вывел ошибку. До этого я не смог подключиться через UART как снифер для прослушки обмена.
Краткий алгоритм разбора: Проверяем есть ли метки TX-XT на своих местах. Так и другие данные после проверки меток. Они смотрятся в первую очередь. Вывел метки отдельно и использую compareTo из-за того что просто сравнение не катит почемуто.
Если пакет меньше-больше - ошибка. Если повреждено начало-конец тоже. Только тело не имеет защиты. Да и не нужна она на мой взгляд в теле.
Неужели никто не сталкивался? Как вы парсите команды по серийному порту?
Начал играться.
Заменил сравненеие меркеров на startsWith и endsWith работает как надо.
Создаю удаленный serial сервер. Из самого сервера все понимается нормально. Шлю команду через putty в сервер к которому подключен serial - не понимает. В буфере команда правильная. Тоесть проблема в конкретном формате отправки?! Потому что ту же ошибку я получил и на аппаратном порте.
И тут тоже интересно. Подключаюсь к программному порту. Шлю с сервера. Все правильно. Шлю с удаленной консоли, не понимает снова. Тоесть проблема в самой передаче. Если напрямую с пк (сервера) понимает, то что не так в связке
мк - мк
Разобрался. Как хотите, можно тему и удалить. Если нет, тогда причина.
Отследил монитором и дошло. Использовались функции serial.println(blablabla) суть как раз в println. Он шлет вконце два байта, и какие же?! Правильно! CR-LF (0d 0a). В итоге было TX3621XT..
Только не доходит почему в старой проверке где была привязка к позиции символов последние два символа XT были на месте, и только потом эти две команды окончания строки. В общем загадка. Теперь проблему повторить не могу. Ну и ладно, нечего насиловать.
Изменение на Serial.print(blablabla); дало результат.