Ir ao conteúdo

Posts recomendados

Postado

Boa noite!

 

Tenho que fazer o seguinte programa: Elabore um programa que envie um número de 0 a 9 pelo canal de comunicação serial para um Arduino e que este some 1 ao valor e o envie de volta ao PC para ser impresso na tela. 

 

O professor passou algumas linhas de código em C para fazer esse envio e leitura, mas não consegui fazer funcionar. Até agora está assim:

 

#include <stdio.h>
#include <windows.h>
#include <conio.h>

HANDLE hSerial;
wchar_t port[6] = {L"COM3"}; //A COM do meu arduino é a 3


int main() {
	
	hSerial = CreateFile("COM3", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
	
	DCB dcbSerialParams = {0};
	dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
	GetCommState(hSerial, &dcbSerialParams);
	dcbSerialParams.BaudRate = CBR_9600;
	dcbSerialParams.ByteSize = 8;
	dcbSerialParams.StopBits = ONESTOPBIT;
	dcbSerialParams.Parity = NOPARITY;
	SetCommState(hSerial, &dcbSerialParams);
	
	COMMTIMEOUTS timeouts = {0};
	timeouts.ReadIntervalTimeout = 50;
	timeouts.ReadTotalTimeoutConstant = 50;
	timeouts.ReadTotalTimeoutMultiplier = 10;
	timeouts.WriteTotalTimeoutConstant = 50;
	timeouts.WriteTotalTimeoutMultiplier = 10;
	SetCommTimeouts(hSerial, &timeouts);   
	
	
	
	int comando;
	
	printf("Digite um número entre 0 e 9. 10 para fechar: ");
	scanf("%i", &comando);
	
	int TxBuff [1];
	unsigned int TotalBytesaEnviar = 12;
	unsigned long BytesEnviados;  
	
	TxBuff [0] = comando;
	WriteFile(hSerial, &TxBuff, TotalBytesaEnviar, &BytesEnviados, NULL);
	
	
	
	int RxBuff [1];
	unsigned int TotalBytesaReceber = 1;
	unsigned long BytesRecebidos;
	
	ReadFile(hSerial, &RxBuff, TotalBytesaReceber, &BytesRecebidos, NULL);
	
	putchar(RxBuff[0]);
	
	printf("\n%i\n", comando);

	
	
	CloseHandle (hSerial);
	return 0;
}

 

No arduino coloquei o seguinte código:

 

void setup() {
  Serial.begin(9600);
}

void loop() {

  int num = 0;

  num = Serial.read();

  num = num + 1;

  Serial.println(num);

}

 

Ele retorna o valor, mas não foi modificado pelo arduino. Eu sei que devem ter muitas coisas erradas, mesmo que o programa esteja compilando.

 

Postado

@jbiribi Acredito que no loop é preciso receber e enviar, assim:

void loop() {
  //Se recebeu
  if(Serial.available() > 0){
    int num = 0;
    num = Serial.read() + 1; //recebe
    Serial.println(num);     //imprime
    Serial.write(num);       //envia
  }
}

 

Postado
Em 20/11/2017 às 21:40, TYSQUARE89 disse:

@jbiribi Acredito que no loop é preciso receber e enviar, assim:


void loop() {
  //Se recebeu
  if(Serial.available() > 0){
    int num = 0;
    num = Serial.read() + 1; //recebe
    Serial.println(num);     //imprime
    Serial.write(num);       //envia
  }
}

 

 

Realmente, estava errado. Com o seu aprece funcionar até 8. Com 9 aparece : em vez de 10. O problema é que no programa em C não aparece o valor certo, então deve ter erro ali também.

 

No exercício não pede mas, só por curiosidade, por algum motivo com o seu código a partir de 10 ele soma as duas unidades. Não entendi porque.

 

Postado

@jbiribi Não entendi muito bem o que acontece, você digite de 0 a 9 e deveria aparecer de 1 a 10, sendo que o valor retornado é armazenado em RxBuff[0];, use printf.

 

Lembrando que você não pode enviar 10, já que ele deve fechar.

Postado
Em 22/11/2017 às 18:19, TYSQUARE89 disse:

@jbiribi Não entendi muito bem o que acontece, você digite de 0 a 9 e deveria aparecer de 1 a 10, sendo que o valor retornado é armazenado em RxBuff[0];, use printf.

 

Lembrando que você não pode enviar 10, já que ele deve fechar.

 

Usar printf no código do arduino? porque no arduino não compilou com printf.

Postado
1 hora atrás, TYSQUARE89 disse:

@jbiribi Não no Arduíno, mas no código do que se 'comunica' com o código do Arduíno.

 

Usando printf no lugar de putchar ficou igual.

 

Meu código está assim agora:

 

#include <stdio.h>
#include <windows.h>
#include <conio.h>

HANDLE hSerial;
wchar_t port[6] = {L"COM3"}; //A COM do meu arduino é a 3


int main() {
	
	hSerial = CreateFile("COM3", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
	
	DCB dcbSerialParams = {0};
	dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
	GetCommState(hSerial, &dcbSerialParams);
	dcbSerialParams.BaudRate = CBR_9600;
	dcbSerialParams.ByteSize = 8;
	dcbSerialParams.StopBits = ONESTOPBIT;
	dcbSerialParams.Parity = NOPARITY;
	SetCommState(hSerial, &dcbSerialParams);
	
	COMMTIMEOUTS timeouts = {0};
	timeouts.ReadIntervalTimeout = 50;
	timeouts.ReadTotalTimeoutConstant = 50;
	timeouts.ReadTotalTimeoutMultiplier = 10;
	timeouts.WriteTotalTimeoutConstant = 50;
	timeouts.WriteTotalTimeoutMultiplier = 10;
	SetCommTimeouts(hSerial, &timeouts);   
	
	
	
	char comando;
	
	
	printf("Digite um número entre 0 e 9. 10 para fechar: ");
	scanf("%c", &comando);
	//comando = getch();
	
	char TxBuff [1];
	unsigned int TotalBytesaEnviar = 12;
	unsigned long BytesEnviados;  
	
	TxBuff [0] = comando;
	WriteFile(hSerial, &TxBuff, TotalBytesaEnviar, &BytesEnviados, NULL);
	
	
	char RxBuff [1];
	unsigned int TotalBytesaReceber = 1;
	unsigned long BytesRecebidos;
	
	ReadFile(hSerial, &RxBuff, TotalBytesaReceber, &BytesRecebidos, NULL);
	
	
	putchar(RxBuff[0]);	
	
	
	CloseHandle (hSerial);
	return 0;
}

 

Está funcionando, mas tenho que enviar duas vezes. Na primeira vez que envio um número ele repete o valor anterior. Não entendi porque, mas já está melhor que antes kkkk.

 

E sobre não estar somando quando envio 9: Deve ser porque devo converter para ASC. Agora só tenho que pesquisar como fazer isso.

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...