📄 radio2.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 + -