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

📄 mainproc.c

📁 linux serial example
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "common.h"#include "PublishCard.c"void ACK(int comPort){ WriteBuffer[0]=0xaa; WriteBuffer[1]=0xdd; WriteToComm(comPort,2);}void NAK(int comPort){ WriteBuffer[0]=0xaa; WriteBuffer[1]=0xee; WriteToComm(comPort,2);}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; };}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(HS0,&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;*/  DeviceMax=HS1;  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;  printf("Listen a Request\n");/*  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(HS0,&DeviceRead))  {   printf("COM1 Request\n");   mTerminalControl();  }  if(FD_ISSET(HS1,&DeviceRead))  {   printf("COM2 Request\n");  // rel=ReadFromComm(HS1,0);  }  if(FD_ISSET(HS2,&DeviceRead))  {   printf("COM3 Request\n");   rel=ReadFromComm(HS2,0);   if(rel>=0)    ExecMAPCFunc(Command,HS2,rel);  }  if(FD_ISSET(HS4,&DeviceRead))  {   printf("COM5 Request\n");   rel=ReadFromComm(HS4,0);   if(rel>=0)    ExecMAPCFunc(Command,HS4,rel);  }  if(FD_ISSET(HS5,&DeviceRead))  {   printf("COM6 Request\n");//   if(inBusy==0x55aa)continue;   rel=ReadFromComm(HS5,0);   if(rel>=0)    ExecIOCOFunc(Command);  } };}void PrintToNetwork(unsigned char *buff){ int i,l; l=strlen(buff); printf("%s\r",buff);}//---------------------------------------------------------------------------// 初始化并打开设备// 如果设备打开出错,返回 -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,p; unsigned char buf[256],cht; cht=0; RDataLength=0; i=0; p=0; rel=0; for(;;) {  //delay(1000);  pcbRead=read(comPort,&buf,GetCommDataLength(comPort));  if(pcbRead<=0)  {   if(p<200)   {    p++;    continue;   }   else    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); //读回数据后,判断设备类型  Result=CanverBSYNToContent(comPort); if(Result==0xaadd)return -1; else if(Result==0xccee)return -3; if(comPort!=HS5) {  if(GET_RTS(comPort)==1)return 0;  else return 1; } else {  cht=*(unsigned char*)COM5_MCR;  cht=cht<<6;  if((cht & 0xc0)==0xc0) //串口5设备A   return 0;  else if((cht & 0xc0)==0x40)   return 1;  else if((cht & 0xc0)==0x80)   return 2;  else if((cht & 0xc0)==0x00)   return 3; }}int ReadFromComm6003(int comPort,int Length){ int pcbRead,i,rel; unsigned char buf[256]; RDataLength=0; i=0; for(;;) {  pcbRead=read(comPort,&buf,256);  if(pcbRead<=0)  {   if(i<200)   {    i++;    continue;   }   return -1;  }  for(i=0;i<pcbRead;i++)   ReadBuffer[RDataLength++]=buf[i];  if(RDataLength+pcbRead-3>=ReadBuffer[1])   break; } tcflush(comPort, TCIFLUSH); if(GET_RTS(comPort)==1) {  Canver6003ToContent(HS3);  } else                   //串口3设备B {  Canver6003ToContent(HS3); }}int WriteToComm(int comPort,int Length){  return write(comPort,WriteBuffer,Length);}//-----------------------------------------------------------------------------// 将数据转换成BSYN格式的数据,准备向串口发送int CanverContentToBSYN(int comPort){ int i,p; unsigned char ch,chk; p=0; chk=0xaa^0xbb^Command; WriteBuffer[p++]=0xaa; WriteBuffer[p++]=0xbb; WriteBuffer[p++]=Command; for(i=0;i<DataLength;i++) {  ch=DataBuffer[i];  chk=chk^ch;  if(ch==0xaa)  {   WriteBuffer[p++]=ch;   WriteBuffer[p++]=ch;   chk=chk^ch;   continue;  }  else WriteBuffer[p++]=ch; } WriteBuffer[p++]=0xaa; WriteBuffer[p++]=0xcc; chk=chk^0xaa^0xcc; WriteBuffer[p++]=chk; WDataLength=p;#ifdef __DEBUG__ printf("Send To Comm:\n"); for(i=0;i<WDataLength;i++)  printf("%x ",WriteBuffer[i]); printf("\nSend END\n");#endif}//----------------------------------------------------------------------------// 将数据转换成6003格式的数据,准备向串口发送int CanverContentTo6003(int comPort){ unsigned char CheckCode; int i; WDataLength=0; WriteBuffer[WDataLength++]=P6003H; WriteBuffer[WDataLength++]=DataLength+1; WriteBuffer[WDataLength++]=Command; CheckCode=WriteBuffer[0]^WriteBuffer[1]^WriteBuffer[2]; if(DataLength>1) {  for(i=0;i<DataLength;i++)  {   WriteBuffer[WDataLength++]=DataBuffer[i];   CheckCode=CheckCode^WriteBuffer[i+3];  } } WriteBuffer[WDataLength++]=CheckCode; WriteBuffer[WDataLength++]=P6003E;#ifdef __DEBUG__ printf("Send To 6003 Content\n"); for(i=0;i<WDataLength;i++)  printf("%x ",WriteBuffer[i]); printf("\n");#endif}//-----------------------------------------------------------------------// 将接收到的BSYN格式的数据转换成普通数据格式// 函数执行正确,返回0 将接收的数据存放在DataBuffer中// 如果包头错误  反回 0xaadd 这是一条正应答// 如果包尾错误  返回 0xaaee 这是一条负应答// 如果校验值错误返回 0xccee 收到的数据校验和错误,但数据已经放在DataBuffer中

⌨️ 快捷键说明

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