⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test_serial.c

📁 cpc-1631的BSP包for VxWorks操作系统
💻 C
字号:
/* 
*vxworks 串口测试 
*
* zjx at evoc 2007.5.17
*
*使用方法:
*		1. comrecv  ttynum,rate    (ttynum表示接收串口号,rate表示波特率)
*		2. comsend  ttynum,rate,num  (ttynum表示发送串口号,
*                                                      rate表示波特率,
*							           num表示发送字符串的次数)
*		3. 接收端串口收到字符后会保存到serial_result.c 文件中,调用
*             comchk 命令,可以查看收到字符串的次数。对比发送
*             字符串的次数就可以观察串口是否正常。
*
*note: 
*       实现了两种访问串口的方式
*        1, 不通过驱动,直接IO访问
*        2, read/write 方式。
*/

#include "vxworks.h"
#include "stdio.h"
#include "taskLib.h"
#include "ioLib.h"

#include <end.h>
#include <in.h>
#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <semLib.h>
#include <sigLib.h>


#define inportb sysInByte
#define outportb sysOutByte

int COM_PORT[4] =  {0xfe000000+0x3f8,0xfe000000+0x2f8,0xfc000000+0x4500,0xfc000000+0x4600};

char buf_send[]="abcdefghijklmnopqrstuvwxyz"; 

int comsend(int ttynum,int rate, int num);
void comsendTask(int ttynum,int rate, int num);
int comsendio(int ttynum,int rate, int num);
void comsendchar(int ttynum,char c);
int comrec(int ttynum, int rate);
int comrecio(int ttynum, int rate);
int comchk(void);

/*串口发送*/
int comsend(int ttynum, int rate, int num)
{
    int fd;
    int bytes_out;
	char fd_str[8]={0};
	char buffer[40] = {0};
	int  numSend = 1;
	
	assert((num>0)&&(ttynum>0)&&(rate>0));
	if(num > 10000000)
	{
	    printf("Number is too big! <10000000 !\r\n");
		return ERROR;
	}
	
	sprintf(fd_str,"/tyCo/%d", ttynum-1);
	fd = open(fd_str,O_RDWR,0);

    ioctl(fd,FIOSETOPTIONS,OPT_RAW);             /* 设置串口的数据模式  */
    ioctl(fd,FIOBAUDRATE,rate);                  /*设置串口 的波特率*/

    printf("The send string is \"%s\" \r\n",buf_send);

    FOREVER
    {
    	sprintf(buffer, "[%s(%d)]", buf_send, numSend);
		bytes_out = write(fd, buffer, strlen(buffer));   /* 往串口写入一个字符串*/
		printf("\r%d", numSend);

		numSend++;
		if(numSend>num)
		{
			break;
		}
		#if 1
		taskDelay(5);
		#endif
    }
	
    /*关闭串口1 */
    close(fd);
	
    return OK;
}     

/* 读写文件方式*/
int comrec(int ttynum, int rate)
{
    int fd,fd1;
  	int bytes_in,bytes_write;
    char buf[40];
	char fd_str[8];

	assert((ttynum>0)&&(rate>0));

	memset(buf, 0 , 40*sizeof(char));
	memset(buf, 0 , 8*sizeof(char));

	fd1 = creat("serial_result.txt", O_RDWR);
    if(fd1<0)
    {
    	printf("creat fd1 failded!\r\n");
		return ERROR;
    }
	
	sprintf(fd_str,"/tyCo/%d", ttynum-1);
	fd=open(fd_str,O_RDWR,0);
	
	ioctl(fd,FIOSETOPTIONS,OPT_RAW);   /* 设置串口的数据模式  */
	ioctl(fd,FIOBAUDRATE,rate);        /*设置串口 的波特率*/
	
	for(;;)
    {
	    memset(buf, 0 , 40*sizeof(char));
		/* 读串口*/	
		bytes_in=read(fd, buf, sizeof(buf_send)); 
		
		/* 把结果存入文件中*/
		bytes_write = write(fd1,buf,strlen(buf));
		if(bytes_write<0)
		{
			printf("write data error \n");
			return ERROR;
		}
    }

	close(fd);
	close(fd1);
	
	return OK;
}

/*串口发送*/
void comsendTask(int ttynum,int rate, int num)
{
     int taskID;
	
    taskID=taskNameToId("sendTask");
	
	if(taskID>0)
	{
	    /* 把访问方式改为中断方式*/
        outportb(COM_PORT[ttynum-1]+1,0x01);	
		
	    taskDelete(taskID);
	}

	/* 创建发送任务*/
	taskSpawn("sendTask",255,0,4000,(FUNCPTR)comsend,ttynum,rate,num,0,0,0,0,0,0,0);
}

/*串口接收*/
void comrecv(int ttynum,int rate)
{
     int taskID;
	
    taskID=taskNameToId("comRecvTask");
	
	if(taskID>0)
	{
	    /* 把访问方式改为中断方式*/
        outportb(COM_PORT[ttynum-1]+1,0x01);	
		
	    taskDelete(taskID);
	}

	/* 创建接收任务*/
	taskSpawn("comRecvTask",254,0,4000,(FUNCPTR)comrec,ttynum,rate,0,0,0,0,0,0,0,0);
}

/* 发送一个字符*/
void comsendchar(int ttynum, char c)
{
	if(((unsigned char )inportb(COM_PORT[ttynum-1]+5) & 0x20)!= 0)
	{
		outportb(COM_PORT[ttynum-1], c);
	}
	
	taskDelay(1);
}

/* 访问寄存器方式*/
int comsendio(int ttynum,int rate,int count)
{
    int i,j;
	char countBuffer[10] = {0};
	unsigned char c;
	
	assert((ttynum>0)&&(count>0)&&(rate>0)); 

    switch(rate)  
    {  
    	case   2400:    c=0x30;break;
		case   4800:    c=0x18;break;
        case   9600:    c=0x0c;break; 
		case   19200:   c=0x06;break;
        case   28800:   c=0x04;break; 
		case   38400:   c=0x03;break;
        case   57600:   c=0x02;break;  
        case   115200:  c=0x01;break; 

        default:  
             printf("Set  comm   bps   fail!");  
			 return  ERROR;  
    }  
	 
	outportb(COM_PORT[ttynum-1]+3,0x80);	/* DLAB="1", set baud*/
	outportb(COM_PORT[ttynum-1],c); 	    /* 波特率 0x30:2400 0x18:4800 
												    0x0c:9600 0x01:115200*/
    outportb(COM_PORT[ttynum-1]+1,0x00);
    outportb(COM_PORT[ttynum-1]+3,0x03);	/* data length: 8 , stop bits: 1*/
	outportb(COM_PORT[ttynum-1]+4,0x0b);
    outportb(COM_PORT[ttynum-1]+1,0x01);	/* receive interrupt enable*/
	inportb(COM_PORT[ttynum-1]);
	
	for(i=0; i<count; i++)
	{
		/*以轮询的方式访问*/
		outportb(COM_PORT[ttynum-1]+1,0);	

		/* 发送字符串,格式为[abedefghijklmnopqrstuvwxyz(12323)] */
		comsendchar(ttynum, '[');
		for(j=0; j<26; j++)
		{
			comsendchar(ttynum,buf_send[j]);	
		}

		
		comsendchar(ttynum, '(');
		/* 发送计数值*/
		sprintf(countBuffer, "%d", i+1);
		for(j=0; j < strlen(countBuffer); j++)
		{ 
			comsendchar(ttynum, countBuffer[j]);
		}

		comsendchar(ttynum, ')');
		comsendchar(ttynum, ']');
		
		printf("\r%d", i+1);
		
	}	

	/* 把访问方式改为中断方式*/
    outportb(COM_PORT[ttynum-1]+1,0x01);	
		
	return OK;
}

/* 访问寄存器方式*/
int comrecio(int ttynum, int rate)
{
	int fd1,bytes_write;
	unsigned char c;
	char buf[30];
	
	assert((ttynum>0)&&(rate>0));
	
	fd1 = creat("serial_result.txt", O_RDWR);
    if(fd1<0)
    {
    	printf("creat fd1 failded!\r\n");
		return ERROR;
    }
	
    switch(rate)  
    {  
    	case   2400:    c=0x30;break;
		case   4800:    c=0x18;break;
        case   9600:    c=0x0c;break; 
		case   19200:   c=0x06;break;
        case   28800:   c=0x04;break; 
		case   38400:   c=0x03;break;
        case   57600:   c=0x02;break;  
        case   115200:  c=0x01;break; 

        default:  
             printf("Set  comm   bps   fail!");  
			 return  ERROR;  
    } 

	outportb(COM_PORT[ttynum-1]+3,0x80);   /* DLAB="1", set baud*/
    outportb(COM_PORT[ttynum-1],c);        /*设置 波特率 0x30:2400 0x18:4800 0x0c:9600*/
    outportb(COM_PORT[ttynum-1]+1,0x00);
    outportb(COM_PORT[ttynum-1]+3,0x03);   /* data length: 8 , stop bits: 1*/
    outportb(COM_PORT[ttynum-1]+4,0x0b);
    outportb(COM_PORT[ttynum-1]+1,0x01);   /* receive interrupt enable*/
    inportb(COM_PORT[ttynum-1]);

	FOREVER
    {
    	memset(buf, 0 , 30*sizeof(char));
	    /* 以轮询的方式访问*/
	    outportb(COM_PORT[ttynum-1]+1,0);
		
		/* 读串口*/	
	    if(((unsigned char )inportb(COM_PORT[ttynum-1]+5) & 0x01)!= 0)
        {
       		sprintf(buf,"%c", inportb(COM_PORT[ttynum-1]));
		}

		/* 把结果存入文件中*/		
		bytes_write = write(fd1,buf,strlen(buf));
		if(bytes_write<0)
		{
			printf("write data error \n");
			return ERROR;
		}
    }

	close(fd1);
	return OK;
}

/*串口接收*/
void comrecvio(int ttynum,int rate)
{
     int taskID;
	
    taskID=taskNameToId("comRecvTask");
	
	if(taskID>0)
	{
		/* 把访问方式改为中断方式*/
        outportb(COM_PORT[ttynum-1]+1,1);	

		taskDelete(taskID);
	}

	/* 创建接收任务*/
	taskSpawn("comRecvTask",254,0,4000,(FUNCPTR)comrecio,ttynum,rate,0,0,0,0,0,0,0,0);
}

/* 检查串口收到的字符串的条数*/
int comchk(void)
{
	FILE *fd = NULL;
	char buffer[40] = {0};
	char buffer1[40] = {0};
	int len = 0;
	int count = 0;

	fd = fopen("serial_result.txt", "r");
	if(fd<0)
	{
		printf("opent file error!\r\n");
		return ERROR;
	}

	while(!feof(fd))
	{
		memset(buffer1, 0 ,sizeof(buffer1));
	    sprintf(buffer1,"[%s(%d)]", buf_send, count+1);
		
		memset(buffer, 0 ,sizeof(buffer));
		fread(buffer, strlen(buffer1), 1, fd);
		if(0 == memcmp(buffer, buffer1, strlen(buffer)))
		{
			count++;
		}
	}

	if(count < 1 )
	{
	    printf("The number of received strings is 0 \r\n");
	    return ERROR;
	}
	else
	{
	    printf("The number of received strings is %d\r\n", count-1);
	}
	fclose(fd);
	
	return OK;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -