📄 old_common.c~
字号:
#include "old_common.h"void SetDebug(unsigned char Debug){ DEBUG=Debug;}int GetCommDataLength(int Device_Handle){ int pcbLength; pcbLength=0; ioctl(Device_Handle,FIONREAD,&pcbLength); return pcbLength;}int AutoDetect(int Device_Handle){ int r,l; r=0; for(;;) { l=0; l=GetCommDataLength(Device_Handle); if(l==0) { if(r<50000)r++; else return 0; } else return l; }}//3妙int ShortBlockDetect(int Device_Handle){ int r,l; r=0; for(;;) { l=0; l=GetCommDataLength(Device_Handle); if(l==0) { if(r<25000)r++; else return 0; } else return l; }}void delay(unsigned long dly){ while(dly!=0) { dly-=1; dly+=1; dly-=1; dly+=1; dly-=1; dly+=1; dly-=1; };}unsigned int FormatIntToInter(unsigned int arg){ CharToInt ctis,ctid; CharToLong ctl; ctis.i=arg; ctid.ch2.by0=ctis.ch2.by1; ctid.ch2.by1=ctis.ch2.by0; return ctid.i>>16;}unsigned int FormatIntToInter2(unsigned int arg){ CharToInt ctis,ctid; CharToLong ctl; ctis.i=arg; ctid.ch2.by0=ctis.ch2.by0; ctid.ch2.by1=ctis.ch2.by1; return ctid.i>>16;}unsigned int FormatInterToInt(unsigned int arg){ CharToInt ctis,ctid; CharToLong ctl; ctis.i=arg<<16; ctid.ch2.by0=ctis.ch2.by1; ctid.ch2.by1=ctis.ch2.by0; return ctid.i & 0xffff0000;}unsigned int FormatInterToInt2(unsigned int arg){ CharToInt ctis,ctid; CharToLong ctl; ctis.i=arg<<16; ctid.ch2.by0=ctis.ch2.by0; ctid.ch2.by1=ctis.ch2.by1; return ctid.i & 0xffff0000;}unsigned char FormatCharToInter(unsigned char arg){ byte_bit bs,bd; bs.ch=arg; bd.bits.b7=bs.bits.b0; bd.bits.b6=bs.bits.b1; bd.bits.b5=bs.bits.b2; bd.bits.b4=bs.bits.b3; bd.bits.b3=bs.bits.b4; bd.bits.b2=bs.bits.b5; bd.bits.b1=bs.bits.b6; bd.bits.b0=bs.bits.b7; return bd.ch;}void ListenAllDeviceOnRead_Error(){ int rel; fd_set DeviceRead; //设备读准备就绪; fd_set DeviceError; // 设备出现错误 int DeviceMax; for(;;) { DeviceMax=0; FD_ZERO(&DeviceRead); FD_ZERO(&DeviceError); FD_SET(ListenPort,&DeviceRead); FD_SET(HS1,&DeviceRead); FD_SET(HS2,&DeviceRead); FD_SET(HS4,&DeviceRead); FD_SET(HS5,&DeviceRead); if(SocketConnect.Socket_Handle!=-1) { FD_SET(SocketConnect.Socket_Handle,&DeviceRead); FD_SET(SocketConnect.Socket_Handle,&DeviceError); DeviceMax=SocketConnect.Socket_Handle; } if(DeviceMax<ListenPort)DeviceMax=ListenPort;// if(HS1>DeviceMax)DeviceMax=HS1;// if(HS2>DeviceMax)DeviceMax=HS2;// if(HS4>DeviceMax)DeviceMax=HS4;// if(HS5>DeviceMax)DeviceMax=HS5; rel=select(DeviceMax+1,&DeviceRead,NULL,NULL,NULL); if(rel<=0)continue; if(FD_ISSET(ListenPort,&DeviceRead)) { if(SocketConnect.Socket_Handle==-1) rel=ListenProcess(); } if(SocketConnect.Socket_Handle!=-1) { if(FD_ISSET(SocketConnect.Socket_Handle,&DeviceRead)) { rel=recv(SocketConnect.Socket_Handle,&SocketCommand,SocketReadLength,0); if(rel<=0) continue; else ProcessReceive(SocketConnect.Socket_Handle); } }/* if(FD_ISSET(HS1,&DeviceRead)) { ReadFromComm(HS1,GetCommDataLength(HS1)); } if(FD_ISSET(HS2,&DeviceRead)) { ReadFromComm(HS2,GetCommDataLength(HS2)); } if(FD_ISSET(HS4,&DeviceRead)) { ReadFromComm(HS4,GetCommDataLength(HS4)); } if(FD_ISSET(HS5,&DeviceRead)) { ReadFromComm(HS5,GetCommDataLength(HS5)); }*//* if(SocketConnect.Socket_Handle!=-1) { if(FD_ISSET(SocketConnect.Socket_Handle,&DeviceError)) { SocketConnect.Socket_Handle=-1; printf("Socket Error... Disconnect the Client"); } }*/ };}int CreateSocket(){ ListenPort=socket(AF_INET,SOCK_STREAM,0); if(ListenPort==-1)return -1; Listen_Addr.sin_family=AF_INET; Listen_Addr.sin_port=htons(LISTENPORT); Listen_Addr.sin_addr.s_addr=INADDR_ANY;//htonl(INADDR_ANY); bzero(&Listen_Addr.sin_zero,8); if(bind(ListenPort,(struct sockaddr*)&Listen_Addr,sizeof(struct sockaddr))==-1)return -2; if(listen(ListenPort,MAXCONNECTED)==-1)return -3; fcntl(ListenPort,F_SETFL,O_NONBLOCK); return 0;}int ListenProcess(){ int Size; Size=sizeof(struct sockaddr_in);// SocketConnect.Socket_Handle==-1) SocketConnect.Socket_Handle=accept(ListenPort,(struct sockaddr*)&SocketConnect.Socket_Info,(socklen_t*)&Size); if(SocketConnect.Socket_Handle==-1)return -1; printf("\na Client Connect to the Server Client Connect Count is:%i,Address is:%s\n",Connects,inet_ntop(SocketConnect.Socket_Info.sin_addr)); printf("欢迎你,你今天是:%i-%i-%i 星期:%s 现在时间:%i:%i:%i",2003,12,31,"三",9,18,34); fcntl(SocketConnect.Socket_Handle,F_SETFL,O_NONBLOCK); send(SocketConnect.Socket_Handle,"--欢迎你,你今天是: 星期: 现在时间:--",38,0); return 0;}int ProcessReceive(int Socket_Handle){ int i,p; char buf[128]; CharToInt cti; CharToLong ctl; SocketCommand.Command=FormatIntToInter(SocketCommand.Command); printf("Command is:0x%x",SocketCommand.Command); PrintToNetwork("Hello\n"); switch(SocketCommand.Command) { case 0xe003:exit(0); case 0xe001: BEGIN// PrintToNetwork("250 连接将要被关闭\n"); close(SocketConnect.Socket_Handle); SocketConnect.Socket_Handle=-1; END case 0xf710: BEGIN DEBUG=FormatIntToInter(SocketCommand.Content); PrintToNetwork("250 调试状态设置成功\n"); END case 0xf724: BEGIN WMode=0x55; PrintToNetwork("工作模式设置成功 不使用车辆检测器\n"); END case 0xf725: BEGIN WMode=0x50; PrintToNetwork("工作模式设置成功 使用车辆检测器\n"); END case 0xf726: BEGIN RWMode=0x55; PrintToNetwork("工作模式设置成功 不读写卡片\n"); END case 0xf727: BEGIN RWMode=0x50; PrintToNetwork("工作模式设置成功 读写卡片\n"); END case 0xf830: BEGIN sprintf(&buf,"400 %i号卡机剩余卡数=%i",SocketCommand.Content,PCMachine[SocketCommand.Content].CardNumber); PrintToNetwork(buf); END case 0xf840: BEGIN p=0; for(i=0;i<4;i++) { cti.i=FormatInterToInt2(PCMachine[i].CardNumber); SocketCommand.Buffer[p++]=cti.ch2.by0; SocketCommand.Buffer[p++]=cti.ch2.by1; cti.i=FormatInterToInt2(PCMachine[i].MaxCard-PCMachine[i].CardNumber-PCMachine[i].PublishNumber); SocketCommand.Buffer[p++]=cti.ch2.by0; SocketCommand.Buffer[p++]=cti.ch2.by1; ctl.l=PCMachine[i].ID; SocketCommand.Buffer[p++]=ctl.ch4.by0; SocketCommand.Buffer[p++]=ctl.ch4.by1; SocketCommand.Buffer[p++]=ctl.ch4.by2; SocketCommand.Buffer[p++]=ctl.ch4.by3; SocketCommand.Buffer[p++]=PCMachine[i].State; } SocketCommand.Command=FormatInterToInt(SocketCommand.Command); send(Socket_Handle,&SocketCommand,sizeof(SocketCommand),0); END default:PrintToNetwork("300 错误的命令\n"); }}void PrintToNetwork(unsigned char *buff){ int i,l; l=strlen(buff); printf(buff); bzero(&SocketCommand,sizeof(SocketCommand)); SocketCommand.Command=0x0011; for(i=0;i<l;i++) SocketCommand.Buffer[i]=buff[i]; if(SocketConnect.Socket_Handle!=-1) send(SocketConnect.Socket_Handle,&SocketCommand,sizeof(SocketCommand),0);}//---------------------------------------------------------------------------// 初始化并打开设备// 如果设备打开出错,返回 -1int InitilizeComm(int comPort,int Baud,int DataLength,int StopLength,int Partery){ int fd; struct termios COMOption; //打开设备 //bzero(COMOption sizeof(struct termios)); switch(comPort) { case 0:HS0=open("/dev/ttyS0",O_RDWR | O_NOCTTY);fd=HS0;break; case 1:HS1=open("/dev/ttyS1",O_RDWR | O_NOCTTY);fd=HS1;break; case 2:HS2=open("/dev/ttyS2",O_RDWR | O_NOCTTY);fd=HS2;break; case 3:HS3=open("/dev/ttyS3",O_RDWR | O_NOCTTY);fd=HS3;break; case 4:HS4=open("/dev/ttyS4",O_RDWR | O_NOCTTY);fd=HS4;break; case 5:HS5=open("/dev/ttyS5",O_RDWR | O_NOCTTY);fd=HS5;break; } if(fd<0)return -1; //允许接收,并设为本地模式 COMOption.c_cflag |=(CLOCAL | CREAD); //如果没有制定奇偶校验 if(Partery==-1) { COMOption.c_cflag&=~PARENB; COMOption.c_cflag&=~PARODD; } else if(Partery/2==0)//如果指定偶校验 { COMOption.c_cflag|=PARENB; COMOption.c_cflag&=~PARODD; } else //否则就是奇校验 { COMOption.c_cflag&=~PARENB; COMOption.c_cflag|=PARODD; } COMOption.c_cflag&=~CSTOPB; // COMOption.c_cflag&=~CSIZE; // if(DataLength==8)COMOption.c_cflag|=CS8; else if(DataLength==7)COMOption.c_cflag|=CS7; else COMOption.c_cflag|=CS8; switch(Baud) { case 1200:cfsetispeed(&COMOption,B1200);cfsetospeed(&COMOption,B1200);break; case 2400:cfsetispeed(&COMOption,B2400);cfsetospeed(&COMOption,B2400);break; case 4800:cfsetispeed(&COMOption,B4800);cfsetospeed(&COMOption,B4800);break; case 9600:cfsetispeed(&COMOption,B9600);cfsetospeed(&COMOption,B9600);break; case 19200:cfsetispeed(&COMOption,B19200);cfsetospeed(&COMOption,B19200);break; case 38400:cfsetispeed(&COMOption,B38400);cfsetospeed(&COMOption,B38400);break; case 57600:cfsetispeed(&COMOption,B57600);cfsetospeed(&COMOption,B57600);break; default:cfsetispeed(&COMOption,B9600);cfsetospeed(&COMOption,B9600);break; } tcflush(fd, TCIFLUSH); tcsetattr(fd,TCSANOW,&COMOption); fcntl(fd,F_SETFL,O_NONBLOCK); CLR_DTR(fd); CLR_RTS(fd); printf("COM%i 初始化完成 波特率 :%i,该设备未发现错误\n",comPort,Baud); return 0;}int ReadFromComm(int comPort,int Length){ int pcbRead,i,rel; unsigned char chh; unsigned char cht,tmp,buf[256]; cht=0; RDataLength=0; i=0; chh=0; for(;;) { pcbRead=read(comPort,&buf,256); if(pcbRead<=0) { if(i<200) { i++; continue; } break; } else if(buf[pcbRead-3]==0xaa && buf[pcbRead-2]==0xcc) { for(i=0;i<pcbRead;i++) ReadBuffer[RDataLength++]=buf[i]; break; } else if(buf[pcbRead-2]==0xaa && buf[pcbRead-1]==0xdd) { for(i=0;i<pcbRead;i++) ReadBuffer[RDataLength++]=buf[i]; break; } else if(buf[pcbRead-2]==0xaa && buf[pcbRead-1]==0xee) { for(i=0;i<pcbRead;i++) ReadBuffer[RDataLength++]=buf[i]; break; } else { for(i=0;i<pcbRead;i++) ReadBuffer[RDataLength++]=buf[i]; } } tcflush(comPort, TCIFLUSH); //读回数据后,判断设备类型 if(comPort==HS4) { if(GET_RTS(comPort)==1) //串口1设备A { Result=CanverBSYNToContent(HS4); switch(Result) { case -1: PrintToNetwork("300 1号卡机(上右)上发生超时错误(COM5 A)\n"); AllDevices.CurrentUpPC=1; return -1; case -2:PrintToNetwork("300 1号卡机(上右)上发生通讯错误:串行数据包头错误(COM5 A)\n");return -2; case -3:PrintToNetwork("300 1号卡机(上右)上发生通讯错误:串行数据包尾错误(COM5 A)\n");return -3; } } else //串口1设备B { Result=CanverBSYNToContent(HS4); switch(Result) { case -1:PrintToNetwork("300 2号卡机(上左)上发生超时错误(COM5 B)\n"); AllDevices.CurrentUpPC=0; return -1; case -2:PrintToNetwork("300 2号卡机(上左)上发生通讯错误:串行数据包头错误(COM5 B)\n");return -2; case -3:PrintToNetwork("300 2号卡机(上左)上发生通讯错误:串行数据包尾错误(COM5 B)\n");return -3; } } if(Command==0x00) { return NeedSwitchMAPC(DataBuffer[0],AllDevices.CurrentUpPC); } } else if(comPort==HS2) { if(GET_RTS(comPort)==1) //串口2设备A { Result=CanverBSYNToContent(HS2); switch(Result) { case -1:PrintToNetwork("300 3号卡机(下右)上发生超时错误(COM3 A)\n"); AllDevices.CurrentDownPC=3; return -1; case -2:PrintToNetwork("300 3号卡机(下右)上发生通讯错误:串行数据包头错误(COM3 A)\n");return -2; case -3:PrintToNetwork("300 3号卡机(下右)上发生通讯错误:串行数据包尾错误(COM3 A)\n");return -3; } } else //串口2设备B { Result=CanverBSYNToContent(HS2); switch(Result) { case -1:PrintToNetwork("300 4号卡机(下左)上发生超时错误(COM3 B)\n"); AllDevices.CurrentDownPC=2; return -1; case -2:PrintToNetwork("300 4号卡机(下左)上发生通讯错误:串行数据包头错误(COM3 B)\n");return -2; case -3:PrintToNetwork("300 4号卡机(下左)上发生通讯错误:串行数据包尾错误(COM3 B)\n");return -3; } } if(Command==0x00) { return NeedSwitchMAPC(DataBuffer[0],AllDevices.CurrentDownPC); } } else if(comPort==HS1) { if(GET_RTS(comPort)==1) //串口1设备A { Result=CanverBSYNToContent(HS1); switch(Result) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -