485串口的测试demo代码

#include<stdio.h>
#include<string.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<termios.h>
#include<linux/serial.h>
#include<asm-generic/ioctls.h>
#include<sys/ioctl.h>
#include<unistd.h>
#include<errno.h>
#include<sys/stat.h>
#include<getopt.h>

struct termios newtio, oldtio;

int set_com_opt( int fd, int nspeed, int nbits, char parity, int nstop )
{
	char szTmp[128];
//打印配置信息
	sprintf( szTmp, "set_com_opt - speed:%d,bits:%d,parity:%c,stop:%d\n", 
				nspeed, nbits, parity, nstop );
    
//	log_out( "./485.log", szTmp );
	//保存并测试现在有串口参数设置,在这里如果串口号等出错,会有相关的出错信息 
	if( tcgetattr( fd, &oldtio ) != 0 )
	{
	
	sprintf( szTmp, "SetupSerial 1" );
 
//	log_out( "./485.log", szTmp );
 
		perror( "SetupSerial 1" );
		return -1;
	}
 
    //修改输出模式,原始数据输出
	bzero( &newtio, sizeof( newtio ));
	newtio.c_cflag &=~(OPOST);
 
	//屏蔽其他标志位
	newtio.c_cflag |= (CLOCAL | CREAD );
	newtio.c_cflag &= ~CSIZE;
    newtio.c_cflag |= IXON | IXOFF | IXANY;
	
    //设置数据位
	switch( nbits )
	{
	case 7:
		newtio.c_cflag |= CS7;
		break;
	case 8:
		newtio.c_cflag |= CS8;
		break;
	default:
		perror("Unsupported date bit!\n");
		return -1;
	}
	
	//设置校验位
	switch( parity )
	{
	case 'n':
	case 'N':  //无奇偶校验位
		newtio.c_cflag &= ~PARENB;
		newtio.c_iflag &= ~INPCK;
		break;
	case 'o':
	case 'O':	 //设置为奇校验
		newtio.c_cflag |= ( PARODD | PARENB );
		newtio.c_iflag |= ( INPCK | ISTRIP );
		break;
	case 'e':
	case 'E':  //设置为偶校验
		newtio.c_iflag |= ( INPCK |ISTRIP );
		newtio.c_cflag |= PARENB;
		newtio.c_cflag &= ~PARODD;
		break;
	default:
		perror("unsupported parity\n");
		return -1;
	}
 
	//设置停止位
	switch( nstop )	
	{
	case 1:	
		newtio.c_cflag &= ~CSTOPB;
		break;
	case 2:
		newtio.c_cflag |= CSTOPB;
		break;
	default :
		perror("Unsupported stop bit\n");
		return -1;
	}
 
	//设置波特率
	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;
	}
 
	//设置等待时间和最小接收字符
	newtio.c_cc[VTIME] = 0;  
	newtio.c_cc[VMIN] = 0;   
//VTIME=0,VMIN=0,不管能否读取到数据,read都会立即返回。
 
//输入模式
	newtio.c_lflag &= ~(ICANON|ECHO|ECHOE|ISIG);
//设置数据流控制
	newtio.c_iflag &= ~(IXON|IXOFF|IXANY); //使用软件流控制
//如果发生数据溢出,接收数据,但是不再读取 刷新收到的数据但是不读
	tcflush( fd, TCIFLUSH ); 
//激活配置 (将修改后的termios数据设置到串口中)
	if( tcsetattr( fd, TCSANOW, &newtio ) != 0 )
	{
	sprintf( szTmp, "serial set error!\n" );
 
//	log_out( "./485.log", szTmp );
		perror( "serial set error!" );
		return -1;
	}
 
//	log_out( "./485.log", "serial set ok!\n" );
	return 1;
}

int UART0_Open(char* port)
{
        int fd;
      fd = open( port, O_RDWR|O_NOCTTY|O_NDELAY);
      if (fd<=0)
             {
                    perror("Can't Open Serial Port");
                    return(-1);
             }
  //判断串口的状态是否为阻塞状态                            
  if(fcntl(fd, F_SETFL, 0) < 0)
      {
             printf("fcntl failed!/n");
           return(-1);
      }     
  else
  {
       printf("fcntl=%d/n",fcntl(fd, F_SETFL,0));
  }
  //测试是否为终端设备    
  if(0 == isatty(STDIN_FILENO))
      {
             printf("standard input is not a terminal device/n");
        return(-1);
      }
  else
      {
           printf("isatty success!/n");
      }       
  printf("fd->open=%d/n",fd);
  return fd;
}

int main(int argc,char *argv[])
{
 int fd;
 int nread;
 int i;
 char read_buf[128];
 char write_buf[] = "123456"; 
 fd = fd = open("/dev/ttyS4",O_RDWR);//打开RS485串行线 
 if(fd<0)
 {
  printf("open serial error\n");
  return -1;
 }
    set_com_opt(fd,115200,8,'n',1);
// set_speed(fd,115200);
 struct serial_rs485 rs485conf={0};
 
 
 //ioctl(fd,TIOCGRS485,&rs485conf);

 
 //485控制信号 
 rs485conf.flags |= SER_RS485_ENABLED; //485使能
 
 rs485conf.flags |=SER_RS485_RTS_ON_SEND; //RTS = 1 发送
 rs485conf.flags |=SER_RS485_RTS_AFTER_SEND; //发完包数据后,将RTS拉到1
// rs485conf.flags |=SER_RS485_RX_DURING_TX;
 
 if(ioctl(fd, TIOCSRS485, &rs485conf)) //设置RS485参数
 {
  printf("set rs485 param error\n");
  printf("%d\n",errno);
  close(fd);
  return -1;
 }
#if 0
	write(fd,"111111\n",7);
#else 

 while(1){
 /* if new data is available on the serial port, read and print it out */
//    write(fd,"111111\n",7);
 nread = read(fd ,read_buf ,sizeof(read_buf));
 //write(fd,"qweras",6);
 if (nread > 0){
    printf("RECV[%3d]: ", nread);
    printf("read data = %s\n",read_buf);
    write(fd,read_buf,nread);
    }
 tcflush(fd,TCIOFLUSH);
 }
#endif
 close(fd);
 return 0; 
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我可以为您提供一些关于频谱仪自动化测试开发Demo的建议。 首先,您需要确定您要测试的频谱仪的型号和通信协议。不同型号的频谱仪可能会有不同的通信协议,因此您需要先了解一下您要测试的频谱仪的通信协议。 在了解了通信协议之后,您可以使用 C# 编程语言来编写自动化测试程序。具体来说,您需要使用 C# 的串口通信库来与频谱仪进行通信。您可以在程序中发送测试命令,并读取频谱仪返回的测试结果。在读取测试结果之后,您可以对测试结果进行分析和处理,以便进行后续的数据处理和分析。 在编写自动化测试程序时,您需要考虑以下几个方面: 1. 测试命令的设计:您需要根据频谱仪的通信协议,设计相应的测试命令,以便测试频谱仪的各项功能。 2. 数据的处理和分析:您需要对测试结果进行分析和处理,以便进行后续的数据处理和分析。您可以使用 C# 中的图形库来绘制测试结果的图像,或者将测试结果保存到文件中以便后续的数据处理和分析。 3. 异常处理:在测试过程中,可能会出现一些异常情况,例如通信中断、测试命令无法执行等等。您需要在程序中加入相应的异常处理代码,以确保测试程序的稳定性和可靠性。 4. 用户界面的设计:您可以使用 C# 中的用户界面库来设计一个简单的用户界面,以便用户可以方便地进行测试操作。 如果您需要更详细的信息,可以参考一些相关的 C# 自动化测试开发教程和文档。希望这能对您有所帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值