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

📄 first.cpp

📁 串口与RS485仪表的通讯
💻 CPP
字号:
#include <iostream>  
#include <string>  
#include <windows.h>
#include <stdio.h> 
#include <winnt.h>
using namespace std; 

 
void main(int argc,char* argv[])    
{ 
 ////////// CREATE COM HANDLE
 HANDLE hComm;
 hComm=CreateFile("COM1",GENERIC_READ | GENERIC_WRITE,0,NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,NULL);
 if(hComm!=INVALID_HANDLE_VALUE)
	{
		SetupComm( hComm, 4096, 4096 );
		DCB dcb;
		GetCommState( hComm, &dcb );
		dcb.BaudRate=CBR_9600;
		dcb.ByteSize=8;
		dcb.StopBits=TWOSTOPBITS;
		dcb.Parity=NOPARITY;     //////////////////////////////////////???????
		dcb.fBinary=1;
		if(SetCommState(hComm, &dcb )) 
		printf("开启串口并初始化成功\n\n");
	}
 else
	{
		printf("创建串口失败");
	};

 ///////////Initialcom

 SetCommMask( hComm, EV_RXFLAG);
 PurgeComm(hComm,PURGE_TXCLEAR);
 PurgeComm(hComm,PURGE_RXCLEAR);
 COMMTIMEOUTS CommTimeOuts;
    CommTimeOuts.ReadIntervalTimeout = 0xFFFFFFFF ;
    CommTimeOuts.ReadTotalTimeoutMultiplier = 0 ;
    CommTimeOuts.ReadTotalTimeoutConstant = 0 ;
    CommTimeOuts.WriteTotalTimeoutMultiplier =0;
    CommTimeOuts.WriteTotalTimeoutConstant =5000;
    SetCommTimeouts( hComm, &CommTimeOuts ) ;

 ///////////////////////////////////////////////////////////send message

 int nLen1=7;
 byte *Sendbuf = new byte[nLen1+1];
 DWORD nSEND=0;
 LPDWORD nSend=&nSEND;
 /////////////////////读流量顺时值:
 *Sendbuf=0x11; 
 *(Sendbuf+1)=0x30;
 *(Sendbuf+2)=0x30;
 *(Sendbuf+3)=0x31;
 *(Sendbuf+4)=0x30;
 *(Sendbuf+5)=0x31;
 *(Sendbuf+6)=0x03;
 *(Sendbuf+7)=0x03;

//////////////////////////////读参数
/*
 *Sendbuf=0x12; 
 *(Sendbuf+1)=0x30;
 *(Sendbuf+2)=0x30;
 *(Sendbuf+3)=0x31;
 *(Sendbuf+4)=0x30;
 *(Sendbuf+5)=0x31;
 *(Sendbuf+6)=0x1F;
 *(Sendbuf+7)=0x30;
 *(Sendbuf+8)=0x31;
 *(Sendbuf+9)=0x03;
 //*/
////////////////////////////concent of message
 printf("欲发送的数据:");
 int i;
 for(i=0;i<=nLen1;i++)
	{
		printf("%c",*(Sendbuf+i));
	}; 
	printf("\n\n");
 /////////////////////////////////////////////////////////////
  if(!WriteFile(hComm, Sendbuf, nLen1, nSend,NULL))
	{
		delete[] Sendbuf;
		Sendbuf = NULL;
		printf("数据发送失败\n");
	}
 printf("实际发送的数据:\n");
 int j;
 for(j=0;j<nLen1;j++)
 {
	 if(j==0)
	    printf("\n读瞬时值命令符:");
	 if(j==1)
		printf("\n从机地址码:");
	 if(j==4)
		printf("\n通道号:");
	 if(j==6)
		 printf("\n主机命令结束符:");
	printf("%c",*(Sendbuf+j));
 }; 
 printf("\n\n");

 delete[] Sendbuf;
 Sendbuf = NULL;
 printf("数据发送成功\n");
 printf("期望数目:%d\t\t实际发送数目:%d\n",nLen1,*nSend);


 //////////////////////////////////////////////////////////recieve message

  Sleep(100);

  int nLen2=50;
  char cTemp[512];
  /*
  DWORD nRead=0;
  LPDWORD nByteRead=&nRead;
  */ 
  ULONG nByteRead;
  memset(cTemp,0,sizeof(cTemp)); 

  bool bReadSuc=ReadFile(hComm,cTemp,nLen2,&nByteRead,NULL);
  if ( bReadSuc && nByteRead>0 ) 
	{	
			printf("\n读入数据成功\n");			
			printf("期望数目:%d\t\t实际接收数目:%d\n\n",nLen2,nByteRead);
			printf("读入的数据值:");
			int j;
            for(j=0;j<=nByteRead;j++)
			{
				printf("%c",cTemp[j]);
			}; 
	        printf("\n\n");
		
  }
  else 
  {
	  printf("\n读入数据失败\n");
  };
///////////////////////


 for(i=0,j=0;i<nByteRead;i++)
	 {
		 if(cTemp[i]<'0')
		 {
			 switch(cTemp[i])
			 {
			 case 0x02 : printf("从机地址码及通道号:");break;
			 case 0x1f : 
				 {
					 j++;
					 if(j==1)
					 printf("\n表型字:");
					 if(j==2)
					 printf("\n瞬时值:");
					 if(j==3)
					 printf("\n报警状态:");
					 if(j==4)
					 printf("\n校验和:");
					 break;
				 }
			 
			 case 0x2d : printf("-");break;
			 case 0x2e : printf(".");break;
			 case 0x17 : printf("\n结束");break;
			 };
		 }
		 else 
		 {
			 printf("%c",cTemp[i]);
		 };
	 };
  	 printf("\n\n");

///////////////////////////
 FILE *fp;
  if(fp=fopen("c:\\data.txt","wt+"))
  {
	  char data[7];
	  memset(data,0,sizeof(data));
	  for(int k=10;k<=16;k++)
	  {
		  if(cTemp[k]==0x1F)
			  break;
		  data[k-10]=cTemp[k];
		  printf("%c",data[k-10]);
	  };

	  fputs(data,fp);
	  printf("数据归档成功\n\n");
	  
  }
    
  else 
  {
	  printf("数据存入文件保存失败");
  };
  fclose(fp);


  /////////////////////////////////////////////////////////close com
 if(hComm !=0)
	{
		CloseHandle(hComm);
	};


} 


⌨️ 快捷键说明

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