Linux tty串口测试程序
2017-05-12 18:34
411 查看
FROM:http://blog.csdn.net/hanglinux/article/details/44978745
在程序中,很容易配置串口的属性,这些属性定义在结构体struct termios中。
关于termios的详细介绍,可以另行查资料,或者参考:详解Linux下的串口通讯开发:http://blog.itpub.NET/24790158/viewspace-1041147/
[cpp] view
plain copy
#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>
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;
}
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 fd1,nset,nread,ret;
char buf[100]={"test com data!...........\n"};
char buf1[100];
fd1 = open( "/dev/ttySAC0", O_RDWR);
if (fd1 == -1)
exit(1);
printf("open SAC0 success!!\n");
nset = set_opt(fd1, 9600, 8, 'N', 1);
if (nset == -1)
exit(1);
printf("SET SAC0 success!!\n");
printf("enter the loop!!\n");
while (1)
{
memset(buf1, 0, sizeof(buf1));
ret = write(fd1, buf, 100);
if( ret > 0){
printf("write success! wait data receive\n");
}
nread = read(fd1, buf1, 100);
if(nread > 0){
printf("redatad: nread = %s\n\n\r", buf1);
}
sleep(1);
//nread = read(fd1, buf1,1);
//if(buf1[0] == 'q')
//break;
}
close(fd1);
return 0;
}
用arm-linux-gcc交叉编译后在开发板上运行,将9口串口的2 3短接:
[python] view
plain copy
/ # ./com
open SAC0 success!!
set done!
SET SAC0 success!!
enter the loop!!
write success! wait data receive
write success! wait data receive
write success! wait data receive
write success! wait data receive
write success! wait data receive
write success! wait data receive
redatad: nread = test com data!...........
write success! wait data receive
redatad: nread = test com data!...........
write success! wait data receive
redatad: nread = test com data!...........
在程序中,很容易配置串口的属性,这些属性定义在结构体struct termios中。
关于termios的详细介绍,可以另行查资料,或者参考:详解Linux下的串口通讯开发:http://blog.itpub.NET/24790158/viewspace-1041147/
[cpp] view
plain copy
#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>
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;
}
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 fd1,nset,nread,ret;
char buf[100]={"test com data!...........\n"};
char buf1[100];
fd1 = open( "/dev/ttySAC0", O_RDWR);
if (fd1 == -1)
exit(1);
printf("open SAC0 success!!\n");
nset = set_opt(fd1, 9600, 8, 'N', 1);
if (nset == -1)
exit(1);
printf("SET SAC0 success!!\n");
printf("enter the loop!!\n");
while (1)
{
memset(buf1, 0, sizeof(buf1));
ret = write(fd1, buf, 100);
if( ret > 0){
printf("write success! wait data receive\n");
}
nread = read(fd1, buf1, 100);
if(nread > 0){
printf("redatad: nread = %s\n\n\r", buf1);
}
sleep(1);
//nread = read(fd1, buf1,1);
//if(buf1[0] == 'q')
//break;
}
close(fd1);
return 0;
}
用arm-linux-gcc交叉编译后在开发板上运行,将9口串口的2 3短接:
[python] view
plain copy
/ # ./com
open SAC0 success!!
set done!
SET SAC0 success!!
enter the loop!!
write success! wait data receive
write success! wait data receive
write success! wait data receive
write success! wait data receive
write success! wait data receive
write success! wait data receive
redatad: nread = test com data!...........
write success! wait data receive
redatad: nread = test com data!...........
write success! wait data receive
redatad: nread = test com data!...........
相关文章推荐
- HI3531串口测试程序(arm) 分类: arm-linux-Ubuntu HI3531 2013-12-10 15:56 749人阅读 评论(3) 收藏
- linux串口测试程序
- cb串口测试程序http://linux-sunxi.org/A20/PIO
- Linux串口测试程序
- linux环境下C语言实现非阻塞方式读取字符串数据的串口测试程序,即串口工具的编写
- DM6446的Linux串口测试程序
- Linux串口测试程序; OpenWRT串口测试程序;
- Linux下UART串口的测试小程序
- Linux串口测试程序
- linux下串口程序测试
- Linux串口测试工具简单程序代码解析
- 嵌入式linux串口通信自发自收测试程序
- 【原创】串口通信测试程序
- Linux 下串口驱动头文件之tty_flip.h
- linux下tty,控制台,虚拟终端,串口,console(控制台终端)详解
- linux串口通信程序
- Linux 下串口驱动头文件之tty.h
- linux 中断和终端测试程序
- LINUX下java串口程序环境配置 分类: LINUX 2010-07-07 10:04 1571人阅读 评论(0) 收藏
- 两个linux性能测试程序LMbench和SysBench