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

📄 recievecomm.cpp

📁 使用C开发的嵌入式平台软件源程序.有串行通讯、数据库入库等功能。
💻 CPP
📖 第 1 页 / 共 3 页
字号:
#include <afxwin.h>  
#include <Winbase.h>
#include <Winsock2.h> 
#include "stdafx.h"
#include "前置机.h"
#include "PropPage1.h"

int RecieveData22[26] = {0x01,0x01,0x01,0x03,0x01,0x02,0x53,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x0C,0x68,0x04,0x18,0x08,0x22,0x6C,0x2E};//模拟2号站自报雨量数据.
int RecieveData24[26] = {0x01,0x01,0x01,0x02,0x54,0x00,0x00,0x00,0x05,0x00,0x3C,0x2E,0x5C,0x41,0x52,0x85};//模拟2号站自报电压数据.
int intRain1 = 0; int OldRain1 = 0;

void CPropPage1::OnInitialComm(){//串行口初始化.
      m_hIDComDev = NULL; CString message1; message1 = _T("COM1:");
      m_hIDComDev = CreateFile(message1, GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);//打开串行口.
	  if (m_hIDComDev != NULL){//串行口能够打开,则进行设置.
              //AfxMessageBox(_T("COM1: Open Sucessess!!!"));
              COMMTIMEOUTS CommTimeOuts;
              CommTimeOuts.ReadTotalTimeoutMultiplier = 0;
              CommTimeOuts.ReadTotalTimeoutConstant = 500;//接收超时.500ms.
              CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
              CommTimeOuts.WriteTotalTimeoutConstant = 500;//发送超时.500ms.
              SetCommTimeouts(m_hIDComDev, &CommTimeOuts);//设置超时数.
              DCB dcb;dcb.DCBlength = sizeof(DCB);GetCommState(m_hIDComDev,&dcb);
              dcb.BaudRate = 1200;dcb.ByteSize= 8;//设置波特率,数据位数等.
              if (!SetCommState(m_hIDComDev, &dcb)||!SetupComm(m_hIDComDev,1000,1000)){
                      DWORD dwError = GetLastError();//清除串口中的错误.
                      CloseHandle(m_hIDComDev);//关闭串行口.
			  } 
	  }
    EscapeCommFunction(m_hIDComDev,CLRRTS);//清除RTS.SETRTS//
    EscapeCommFunction(m_hIDComDev,CLRDTR);//清除DTR.CLRDTR//
}

void CPropPage1::OnSendComm(){ //发送数据
	 int SendData[22] = {0x01,0x01,0x01,0x03,0x01,0x02,0x53,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x0C,0x68,0x04,0x18,0x08,0x22,0x6C,0x2E};//模拟2号站自报雨量数据.
	 //int SendData[22] = {0x01,0x01,0x01,0x03,0x01,0x02,0x56,0x00,0x00,0x00,0x09,0x00,0x11,0x00,0x0C,0x68,0x04,0x18,0x08,0x22,0x6C,0x2E};//模拟2号站自报雨量数据.
 	 //int SendData[22] = {0x01,0x01,0x01,0x03,0x01,0x02,0x56,0x00,0x00,0x00,0x09,0x00,0x12,0x00,0x0C,0x68,0x04,0x18,0x08,0x22,0x6C,0x2E};//模拟2号站自报雨量数据.
 	 //int SendData[24] = {0x01,0x01,0x01,0x03,0x01,0x02,0x54,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x00,0x00,0x0C,0x68,0x04,0x18,0x08,0x22,0x6C,0x2E};//模拟2号站自报雨量数据.
 	 //int SendData[24] = {0x01,0x01,0x01,0x02,0x01,0x02,0x54,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x00,0x00,0x0C,0x68,0x04,0x18,0x08,0x22,0x6C,0x2E};//模拟2号站自报雨量数据.
	 intRain1 = intRain1 + 1; SendData[13] = int(intRain1/256) & 255; SendData[14] = intRain1 & 255;//雨量数据加一.
	 COleDateTime timeNow = COleDateTime::GetCurrentTime();//获取计算机时钟.
     SendData[15] = timeNow.GetYear() - 1900; 
     SendData[16] = timeNow.GetMonth(); 
     SendData[17] = timeNow.GetDay(); 
     SendData[18] = timeNow.GetHour(); 
     SendData[19] = timeNow.GetMinute(); 
     int Accum = 65535;int TT; //计算CRC校验值accum.
     for (int i=0; i < 20; i++){
	           Accum ^= SendData[i];
	           for (int j=1; j <= 8; j++){
                        TT = Accum & 1; Accum = int(Accum/2) & 32767; 
						if (TT == 1) Accum ^= 40961;
                        Accum &= 65535;
			   }
	  }
	  //char pszData[200];sprintf(pszData, "%d", m_hIDComDev);AfxMessageBox(pszData);
	  SendData[20] = int(Accum/256) & 255;SendData[21] = Accum & 255;
	  DWORD dwBytesWritten;
      for (i=0; i < 22; i++) WriteFile(m_hIDComDev, (LPSTR)&SendData[i], 1, &dwBytesWritten, NULL); //一个字符一个字符地发送出去. 
 
	                  //发送应答.
                      /*int RecieveData22[26] = {0x01,0x01,0x01,0x03,0x01,0x02,0x53,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x0C,0x68,0x04,0x18,0x08,0x22,0x6C,0x2E};//模拟2号站自报雨量数据.
                      RecieveData22[0] = 0x01;
					  RecieveData22[1] = 0x02; RecieveData22[5] = 0x01;
					  RecieveData22[2] = 0x01; RecieveData22[3] = 0x03;RecieveData22[4] = 0x01;
					  RecieveData22[6] = 0x53;
					  RecieveData22[7] = 0x00;
					  RecieveData22[8] = 0x00;
					  RecieveData22[9] = 0x00;
					  COleDateTime timeNow = COleDateTime::GetCurrentTime();//获取计算机时钟.
                      RecieveData22[10] = 12; 
                      RecieveData22[11] = 0; 
                      RecieveData22[12] = 0; 
                      RecieveData22[13] = 0;//timeNow.GetYear() - 1900; 
                      RecieveData22[14] = 0;//timeNow.GetMonth(); 
                      RecieveData22[15] = 0;//timeNow.GetDay(); 
                      RecieveData22[16] = 0;//timeNow.GetHour(); 
                      RecieveData22[17] = 0;//timeNow.GetMinute(); 
                      RecieveData22[18] = 0;//timeNow.GetSecond(); 
                      RecieveData22[19] = 0;//雨量阀值. 
                      RecieveData22[20] = 0;//水位阀值. 
                      RecieveData22[21] = 0;//水位采集间隔. 
                      RecieveData22[22] = 0;//数据自报间隔. 
	  			      int Accum = 65535;int TT; //计算CRC校验值accum.
                      for (int i=0; i < 23; i++){
	                         Accum ^= RecieveData22[i];
	                         for (int j=1; j <= 8; j++){
                                      TT = Accum & 1; Accum = int(Accum/2) & 32767; 
					                  if (TT == 1) Accum ^= 40961;
                                      Accum &= 65535;
							}
					  }
	                  //RecieveData22[23] = int(Accum/256) & 255;RecieveData22[24] = Accum & 255;
	                  RecieveData22[23] = 0x71;RecieveData22[24] = 0xc1;
	                  DWORD dwBytesWritten;
                      EscapeCommFunction(m_hIDComDev,SETRTS);//开发射机.
					  Sleep(150); //发送前延时五十毫秒.
                      for (i=0; i <= 24; i++) WriteFile(m_hIDComDev, (LPSTR)&RecieveData22[i], 1, &dwBytesWritten, NULL); //一个字符一个字符地发送出去. 
 					  Sleep(300); //发送后延时二百五十毫秒.
                      EscapeCommFunction(m_hIDComDev,CLRRTS);//关发射机.*/
}

void CPropPage1::OnRecieveComm(){ //接收数据.接收可用定时器或线程等
      int Accum,TT; //char str[10];//计算CRC校验值accum.
      DWORD dRead,dReadNum;int j = 0;//接收字数.
	  dReadNum = 0;

	  char *str = new char[20];
	  ZeroMemory(str, sizeof(char[20]));//给变量str分配内存空间.
	  unsigned char *buff = new unsigned char[2000];
	  ZeroMemory(buff, sizeof(unsigned char[2000]));//给变量buff分配内存空间.

      dRead = ReadFile(m_hIDComDev, buff, 100, &dReadNum, NULL); //接收100个字符,dReadNum为实际接收字节数

	  //CString message1,message2;//显示接收到的数据. 
	  //for (DWORD i1=0; i1 < dReadNum; i1++){ //一个字节一个字节地显示数据.
 	  //      message1.Format(_T("%X "), buff[i1]); ///显示当前记录条数
      //      message2 += message1;}
      //if (dReadNum > 0) AfxMessageBox(message2);//显示接收到的数据. 
	  
	  for (DWORD i=0; i < dReadNum; i++){ //一个字节一个字节地分析数据.
		   for (int i1=0; i1 <= 21; i1++) RecieveData22[i1] = RecieveData22[i1+1];////每次只取一个数,放入循环缓冲区中.
		   RecieveData22[21] = buff[i]; //每次只取一个数,放入循环缓冲区中.
		   Accum = 65535; //计算CRC校验值accum.
           for (i1=0; i1 < 20; i1++){
	           Accum ^= RecieveData22[i1];
	           for (int j=1; j <= 8; j++){
                        TT = Accum & 1; Accum = int(Accum/2) & 32767; 
						if (TT == 1) Accum ^= 40961;
                        Accum &= 65535;
			            }

⌨️ 快捷键说明

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