在全志T7平台上测试TTY功能

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<termios.h>
#include<string.h>

#define TTY_PATH	"/dev/ttyS5"
 
int set_opt(int fd,int nSpeed, int nBits, char nEvent, int nStop)
{
	struct termios newtio,oldtio;
	if  ( tcgetattr( fd,&oldtio)  !=  0) 
	{
		perror("SetupSerial 1");
		return -1;
	}
	
	bzero( &newtio, sizeof( newtio ) );
	newtio.c_cflag  |=  CLOCAL | CREAD; //CLOCAL:忽略modem控制线  CREAD:打开接受者
	newtio.c_cflag &= ~CSIZE; //字符长度掩码。取值为:CS5,CS6,CS7或CS8

	switch( nBits )
	{
		case 7:
		{
			newtio.c_cflag |= CS7;
			break;
		}
		case 8:
		{
			newtio.c_cflag |= CS8;
			break;	
		}
		default:
			break;
	}
 
	switch( nEvent )
	{
		case 'O':
		{
			newtio.c_cflag |= PARENB; //允许输出产生奇偶信息以及输入到奇偶校验
			newtio.c_cflag |= PARODD;  //输入和输出是奇及校验
			newtio.c_iflag |= (INPCK | ISTRIP); // INPACK:启用输入奇偶检测;ISTRIP:去掉第八位
			break;		
		}
		case 'E':
		{
			newtio.c_iflag |= (INPCK | ISTRIP);
			newtio.c_cflag |= PARENB;
			newtio.c_cflag &= ~PARODD;
			break;
		}
		case 'N': 
		{
			newtio.c_cflag &= ~PARENB;
			break;	
		}
	}
 
	switch( nSpeed )
	{
		case 2400:
		{
			cfsetispeed(&newtio, B2400);
			cfsetospeed(&newtio, B2400);
			break;
		}
		case 4800:
		{
			cfsetispeed(&newtio, B4800);
			cfsetospeed(&newtio, B4800);
			break;	
		}
		case 9600:
		{
			cfsetispeed(&newtio, B9600);
			cfsetospeed(&newtio, B9600);
			break;	
		}
		case 115200:
		{
			cfsetispeed(&newtio, B115200);
			cfsetospeed(&newtio, B115200);
			break;
		}
		case 460800:
		{
			cfsetispeed(&newtio, B460800);
			cfsetospeed(&newtio, B460800);
			break;	
		}
		default:
		{
			cfsetispeed(&newtio, B9600);
			cfsetospeed(&newtio, B9600);
			break;
		}
	}
 
	if( nStop == 1 )
	{
		newtio.c_cflag &=  ~CSTOPB; //CSTOPB:设置两个停止位,而不是一个
	}
	else if ( nStop == 2 )
	{
		newtio.c_cflag |=  CSTOPB;
	}
	
	newtio.c_cc[VTIME]  = 0; //VTIME:非cannoical模式读时的延时,以十分之一秒位单位
	newtio.c_cc[VMIN] = 0; //VMIN:非canonical模式读到最小字符数
	tcflush(fd,TCIFLUSH); // 改变在所有写入 fd 引用的对象的输出都被传输后生效,所有已接受但未读入的输入都在改变发生前丢弃。
	
	if((tcsetattr(fd,TCSANOW,&newtio))!=0) //TCSANOW:改变立即发生
	{
		perror("com set error");
		return -1;
	}
	
	printf("set done!\n\r");
	return 0;
}
 
int main(void)
{
	int fd = 0;
	int ret = 0;
	char tx_buf[64]={"test tty serial data ...... !!!"};
	char rx_buf[64];

	fd = open(TTY_PATH, O_RDWR);
	if (fd < 0)
	{
		exit(1);
	}
	
	printf("open %s success!!\n", TTY_PATH);

	ret = set_opt(fd, 115200, 8, 'N', 1);
	if (-1 == ret)
	{
		exit(1);
	}
	
	printf("set %s success!!\n", TTY_PATH);
	printf("enter the loop!!\n");

	while (1)
	{ 
		static int index = 0;
		
		ret = write(fd, tx_buf, 64);
		if( ret > 0)
		{
			printf("[%d] tx_data: %s success, wait data received.\n", index, tx_buf);
		}
		
		memset(rx_buf, 0, sizeof(rx_buf));
		ret = read(fd, rx_buf, 64);
		if(ret > 0)
		{
			printf("[%d] rx_data: %s success\n\n", index, rx_buf);
		}
		else
		{
			printf("[%d] rx_data: fail !!!\n\n", index);
		}
		
		index++;
		sleep(2);
	}
	
	close(fd);
 
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值