Send a sequence of bytes
import serial
import time
ser = serial.Serial(
port='/dev/ttyUSB0',
baudrate=9600,
timeout=1,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
bytesize=serial.EIGHTBITS
)
packet = [0x54,0x51,0x41,0x12,0x00,0x02,0xFF,0xFF]
# convert list to bytearray
byte_array = bytearray(packet)
while True:
ser.write(byte_array)
time.sleep(1)
ser.close()
Read any bytes received on serial line and print out on stdout in hex format:
import sys
import serial
ser = serial.Serial(
port='/dev/ttyUSB0',
baudrate=9600,
timeout=1,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
bytesize=serial.EIGHTBITS
)
linecounter=0
bytecounter=0
bytesperline = 8
while True:
bytesToRead = ser.inWaiting()
if bytesToRead>0:
value=ser.read(1)
if (bytecounter % bytesperline) == 0:
print("\n[%04X] - " % bytecounter,end='')
sys.stdout.flush()
linecounter=linecounter+1
print("%02X " % ord(value),end='')
sys.stdout.flush()
bytecounter=bytecounter+1
if bytecounter==0:
print
bytecounter=0
This is a basic example on how to use a serial port in C.
Refer to these links to understand how it works.
#include "stdio.h"
#include "string.h"
#include "unistd.h"
#include "fcntl.h"
#include "errno.h"
#include "sys/types.h"
#include "sys/stat.h"
#include "stdlib.h"
#include "stdarg.h"
#include "termios.h"
int main(void) {
char txBuffer[10];
char rxBuffer[10];
int fd;
struct termios tty_attributes;
if ((fd = open("/dev/ttyS1",O_RDWR|O_NOCTTY|O_NONBLOCK))<0) {
fprintf (stderr,"Open error on %s\n", strerror(errno));
exit(EXIT_FAILURE);
} else {
tcgetattr(fd,&tty_attributes);
// c_cflag
// Enable receiver
tty_attributes.c_cflag |= CREAD;
// 8 data bit
tty_attributes.c_cflag |= CS8;
// c_iflag
// Ignore framing errors and parity errors.
tty_attributes.c_iflag |= IGNPAR;
// c_lflag
// DISABLE canonical mode.
// Disables the special characters EOF, EOL, EOL2,
// ERASE, KILL, LNEXT, REPRINT, STATUS, and WERASE, and buffers by lines.
// DISABLE this: Echo input characters.
tty_attributes.c_lflag &= ~(ICANON);
tty_attributes.c_lflag &= ~(ECHO);
// DISABLE this: If ICANON is also set, the ERASE character erases the preceding input
// character, and WERASE erases the preceding word.
tty_attributes.c_lflag &= ~(ECHOE);
// DISABLE this: When any of the characters INTR, QUIT, SUSP, or DSUSP are received, generate the corresponding signal.
tty_attributes.c_lflag &= ~(ISIG);
// Minimum number of characters for non-canonical read.
tty_attributes.c_cc[VMIN]=1;
// Timeout in deciseconds for non-canonical read.
tty_attributes.c_cc[VTIME]=0;
// Set the baud rate
cfsetospeed(&tty_attributes,B9600);
cfsetispeed(&tty_attributes,B9600);
tcsetattr(fd, TCSANOW, &tty_attributes);
txBuffer[0]='A';
write(fd,txBuffer,1);
// Read a char
if (read(fd,&rxBuffer,1)==1) {
printf("%c",rxBuffer[0]);
printf("\n");
}
}
close(fd);
return EXIT_SUCCESS;
}
Signal | Dir | Description | Acqua | Aria G25 | Arietta |
---|---|---|---|---|---|
TXD0 | O | Transmit data | J2.14 (PD18) | S23 (PA0) | J4.23 (PA0) |
RXD0 | I | Receive data | J2.11 (PD17) | S22 (PA1) | J4.24 (PA1) |
RTS0 | O | Request to send | J2.12 (PD16) | S21 (PA2) | |
CTS0 | I | Clear to send | J2.9 (PD15) | S20 (PA3) | |
TXD1 | O | Transmit data | J2.46 (PB29) | S18 (PA5) | J4.28 (PA5) |
RXD1 | I | Receive data | J2.45 (PB28) | S17 (PA6) | J4.27 (PA6) |
RTS1 | O | Request to send | E7 (PC27) | J4.30 (PC27) | |
CTS1 | I | Clear to send | E8 (PC28) | J4.29 (PC28) | |
TXD2 | O | Transmit data | J3.13 (PE26) | S16 (PA7) | J4.26 (PA7) |
RXD2 | I | Receive data | J3.12 (PE25) | S15 (PA8) | J4.25 (PA8) |
RTS2 | O | Request to send | J3.11 (PE24) | ||
CTS2 | I | Clear to send | J3.10 (PE23) | ||
TXD3 | O | Transmit data | J3.7 (PE19) | E2 (PC22) | |
RXD3 | I | Receive data | J3.8 (PE18) | E3 (PC23) | |
RTS3 | O | Request to send | J3.5 (PE17) | E4 (PC24) | |
CTS3 | I | Clear to send | J3.6 (PE16) | E5 (PC25) | |
UTXD0 | O | Transmit data | J3.30 (PC30) | N10 (PC8) | |
URXD0 | I | Receive data | J3.31 (PC29) | N11 (PC9) | |
UTXD1 | O | Transmit data | J3.41 (PA31) | N18 (PC16) | |
URXD1 | I | Receive data | J3.32 (PA30) | N19 (PC17) | |
UTXD2 | O | Transmit data | |||
URXD2 | I | Receive data | |||
UTXD4 | O | Transmit data | |||
URXD4 | I | Receive data | |||
DTXD | O | Debug port tx data | J3.4 (PB31) | S13 (PA10) | |
DRXD | I | Debug port rx data | J3.3 (PB30) | S14 (PA9) |
usart0: serial@f001c000 {
status = "okay";
};
usart1: serial@f0020000 {
status = "okay";
};
usart2: serial@f8020000 {
status = "okay";
};
usart3: serial@f8024000 {
status = "okay";
};
uart1: serial@f8028000 {
status = "okay";
};
uart0: serial@f0024000 {
status = "okay";
};
If you are using a recent Linux Kernel with device tree enabled you have to specify inside the device tree source the RS485. After that you can open the serial port as a normal RS232 port.
This is an example for the /dev/ttyS2 on Aria G25 or Arietta G25 module:
usart3: serial@f8028000 { compatible = "atmel,at91sam9260-usart"; reg = <0xf8028000 0x200>; interrupts = <8 4 5>; pinctrl-names = "default"; pinctrl-0 = <&pinctrl_usart3 &pinctrl_usart3_rts &pinctrl_usart3_cts >; linux,rs485-enabled-at-boot-time; rs485-rts-delay = <0 20>; status = "okay"; };
The rs485-rts-delay parms are in 0.1 mS instead on mS as written on the Kernel doc.
This example sends a char on the RS485 bus using a DAISY-10 board wired on the /dev/ttyS2 serial port. If you are using a Terra board plug the DAISY-10 on D10 connector (..see the Terra pinout).
import serial,fcntl, struct ser = serial.Serial( port='/dev/ttyS2', baudrate=9600, timeout=1, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS ) fd=ser.fileno() ser.write("0123456789") # Send some char on the RS485 bus s = ser.read(1) # Wait for a char print s ser.close()
If you are using an old Kernel Linux without the device tree you have to setup the rs485 hardware mode as illustrated below:
import serial,fcntl, struct ser = serial.Serial( port='/dev/ttyS2', baudrate=9600, timeout=1, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS ) fd=ser.fileno() serial_rs485 = struct.pack('hhhhhhhh', 1, 0, 0, 0, 0, 0, 0, 0) fcntl.ioctl(fd,0x542F,serial_rs485) ser.write("A") # Send a "A" char to the serial port s = ser.read(1) # Wait for a char print s ser.close()
#include "stdio.h" #include "string.h" #include "unistd.h" #include "fcntl.h" #include "errno.h" #include "sys/types.h" #include "sys/stat.h" #include "stdlib.h" #include "stdarg.h" #include "termios.h" #include "linux/serial.h" #define TIOCSRS485 0x542F int main(void) { char txBuffer[10]; char rxBuffer[10]; int fd; struct termios tty_attributes; struct serial_rs485 rs485conf; if ((fd = open("/dev/ttyS2",O_RDWR|O_NOCTTY|O_NONBLOCK))<0) { fprintf (stderr,"Open error on %s\n", strerror(errno)); exit(EXIT_FAILURE); } else { tcgetattr(fd,&tty_attributes); // c_cflag // Enable receiver tty_attributes.c_cflag |= CREAD; // 8 data bit tty_attributes.c_cflag |= CS8; // c_iflag // Ignore framing errors and parity errors. tty_attributes.c_iflag |= IGNPAR; // c_lflag // DISABLE canonical mode. // Disables the special characters EOF, EOL, EOL2, // ERASE, KILL, LNEXT, REPRINT, STATUS, and WERASE, and buffers // by lines. // DISABLE this: Echo input characters. tty_attributes.c_lflag &= ~(ICANON); tty_attributes.c_lflag &= ~(ECHO); // DISABLE this: If ICANON is also set, the ERASE character // erases the preceding input // character, and WERASE erases the preceding word. tty_attributes.c_lflag &= ~(ECHOE); // DISABLE this: When any of the characters INTR, QUIT, SUSP, // or DSUSP are received, generate the corresponding signal. tty_attributes.c_lflag &= ~(ISIG); // Minimum number of characters for non-canonical read. tty_attributes.c_cc[VMIN]=1; // Timeout in deciseconds for non-canonical read. tty_attributes.c_cc[VTIME]=0; // Set the baud rate cfsetospeed(&tty_attributes,B9600); cfsetispeed(&tty_attributes,B9600); tcsetattr(fd, TCSANOW, &tty_attributes); // Set RS485 mode: rs485conf.flags |= SER_RS485_ENABLED; if (ioctl (fd, TIOCSRS485, &rs485conf) < 0) { printf("ioctl error\n"); } txBuffer[0]='A'; write(fd,txBuffer,1); // Read a char if (read(fd,&rxBuffer,1)==1) { printf("%c",rxBuffer[0]); printf("\n"); } } close(fd); return EXIT_SUCCESS; }