- Working with the serial console
- Contents
- Configure console access on the target machine
- Boot loader
- GRUB Legacy
- rEFInd
- Syslinux
- Kernel
- getty
- Making Connections
- Connect using a terminal emulator program
- Command line
- And, for Windows
- Graphical front-ends
- Installing Arch Linux using the serial console
- Debugging an unresponsive machine using a serial console
- Troubleshooting
- Ctrl+c and Minicom
- Resizing a terminal
- Missing ports on multi-port expansion cards
- Serial Port Programming on Linux
- Sourcecodes
Working with the serial console
An Arch Linux machine can be configured for connections via the serial console port, which enables administration of a machine even if it has no keyboard, mouse, monitor, or network attached to it.
Installation of Arch Linux is possible via the serial console as well.
A basic environment for this scenario is two machines connected using a serial cable (9-pin connector cable). The administering machine can be any Unix/Linux or Windows machine with a terminal emulator program (PuTTY or Minicom, for example).
The configuration instructions below will enable boot loader menu selection, boot messages, and terminal forwarding to the serial console.
Contents
Configure console access on the target machine
Boot loader
When using GRUB with a generated grub.cfg , edit /etc/default/grub and enable serial input and output support:
Next add the GRUB_SERIAL_COMMAND variable and set the options for the serial connection. For COM1 ( /dev/ttyS0 ) with baud rate of 115200 bit/s:
Read GRUB’s manual on Using GRUB via a serial line and the serial command for detailed explanation of the available options.
GRUB Legacy
Edit the GRUB Legacy configuration file /boot/grub/menu.lst and add these lines to the general area of the configuration:
rEFInd
rEFInd supports serial console only in text mode. Edit refind.conf and uncomment textonly .
Syslinux
To enable serial console in Syslinux, edit syslinux.cfg and add SERIAL as the first directive in the configuration file.
For COM1 ( /dev/ttyS0 ) with baud rate of 115200 bit/s:
The serial parameters are hardcoded to 8 bits, no parity and 1 stop bit.[1]. Read Syslinux Wiki:Config#SERIAL for the directive’s options.
Kernel
Kernel’s output can be sent to serial console by setting the console= kernel parameter. The last specified console= will be set as /dev/console .
getty
At boot, systemd-getty-generator(8) will start a getty instance for each console specified in the kernel command line.
If you have not configured console= in kernel command line start serial-getty@device.service . For /dev/ttyS0 (COM1) that would be serial-getty@ttyS0.service . Enable the service to start it at boot.
Unless specified otherwise in the kernel command line, getty will be expecting 38400 bit/s baud rate, 8 data bits, no parity and one stop bit-times.
Making Connections
Connect using a terminal emulator program
Perform these steps on the machine used to connect the remote console.
Command line
dterm
dterm AUR is a tiny serial communication program. If you invoke it without parameters, it will connect to /dev/ttyS0 at 9600 baud by default. The following example connect to /dev/ttyS0 at 115200 baud, with 8 data bits, no parity bit and 1 stop bit-times:
See its homepage[2] for more examples.
Minicom
minicom can be obtained from the official repositories. Start Minicom in setup mode:
Using the textual navigation menu, change the serial port settings to the following:
Press Enter to exit the menus (pressing Esc will not save changes). Remove the modem Init and Reset strings, as we are not connecting to a modem. To do this, under the Modem and Dialing menu, delete the Init and Reset strings. Optionally save the configuration by choosing save setup as dfl from the main menu. Restart minicom with the serial cable connected to the target machine. To end the session, press Ctrl+A followed by Ctrl+X .
picocom
picocom is a tiny dumb-terminal emulation program that is very like minicom, but instead of mini, it is pico. The following example connect to ttyS0 at 9600 bps:
See its manual for detailed usage.
Screen
GNU Screen is able to connect to a serial port. It will connect at 9600 baud by default:
A different baud rate (e.g. 115200) may be specified on the command line.
To end the session, press Ctrl+a followed by K . Alternatively, press Ctrl+a , type :quit and confirm it by pressing Enter .
Serialclient
Serialclient[3] is a CLI client for serial connection written in ruby. Install ruby package, then install it with the following:
Then, you can use like this:
And, for Windows
On Windows machines, connect to the serial port using programs like PuTTY[4] or Terminalbpp[5].
Graphical front-ends
cutecom AUR is another gui enabled serial monitor.
putty is also available for Linux.
moserial is a gtk-based serial terminal, primarily intended for technical users and hardware hackers who need to communicate with embedded systems, test equipment, and serial consoles.
Installing Arch Linux using the serial console
- Connect to the target machine using the method described above.
- Boot the target machine using the Arch Linux installation CD.
- When the bootloader appears, select Boot Arch Linux () and press Tab to edit
- Append console=ttyS0,115200 and press Enter .
- Now systemd should detect ttyS0 and spawn a serial getty on it. Login as root and start the installation as usual.
Debugging an unresponsive machine using a serial console
Even though [7] has only raw and terse instructions, it presents the full scene. It is important to note that here, the machine under test got unresponsive in a reproducible manner. And that it happened during normal operation. So it could be accessed normally before it needed debugging. However, in general, the serial console is also useful for debugging boot issues. Perhaps by configuring the boot loader by hand at machine startup time. Also note the mentioned netconsole within the P.S paragraph of the external link from this section.
Troubleshooting
Ctrl+c and Minicom
If you are having trouble sending a Ctrl+c command through minicom you need to switch off hardware flow control in the device settings ( minicom -s ), which then enables the break.
Resizing a terminal
Unlike ssh, serial connections do not have a mechanism to transfer something like SIGWINCH when a terminal is resized. This can cause weird problems with some full-screen programs (e.g. less ) when you resize your terminal emulator’s window.
Resizing the terminal via stty is a workaround:
However, this requires you to manually input the proper geometry. The following methods should be simpler.
1. There is a lesser-known utility called resize , shipped with xterm , that can solve this problem. Invoke it without parameters after you resize the terminal emulator’s window:
2. If you do not want to install xterm, it is possible to do the same work via a shell function. Put the following function into your zshrc and invoke it without parameters after resizing the terminal emulator’s window:
Missing ports on multi-port expansion cards
This article or section needs expansion.
The number of serial ports using the generic 8250 driver on the default kernel configuration is set to 4 at runtime with a maximum of 32. This will prevent the creation of /dev/ttyS4 and above. Counting the typical built in serial port on the motherboard this prevents the use of the 4th serial port on a 4 port expansion card.
Источник
Serial Port Programming on Linux
This is a tutorial on how to program the Serial Ports on your Linux box.Serial Ports are nice little interfaces on the PC which helps you to interface your embedded system projects using a minimum number of wires.In this tutorial we will write a small program that will send and receive ASCII characters to a microcontroller development board.
One problem with the traditional serial ports is that they are now legacy hardware and are being phased out by the PC manufacturers and most laptops have USB ports only,this problem can be easily solved by using a variety of USB to Serial Converters available in the market,eg USB2SERIAL V2.0.
Please note that in this tutorial I am using a USB to Serial Converter based on FT232 from FTDI. You can use any FT232 based board ( other USB converter boards based on different chip sets should work,but i have not tested it ) or you can buy the one I am using here.
If you have traditional D subminiature (DB9) Serial Ports,just identify the relevant pins (RXD, TXD,RTS,DTR and Ground) and continue with the tutorial.
In this tutorial we are going to use the C language to program the serial port on a Linux Operating system(Ubuntu/LinuxMint).The compiler used is gcc which is freely available along with the OS.
Sourcecodes
- Please note that the source codes on the website show only the relevant sections to highlight the process of programming the serial port.
- Contact Us to Enquire about the full Source codes
Serial Ports under Linux
Traditional hardware serial ports under Linux are named as ttyS* where * can be 1,2,3. etc for eg ttyS1,ttyS2,ttyS23 . etc.They are similar to COM1,COM2 etc under a windows box.
While
USB to Serial Converter based serial ports are usually named as ttyUSB* where * can be 1,2,3. etc for eg ttyUSB0,ttyUSB1 etc .
In Linux the hardware components like serial ports are treated like files and are grouped together in the /dev folder in the file system.if you navigate into the /dev folder and list the files using ls command you can see the files corresponding to various hardware devices.
Now you can see a large number of serial ports listed in the /dev directory like ttyS28,ttyS23 etc.Now to identify which of the ttyS* corrosponds to your hardware serial port run the following command on the terminal.
dmesg | grep ttyS
if you are getting an output like this
[ 37.531286] serial8250: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
it means that ttyS0 is your hardware serial port connected to your computer .
Now if you dont have any hardware serial ports ( like in my case ) the command will not print anything,like this.
Now to check for any USB to serial converter use dmesg | grep tty command.
You can see that FTDI based USB to Serial Converter is attached to ttyUSB0.Now you can use the ttyUSB0 to communicate with your serial converter .
Another place where you can see the attached serial devices is the /dev/serial/by-id folder.
Programming the Serial Port
In this tutorial i am going to use C language to program the Serial port,compiler used is GCC.
If you are interested to know more about the internals of the serial port you can refer “The Serial Programming Guide for POSIX Operating Systems” written by Michael R.Sweet.
To perform serial I/O under linux we are going to use the termios API.termios API supports two modes of accessing the serial ports.
1. Cannonical Mode
2. NonCannonical Mode
Cannonical mode is the default mode and is used for accessing terminals and stuff.For our tutorial we are going to use the second mode called the non cannonical mode.More details about the difference between the modes are available in the above book .
Opening and Closing the Serial Port
Opening a serial port in Linux is accomplished by using the open() system call and closing the serial port is done using the close() system call.
The open() system call takes two arguments ,name of the file to be opened (here serial port ) and the various parameters associated with it.It returns a -1 on failure and a positive integer on success.
int fd ;
fd = open( » /dev/ttyUSB0 «,O_RDWR | O_NOCTTY ) ;
here /dev/ttyUSB0 is the name of the serial port you are using (here FTDI based USB2SERIAL Converter board),If you are using a hardware serial port it will be some thing like /dev/ttyS1 or /dev/ttyS2.
gcc -o serial serial.c Now save the file and compile it using GCC at the terminal.
Please make sure that you are using the correct serial port name in the open() command.In the above code it is ttyUSB0 , it may be different in your system.
Another important fact regarding the Linux system is that Linux will only allow you to access the hardware resources from root account.So you will have to execute the resulting binary as root ,just use the sudo command.
After the code is compiled successfully,execute the binary as root by issuing the following command.Enter the password for root when prompted.
sudo ./serial
Please make sure your hardware is connected before executing the binary, in case you are using a USB to serial converter.
Configuring the termios structure
After opening and closing the serial port successfully ,its time to configure the correct mode,baudrate,data format,number of start/stop bits etc .In Linux it is done by a structure called termios.
And this is how the structure looks like
struct termios
<
tcflag_t c_iflag ; /* input mode flags */
tcflag_t c_oflag ; /* output mode flags */
tcflag_t c_cflag ; /* control mode flags */
tcflag_t c_lflag ; /* local mode flags */
cc_t c_line ; /* line discipline */
cc_t c_cc[NCCS] ; /* control characters */
>;
Now first thing to do is to declare a structure of type termios
struct termios SerialPortSettings ;
Now to configure the termios structure according to our needs we use two functions,tcgetattr() and tcsetattr().
tcgetattr() is used to get the current settings of the serial port to the structure we just declared.It takes two arguments, the file descriptor fd corresponding to the serial port we have opened and the address of the structure we just declared.
After getting the current settings we are going to change it suit our needs.We are going to configure the serial port to transmit at 9600 baudrate , 8 bits, No parity ,1 Stop bit ,the 8N1 configuration.
Setting the Baudrate
In Linux ,there is an option to set different read and write speeds but it is recommended to set the same speed for both read and write.
The Baudrate is set using two functions,
cfsetispeed() for setting the input speed or read speed and
cfsetospeed() for setting the output speed or write speed.
Now let’s set the speed for both reading and writing at 9600 bps
you can use other standard baudrates like 4800,19200,38400 etc all Baudrate constants have to be prefixed with a ‘B’ like B4800 , B19200 etc .
Please note that the MSP430 microcontroller code provided (microcontroller side) uses 9600bps 8N1 format for communicating with the PC.
Configuring data format,Start/Stop bits ,Parity
The control flags ( c_cflag ) of the termios structure configures the data format (8bit or 7 bits for data),Parity(Even,Odd,None) and the number of start and stop bits to use while communicating.
Configuring these information involves setting and clearing individual bits of the control flags.It is advisable to check out “Bit manipulation in C language” in google/wikipedia,if you are not familiar.
Configuring other Options
Turn off hardware based flow control (RTS/CTS).
Turn on the receiver of the serial port (CREAD),other wise reading from the serial port will not work.
SerialPortSettings.c_cflag |= CREAD | CLOCAL ;
Turn off software based flow control (XON/XOFF).
( IXON | IXOFF | IXANY );
Setting the mode of operation,the default mode of operation of serial port in Linux is the Cannonical mode.For Serial communications with outside devices like serial modems,mice etc NON Cannonical mode is recommended.
( ICANON | ECHO | ECHOE | ISIG );
More information about the functions and constants discussed above can be found in the termios manual page.You can easly access them by typing
man termios on your terminal.
The man pages are also available online at www.man7.org.
After you have configured all of the required bitfields of the terminos structure.You can use the tcsetattr() function to set them.tcsetattr() takes three arguments,the first and last arguments are same as in the tcgetattr()function.The second one TCSANOW tells to make the changes now without waiting.
tcsetattr ( fd , TCSANOW , &SerialPortSettings )
Hardware Connections
Now we will create a small serial link between a microcontroller board and a PC running Linux OS to test out reading and writing from a PC serial port .
Microcontroller used here is MSP430G2553 from Texas instruments on Launchpad development board.Please note that you can use any microcontroller like 8051 or Atmel AVR on the embedded system side.Since this is an article about setting up and configuring the serial port on Linux,the microcontroller side code is explained here.
The PC is connected to the microcontroller board using a null modem cable.The RX of the PC (serial port) is connected to the TX of the Microcontroller and vice versa.The Grounds of PC and microcontroller are connected together.
Here my PC do not have a hardware DB9 serial port(9 pin),So i am using a FTDI based USB to Serial converter called USB2SERIAL which converts the USB signals to TTL compatible serial outputs (RXD and TXD). you can directly connect the outputs of USB2SERIAL to MSP430 microcontroller as shown in the below block diagram. USB2SERIAL also offers selectable 3V/5V TTL outputs for interfacing to 3.3V logic microcontrollers like MSP430.
Please noter that if you are using a DB9 RS232 SerialPort of your PC ,you will have to build a RS232 signal level converter at the microcontroller side to decode the RS232 signal.Connecting the RS232 Lines from the PC directly to microcontroller UART directly will damage the chip.
Writing data into Serial Port
Writing data to serial port is accomplished using the write() system call.
Reading Data from the Serial Port
Reading data from the serial port is accomplished by using the read() system call.
In the zip file you can find “SerialPort_read.c” which contains the complete program.Compile the program using gcc and run it.Remember to use sudo so that your executable runs as root.
After providing the root password,the program will execute and wait for a character to be send by the microcontroller.
You can now reset the MSP430 microcontroller connected to the USB2SERIAL converter to transmit the string .
Program receives the “Hello from MSP430” string send by the microcontroller and displays it on the terminal.
Источник