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

📄 radio2.c

📁 无线数传电台串口通信C程序源码 电台型号为深圳友迅达公司的F201/B无线数传电台
💻 C
字号:
#ifndef __SERIAL
#define	__SERIAL
#include <conio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <sys/proxy.h>                         //qnx_proxy_attach()
#include <sys/dev.h>                           //dev_arm()
#include <sys/kernel.h>                        //fork(),send()
#include <sys/sched.h>						   //setprio(),getprio()
#include <sys/irqinfo.h>					   //qnx_hint_attach()
#include <i86.h>							   //FP_SEG()
#include <signal.h>                            //kill()
#include <sys/timeb.h>						   //ftime()
#include <unistd.h>
#include <sys/name.h>                          //qnx_name_attach()                 
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "Mytype.h"
#define		REG_SER		"/glider/serial"

//typedef unsigned char BYTE;
//typedef enum 
//{
	//FALSE=0, 
	//TRUE=1
//}BOOL;

typedef struct
{
	int		fd;
	int		id;
	int		InputLen;
	int		InBuffersize;
	int		OutBuffersize;
	//int		( *InBufferCount ) ();
	int		OutBufferCount;
	int		RThreshold;
	int		SThreshold;
	char	*Portname;
	int		BaudRate;
	pid_t	DevRvepid;
	pid_t	DevRvepid_proxy;
	void	( *InterruptServer )();
	BYTE*	( *Input )();
	void	( *Output )();
	int		( *Open )();
	BOOL	( *Close)();
}SerClass;

int		OpenPort(SerClass*);
BOOL	ReleasePort(SerClass*);
BYTE	*Read_BufData(SerClass*);
int 	NuminBuffer(int);
void	Write_BufData(SerClass*,char*,int);
#endif

SerClass	SerObj1;
int NuminBuffer(int fd)
{
	return dev_ischars(fd);	
}

int OpenPort(SerClass *SerObj)
{
	BYTE outchar[100];
    BYTE DataHead[10];
    BOOL recData;
    BYTE len[10];
    int i,num;
	struct	termios termio;
	pid_t	pid,pid_rec;
    char	pszport[20];
	strcpy(pszport,"");
	strcat(pszport,SerObj->Portname);
	printf("\n%s\n",pszport);
    if((SerObj->fd=open(pszport,O_RDWR))==-1)
	{
		printf("\nSer%d->OpenPort() return ERROR!\n",SerObj->Portname);	
		return (-1);
	}
	else printf("\nSer%d->OpenPort() return OK!\n",SerObj->Portname);	
    if(tcgetattr(SerObj->fd,&termio)==-1)
	{
		printf("SerObj->Open->tcgetattr() <%s> return ERROR!\n",SerObj->Portname);
		if(close(SerObj->fd))
		{
			printf("SerObj->Open->close() <%s> return ERROR!\n",SerObj->Portname);
		}
		else printf("SerObj->Open->close() <%s> return OK!\n",SerObj->Portname);
		return (-1);
	}
	else printf("SerObj->Open->tcgetattr() <%s> return OK!\n",SerObj->Portname);
    termio.c_iflag=IGNBRK;
	termio.c_oflag=0L;
    termio.c_cflag=CS8|CLOCAL|CREAD;
	termio.c_lflag = IEXTEN;
    if(cfsetispeed(&termio,SerObj->BaudRate)==-1)//Set Input baud rate written in struct termio
	{
		printf("SerObj%d->Open->cfsetispeed() return ERROR!\n",SerObj->Portname);
		if (close(SerObj->fd))
		{
			printf("SerObj%d->Open->close() return ERROR!\n",SerObj->Portname);
		}
		else printf("SerObj->Open->close() <%s> return OK!\n",SerObj->Portname);
		return(-1);
	}
    else printf("SerObj%d->Open->cfsetispeed() return OK!\n",SerObj->Portname);
  	if(cfsetospeed(&termio,SerObj->BaudRate)==-1)//Set Output baud rate
	{
		printf("SerObj%d->Open->cfsetospeed()  return ERROR!\n",SerObj->Portname);
		if (close(SerObj->fd))
		{
			printf("SerObj%d->Open->close() return ERROR!\n",SerObj->Portname);
		
		}
		else printf("SerObj->Open->close() <%s> return OK!\n",SerObj->Portname);
		return (-1);
	}
	else printf("SerObj%d->Open->cfsetospeed()  return OK!\n",SerObj->Portname);
	if (tcsetattr(SerObj->fd,TCSANOW,&termio)==-1)//setting tell system some inf of communication.
	{ 
		printf("Ser%dOpen->tcsetattr() return ERROR!\n", SerObj ->Portname);
		if (close(SerObj ->fd))
		{
			printf("Ser%dOpen-> close() return ERROR!\n", SerObj ->Portname);
		}
		else printf("SerObj->Open->close() <%s> return OK!\n",SerObj->Portname);
		return (-1);
	}
    else printf("Ser%dOpen->tcsetattr() return OK!\n", SerObj ->Portname);
	//Creat a process
	if(((SerObj->DevRvepid)=fork())==-1)
	{
		printf("\nSer%dOpen ->fork() return Error!\n",SerObj->Portname);
		if (close(SerObj->fd))
		{
			printf("\nSer%dOpen->close() return error !\n",SerObj ->Portname);
		}
		else printf("SerObj->Open->close() <%s> return OK!\n",SerObj->Portname);
		return (-1);
	}
    else printf("\nSer%dOpen ->fork() return OK!\n",SerObj->Portname);
	if((SerObj->DevRvepid)==0)
	{
		//This is child process
		SerObj->id=qnx_name_attach(0, REG_SER);
	   	sleep(1);
        if((setprio(0,getprio(0)+2))==-1)
		{
			printf ("\nError in set priority of this child process\n");
		}
		printf ("\n Set priority of this child process is OK!\n");
		if((SerObj->DevRvepid_proxy=qnx_proxy_attach(0,0,0,-1))==-1)
		{
			printf("\nSer%d Error in child process proxy!\n",SerObj->Portname);
			if (close(SerObj->fd))
			{
				printf("\nSer%dOpen->close() return error!\n",SerObj->Portname);
			}
			else printf("\nSer%dOpen->close() return OK!\n",SerObj->Portname);
			return(-1);
		}
		else printf("\nSer%d creat child process proxy is OK!\n",SerObj->Portname);
		
		if ((tcflush(SerObj->fd,TCIOFLUSH)==-1))
		{		
			printf("\nSer%dOpen->tcflush() return error !\n",SerObj->Portname);
			if(close(SerObj->fd))
			{
				printf("\nSer%dOpen->close() return error !\n",SerObj->Portname);
			}
            else printf("\nSer%dOpen->close() return OK!\n",SerObj->Portname);
			return(-1);
		}
		else printf("\nSer%dOpen->tcflush() return OK !\n",SerObj->Portname);
		
		dev_state(SerObj->fd,0,_DEV_EVENT_INPUT);	
	    
	    recData=FALSE;
        while (1)//process receiving data
		{   
			dev_arm(SerObj->fd,SerObj->DevRvepid_proxy,_DEV_EVENT_INPUT);
			if((pid=Receive(0,0,0))==-1)
			{
				printf("\nError in received a message !\n");
			    exit (1);
			}
			if(pid==(SerObj->DevRvepid_proxy))
			{
				num=dev_ischars(SerObj->fd);	
                printf("There are %d bytes data in buffer.\n",num);
                num=dev_read(SerObj->fd,&DataHead,1,0,0,0,0,0);
                printf("read %d bytes data!\n",num);
                if(DataHead[0]=='~')
                {   
                     printf("\n receive a Data message!\n");
                     printf("\n/////////////////////////////\n");
                     //num=dev_ischars(SerObj->fd);
                     //printf("There are %d bytes data in buffer.\n",num);
                     num=dev_read(SerObj->fd,&len,3,0,0,0,0,0);
                     printf("read %d bytes data!\n",num);
					 printf("read string is %s.\n",len);
                     printf("The Data length is %d.\n",len[0]);
				     num=len[0];
                     num=dev_read(SerObj->fd,&outchar,num-3,0,0,0,0,0);
                     printf("read %d bytes data!else\n",num);
                     printf("%s",outchar);
                }
   		    }
		}//while  end
	}
	else
	{
		printf("Serial Receive process id is %d",SerObj->DevRvepid);
		return(SerObj->fd);
	}//if end	
}

BYTE* Read_BufData(SerClass *SerObj)
{
	static BYTE	temp[1];	
	dev_read(SerObj->fd,temp,1,0,0,0,0,0);
	return temp;	
}

void Write_BufData(SerClass *SerObj,BYTE *lpSendData,int Length)
{
	if(write(SerObj->fd,lpSendData,Length)!=Length)
	{	
		printf("Error in Write data!\n");
		exit(1);
	}
}

BOOL ReleasePort(SerClass *SerObj)
{
	if(close(SerObj->fd)==-1)
	{
		printf("\nError in close(SerObj->fd)!\n");
		return FALSE;
	}
	if(kill(SerObj->DevRvepid,SIGKILL)==-1)
	{
		printf("\nError in kill Serial process!\n");
		return FALSE;
	}
	return TRUE;
}

main()
{
	char   ch;
	BYTE  outputchar[]={126,1,2,7,'I','s',',','O','K','!'};
	SerObj1.BaudRate=9600;
	SerObj1.Portname="/dev/ser1";
	SerObj1.RThreshold=1;
	SerObj1.InputLen=0;
	//SerObj1.InBufferCount=NuminBuffer;
	SerObj1.Open=OpenPort;
	SerObj1.Input=Read_BufData;
	SerObj1.Output=Write_BufData;
	SerObj1.Close=ReleasePort;
    if(SerObj1.Open(&SerObj1)==-1) 
	{
		printf("\nError in open ser1\n");
	}else
	{
		printf("\nOK!\n");
	}

	ch=0;
	while(ch!=' ')
	{
		ch=getch();
		if (ch=='1')
		{
			Write_BufData(&SerObj1,outputchar,10);
		}
	}
    //Release Serial port     
	if ( SerObj1.Close ( &SerObj1 ) == FALSE)
	{
		printf("Error in release Serial port1!\n");
	}else
	{
		printf("Succeeded in release Serial port1!\n");
	}
}

⌨️ 快捷键说明

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