Salve, nell'ambito di un progetto, dovrei riuscire a comunicare attraverso porta UART con un dispositivo che utilizza il protocollo MODBUS.
Ho sotto mano un codice che realizza la stessa cosa ma su porta USB (convertitore USB<>RS485); io invece mi trovo a dover lavorare con un convertitore TTL<>RS485 che si interfaccia ad una board A20-OlinuXino-LIME della Olimex attraverso una porta UART2 provvista dei seguenti segnali (RX, TX, RTS, CTS).
Sulla board è installata una distro Linux DEBIAN e la porta mi viene indicizzata come /dev/ttyS1.
Questo è il codice funzionante per la gestione su /dev/ttyUSB0
codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>
union
{
char c[4];
float f;
}u;
int main(int argc, char* argv[]) {
struct termios serial;
char inBuff[1];
char *buffer;
char cPower[] = {0x01,0x04,0x00,0x0C,0x00,0x02,0xB1,0xC8};
int fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY);
if (fd == -1) {
perror(argv[2]);
return -1;
}
if (tcgetattr(fd, &serial) < 0) {
perror("Getting configuration");
return -1;
}
//////////////////// Set up Serial Configuration ////////////
serial.c_iflag = 0;
serial.c_oflag = 0;
serial.c_lflag = 0;
serial.c_cflag = 0;
serial.c_cc[VMIN] = 0;
serial.c_cc[VTIME] = 10;
serial.c_cflag = B2400 | CS8 | PARENB | CREAD & ~PARODD;
fcntl(fd,F_SETFL,0);
tcsetattr(fd, TCSANOW, &serial); // Apply configuration
//////////////////////////////////////////////////////////////
int rcount;
buffer = &inBuff[0];
int i = 0; int j = 0;
//////////////////////////////// Power ///////////////////////////////
i = 0;
j = 0;
memset(&inBuff[0],0,sizeof(inBuff));
write(fd,cPower,sizeof(cPower));
buffer = &inBuff[0];
printf("----------------------------------\n");
printf("Sent: ");
for(j = 0;j < sizeof(cPower);j++)
{
printf("%02x ",cPower[j]);
}
printf("\r\n");
printf("Received: " );
while( (rcount = read(fd,buffer,1)) > 0)
{
if (rcount < 0) {
perror("Read");
return -1;
}
buffer++;
printf("%02x ",inBuff[i]); i++;
}
u.c[3] = inBuff[3];
u.c[2] = inBuff[4];
u.c[1] = inBuff[5];
u.c[0] = inBuff[6];
printf("\r\n");
printf("Power: %4.2f W \r\n\r\n",u.f);
///////////////////////////////////////////////////////////////////////////////////////////
close(fd);
}
Se volessi riadattare lo stesso codice per /dev/ttyS1 come faccio a gestire il segnale RTS ? Devo abilitare qualche flag?