Go Down

Topic: Leitura de porta serial e conversão de valores (Read 236 times) previous topic - next topic

rodrigobaronio

May 01, 2019, 08:23 pm Last Edit: May 01, 2019, 11:32 pm by rodrigobaronio
olá já tenho um código funcionando que lê a porta serial e converte pra valores entre numericos.

eu recebo valores na porta serial da seguinte forma

<axis1a> (vem valor de 0a1023)

eu adicionei um carácter P na frente e F no final então vem da porta serial P<axis1a>F

e meu código abaixo fica

Code: [Select]
<   while (Serial.available()) {
   // se estamos esperando por um nome de atuador, pegue-o aqui
     if (currentState == 0) {
       tmpChar = Serial.read();
       if (tmpChar == 'P') {
         currentState = 1;                 // Começar a procurar a posição do actuador
         valueCharCount = 0;              // Inicializar o número de caracteres de valor lidos em
       }

     }
 

     // Se estivermos prontos para ler os dados atuais do atuador
       if (currentState == 1) {      
       
           while ((valueCharCount < kMaxCharCount) && Serial.available()) {
           
               tmpValue = Serial.read();
             
               if (tmpValue != 'F') {
               
                   tmpValue = tmpValue - 48;
     
                   if ((tmpValue < 0) || (tmpValue > 9)) tmpValue = 0;
                   // Determinar a nova posição para o motor de passo
                   newActuatorPosition = newActuatorPosition * 10 + tmpValue;
                   valueCharCount++;
               }
               else break;
           }
         
           // Se tiver lido o delimitador de valor, atualize o Atuador e comece a procurar o próximo Nome do Atuador
           if (tmpValue == 'F' || valueCharCount == kMaxCharCount) {

           // Transfira o novo valor do atuador para o atual e redefina a nova posição
             actuatorPosition = newActuatorPosition;
             currentState = 0;
             newActuatorPosition = 0;
           
           }
       }
   }>


agora eu queria ler 4 eixos e não estou conseguindo programar isso,

no software q envia os dados via por serial vem assim <axis1a><axis2a><axis3a><axis4a> eu posso adicionar letras entre esses dados para me ajudar fazer os calculos, alguem tiver uma sugestão agradeço.

completando vem em dec esses numeros, no caso se eu coloco P<axis1a>F exemplo numero 500, vem pela porta serial P500F ai na formula acima recebo em actuadorPosition = 500

alkuentrus

Podes editar o teu post e colocar o código dentro do campo </> conforme as regras do forum.... Depois, explica um pouco melhor o que queres fazer. Isto é para que aplicação? Tens um programa externo?

rodrigobaronio

obrigado pela dica,

eu tenho um software já de terceiro que me ajuda controlar 4 motores, e esse software envia valores via porta serial entre 0a1023 em valores binary, dec, ou hex, eu escolho em qual metodo quero receber os valores, nesse caso estou usando o metodo dec, e coloquei pra ele me enviar P<valor>F no caso o software manda um valor de exmplo 400, chega via porta serial P400F, naquele codigo que escrevi acima, ele entende e no fim me traduz em 400, ou sejá não consigo ler via porta serial o numero pronto. atualmente estou usando 1 Arduíno para controlar cada motor, alterando a porta serial, no caso cada axis mando enviar para 1 porta serial.

oque eu quero é usar apenas 1 arduino, para isso preciso que minha programação receba esses 4 sinais e divida para 4 int.

o valor em DEC para os 4 eixos para 1 porta serial, chega assim pro arduino, <axis1a><axis2a><axis3a><axis4a> ou seja se por acaso o valor de todos eixos fossem 400, chega 400400400400, posso adicionar letras antes ou depois de cada intervalo para poder separr esses valor, exemplo A350B500C600D300E ->>> A<axis1a>B<axis2a>C<axis3a>D<axis4a>E

alkuentrus

#3
May 02, 2019, 04:32 pm Last Edit: May 02, 2019, 04:33 pm by alkuentrus
Resumindo:
Tens 4 arduinos e queres ter apenas 1. Há uma forma de virtualizar várias portas série, no Mega e no DUE.

https://www.arduino.cc/reference/en/language/functions/communication/serial/

Depois de leres aquele artigo, comenta, pf.



bubulindo

Acho que tu sabes qual é a solução uma vez que já a implementaste... Quando colocaste o P e F para inicio e fim da tua trama de comunicação, suponho que fosse para indicar quando começa e termina a comunicação. Porque não definires que logo após o teu F vai um campo com o tamanho de um byte que indica o número do motor??

Então receberias tramas deste género:
P1500F
P2450F
P3120F

Etc...

Isso é a maneira que todos os protocolos de comunicação funcionam.
This... is a hobby.

Go Up