<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://msc.siamtools.com/wiki/index.php?action=history&amp;feed=atom&amp;title=Serial_Terminal_Linux</id>
		<title>Serial Terminal Linux - Revision history</title>
		<link rel="self" type="application/atom+xml" href="https://msc.siamtools.com/wiki/index.php?action=history&amp;feed=atom&amp;title=Serial_Terminal_Linux"/>
		<link rel="alternate" type="text/html" href="https://msc.siamtools.com/wiki/index.php?title=Serial_Terminal_Linux&amp;action=history"/>
		<updated>2026-05-01T22:36:05Z</updated>
		<subtitle>Revision history for this page on the wiki</subtitle>
		<generator>MediaWiki 1.28.0</generator>

	<entry>
		<id>https://msc.siamtools.com/wiki/index.php?title=Serial_Terminal_Linux&amp;diff=1274&amp;oldid=prev</id>
		<title>Snifer: Created page with &quot;&lt;pre&gt; /*  * Building: cc -o com com.c  * Usage   : ./com /dev/device [speed]  * Example : ./com /dev/ttyS0 [115200]  * Keys    : Ctrl-A - exit, Ctrl-X - display control lines ...&quot;</title>
		<link rel="alternate" type="text/html" href="https://msc.siamtools.com/wiki/index.php?title=Serial_Terminal_Linux&amp;diff=1274&amp;oldid=prev"/>
				<updated>2014-12-20T04:15:39Z</updated>
		
		<summary type="html">&lt;p&gt;Created page with &amp;quot;&amp;lt;pre&amp;gt; /*  * Building: cc -o com com.c  * Usage   : ./com /dev/device [speed]  * Example : ./com /dev/ttyS0 [115200]  * Keys    : Ctrl-A - exit, Ctrl-X - display control lines ...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * Building: cc -o com com.c&lt;br /&gt;
 * Usage   : ./com /dev/device [speed]&lt;br /&gt;
 * Example : ./com /dev/ttyS0 [115200]&lt;br /&gt;
 * Keys    : Ctrl-A - exit, Ctrl-X - display control lines status&lt;br /&gt;
 * Darcs   : darcs get http://tinyserial.sf.net/&lt;br /&gt;
 * Homepage: http://tinyserial.sourceforge.net&lt;br /&gt;
 * Version : 2009-03-05&lt;br /&gt;
 *&lt;br /&gt;
 * Ivan Tikhonov, http://www.brokestream.com, kefeer@brokestream.com&lt;br /&gt;
 * Patches by Jim Kou, Henry Nestler, Jon Miner, Alan Horstmann&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Copyright (C) 2007 Ivan Tikhonov&lt;br /&gt;
&lt;br /&gt;
  This software is provided 'as-is', without any express or implied&lt;br /&gt;
  warranty.  In no event will the authors be held liable for any damages&lt;br /&gt;
  arising from the use of this software.&lt;br /&gt;
&lt;br /&gt;
  Permission is granted to anyone to use this software for any purpose,&lt;br /&gt;
  including commercial applications, and to alter it and redistribute it&lt;br /&gt;
  freely, subject to the following restrictions:&lt;br /&gt;
&lt;br /&gt;
  1. The origin of this software must not be misrepresented; you must not&lt;br /&gt;
     claim that you wrote the original software. If you use this software&lt;br /&gt;
     in a product, an acknowledgment in the product documentation would be&lt;br /&gt;
     appreciated but is not required.&lt;br /&gt;
  2. Altered source versions must be plainly marked as such, and must not be&lt;br /&gt;
     misrepresented as being the original software.&lt;br /&gt;
  3. This notice may not be removed or altered from any source distribution.&lt;br /&gt;
&lt;br /&gt;
  Ivan Tikhonov, kefeer@brokestream.com&lt;br /&gt;
&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;termios.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/signal.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/ioctl.h&amp;gt;&lt;br /&gt;
#include &amp;lt;fcntl.h&amp;gt;&lt;br /&gt;
#include &amp;lt;errno.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int transfer_byte(int from, int to, int is_control);&lt;br /&gt;
&lt;br /&gt;
typedef struct {char *name; int flag; } speed_spec;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void print_status(int fd) {&lt;br /&gt;
	int status;&lt;br /&gt;
	unsigned int arg;&lt;br /&gt;
	status = ioctl(fd, TIOCMGET, &amp;amp;arg);&lt;br /&gt;
	fprintf(stderr, &amp;quot;[STATUS]: &amp;quot;);&lt;br /&gt;
	if(arg &amp;amp; TIOCM_RTS) fprintf(stderr, &amp;quot;RTS &amp;quot;);&lt;br /&gt;
	if(arg &amp;amp; TIOCM_CTS) fprintf(stderr, &amp;quot;CTS &amp;quot;);&lt;br /&gt;
	if(arg &amp;amp; TIOCM_DSR) fprintf(stderr, &amp;quot;DSR &amp;quot;);&lt;br /&gt;
	if(arg &amp;amp; TIOCM_CAR) fprintf(stderr, &amp;quot;DCD &amp;quot;);&lt;br /&gt;
	if(arg &amp;amp; TIOCM_DTR) fprintf(stderr, &amp;quot;DTR &amp;quot;);&lt;br /&gt;
	if(arg &amp;amp; TIOCM_RNG) fprintf(stderr, &amp;quot;RI &amp;quot;);&lt;br /&gt;
	fprintf(stderr, &amp;quot;\r\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
	int comfd;&lt;br /&gt;
	struct termios oldtio, newtio;       //place for old and new port settings for serial port&lt;br /&gt;
	struct termios oldkey, newkey;       //place tor old and new port settings for keyboard teletype&lt;br /&gt;
	char *devicename = argv[1];&lt;br /&gt;
	int need_exit = 0;&lt;br /&gt;
	speed_spec speeds[] =&lt;br /&gt;
	{&lt;br /&gt;
		{&amp;quot;1200&amp;quot;, B1200},&lt;br /&gt;
		{&amp;quot;2400&amp;quot;, B2400},&lt;br /&gt;
		{&amp;quot;4800&amp;quot;, B4800},&lt;br /&gt;
		{&amp;quot;9600&amp;quot;, B9600},&lt;br /&gt;
		{&amp;quot;19200&amp;quot;, B19200},&lt;br /&gt;
		{&amp;quot;38400&amp;quot;, B38400},&lt;br /&gt;
		{&amp;quot;57600&amp;quot;, B57600},&lt;br /&gt;
		{&amp;quot;115200&amp;quot;, B115200},&lt;br /&gt;
		{NULL, 0}&lt;br /&gt;
	};&lt;br /&gt;
	int speed = B9600;&lt;br /&gt;
&lt;br /&gt;
	if(argc &amp;lt; 2) {&lt;br /&gt;
		fprintf(stderr, &amp;quot;example: %s /dev/ttyS0 [115200]\n&amp;quot;, argv[0]);&lt;br /&gt;
		exit(1);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	comfd = open(devicename, O_RDWR | O_NOCTTY | O_NONBLOCK);&lt;br /&gt;
	if (comfd &amp;lt; 0)&lt;br /&gt;
	{&lt;br /&gt;
		perror(devicename);&lt;br /&gt;
		exit(-1);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(argc &amp;gt; 2) {	&lt;br /&gt;
		speed_spec *s;&lt;br /&gt;
		for(s = speeds; s-&amp;gt;name; s++) {&lt;br /&gt;
			if(strcmp(s-&amp;gt;name, argv[2]) == 0) {&lt;br /&gt;
				speed = s-&amp;gt;flag;&lt;br /&gt;
				fprintf(stderr, &amp;quot;setting speed %s\n&amp;quot;, s-&amp;gt;name);&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	fprintf(stderr, &amp;quot;C-a exit, C-x modem lines status\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	tcgetattr(STDIN_FILENO,&amp;amp;oldkey);&lt;br /&gt;
	newkey.c_cflag = B9600 | CRTSCTS | CS8 | CLOCAL | CREAD;&lt;br /&gt;
	newkey.c_iflag = IGNPAR;&lt;br /&gt;
	newkey.c_oflag = 0;&lt;br /&gt;
	newkey.c_lflag = 0;&lt;br /&gt;
	newkey.c_cc[VMIN]=1;&lt;br /&gt;
	newkey.c_cc[VTIME]=0;&lt;br /&gt;
	tcflush(STDIN_FILENO, TCIFLUSH);&lt;br /&gt;
	tcsetattr(STDIN_FILENO,TCSANOW,&amp;amp;newkey);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	tcgetattr(comfd,&amp;amp;oldtio); // save current port settings &lt;br /&gt;
	newtio.c_cflag = speed | CS8 | CLOCAL | CREAD;&lt;br /&gt;
	newtio.c_iflag = IGNPAR;&lt;br /&gt;
	newtio.c_oflag = 0;&lt;br /&gt;
	newtio.c_lflag = 0;&lt;br /&gt;
	newtio.c_cc[VMIN]=1;&lt;br /&gt;
	newtio.c_cc[VTIME]=0;&lt;br /&gt;
	tcflush(comfd, TCIFLUSH);&lt;br /&gt;
	tcsetattr(comfd,TCSANOW,&amp;amp;newtio);&lt;br /&gt;
&lt;br /&gt;
	print_status(comfd);&lt;br /&gt;
&lt;br /&gt;
	while(!need_exit) {&lt;br /&gt;
		fd_set fds;&lt;br /&gt;
		int ret;&lt;br /&gt;
		&lt;br /&gt;
		FD_ZERO(&amp;amp;fds);&lt;br /&gt;
		FD_SET(STDIN_FILENO, &amp;amp;fds);&lt;br /&gt;
		FD_SET(comfd, &amp;amp;fds);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		ret = select(comfd+1, &amp;amp;fds, NULL, NULL, NULL);&lt;br /&gt;
		if(ret == -1) {&lt;br /&gt;
			perror(&amp;quot;select&amp;quot;);&lt;br /&gt;
		} else if (ret &amp;gt; 0) {&lt;br /&gt;
			if(FD_ISSET(STDIN_FILENO, &amp;amp;fds)) {&lt;br /&gt;
				need_exit = transfer_byte(STDIN_FILENO, comfd, 1);&lt;br /&gt;
			}&lt;br /&gt;
			if(FD_ISSET(comfd, &amp;amp;fds)) {&lt;br /&gt;
				need_exit = transfer_byte(comfd, STDIN_FILENO, 0);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	tcsetattr(comfd,TCSANOW,&amp;amp;oldtio);&lt;br /&gt;
	tcsetattr(STDIN_FILENO,TCSANOW,&amp;amp;oldkey);&lt;br /&gt;
	close(comfd);&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int transfer_byte(int from, int to, int is_control) {&lt;br /&gt;
	char c;&lt;br /&gt;
	int ret;&lt;br /&gt;
	do {&lt;br /&gt;
		ret = read(from, &amp;amp;c, 1);&lt;br /&gt;
	} while (ret &amp;lt; 0 &amp;amp;&amp;amp; errno == EINTR);&lt;br /&gt;
	if(ret == 1) {&lt;br /&gt;
		if(is_control) {&lt;br /&gt;
			if(c == '\x01') { // C-a&lt;br /&gt;
				return -1;&lt;br /&gt;
			} else if(c == '\x18') { // C-x&lt;br /&gt;
				print_status(to);&lt;br /&gt;
				return 0;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		while(write(to, &amp;amp;c, 1) == -1) {&lt;br /&gt;
			if(errno!=EAGAIN &amp;amp;&amp;amp; errno!=EINTR) { perror(&amp;quot;write failed&amp;quot;); break; }&lt;br /&gt;
		}&lt;br /&gt;
	} else {&lt;br /&gt;
		fprintf(stderr, &amp;quot;\nnothing to read. probably port disconnected.\n&amp;quot;);&lt;br /&gt;
		return -2;&lt;br /&gt;
	}&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--------------&lt;br /&gt;
[http://www.brokestream.com/tinyserial.html Source]&lt;/div&gt;</summary>
		<author><name>Snifer</name></author>	</entry>

	</feed>