📄 recievecomm.cpp
字号:
#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 + -