16,472
社区成员
发帖
与我相关
我的任务
分享
void CModbusSCommDlg::OnComm()
{
// TODO: Add your control notification handler code here
const int Size = 50;
VARIANT Input;
CString temp;
long k;
int len=0;
COleSafeArray OleArray;//构造一个任何类型的空数组.
BYTE rxdata[50];
if (2==m_Comm.GetCommEvent())
{
Input=m_Comm.GetInput(); //读缓冲区
OleArray=Input;//VARIANT型变量转换为ColeSafeArray型变量
len=OleArray.GetOneDimSize();//获取接收到的字符数.也可使用m_com.GetInBufferCount()获取字符数.
for (k=0;k<len;k++)
{
OleArray.GetElement(&k,rxdata+k);//将OleArray数组中第K个元素赋予BYTE数组中第K个元素.
BYTE bt=*(char *)(rxdata+k);//字节数组元素转换字符型
temp.Format("%02X ",bt);//输出两位十六进制值
m_Receive+=temp;
}
//我测到len=14.能否使len大于43
char error[30];
sprintf(error,"len长度为%d",len);
AfxMessageBox(error); show(rxdata,Size,len);
//m_Receive为界面显示报文的edit框
m_Receive+="\r\n"; //接受框内容换行
}
UpdateData(FALSE);//成员变量的值在控制中体现出来.当为TRUE时,将控件中用户输入的值赋值给成员变量
}
void CModbusSCommDlg::show(BYTE rxdata[], int S, int L)
{
BYTE bt;//中间量
BYTE lbt[38];//储存19个寄存器数据(共38字节)的数组
BYTE sbt[2];//储存遥信开关状态数据的数组
int i;
if(L==7)//处理解析接受7个报文
{
unsigned char data[9];//存放开关的9个状态,0为断开,非0为闭合
for(i=0;i<2;i++)//从7字节数据帧中得到2字节的数据
{
bt=rxdata[i+3];
sbt[i]=bt;
}
BYTE a=sbt[0];//高位数据
data[8]=a&0x1;//第九开关状态
BYTE b=sbt[1];
for(i=0;i<8;i++)//把1-8号8个开关状态数据对应的放到数组data[0]-data[7]中
{
data[i]=b&(1<<i);
}
for(i=0;i<9;i++)//把9个开关状态显示到界面中
{
if(data[i]==0x00)
{
SetSwitchStatus(i+1,FALSE);//使开关状态显示关状态
}
else
{
SetSwitchStatus(i+1,TRUE);//使开关状态显示开状态
}
}
}
else if(L==43)//解析处理43个报文m_edit1-15为15个edit变量除13、14个为float类型,其他为long型
{ ULONG ddata;//用于存放十进制数
float aa;//
for(i=0;i<38;i++)
{
bt=rxdata[i+3];
lbt[i]=bt;
}
ddata=(lbt[0]<<8)+lbt[1];
m_Edit1=ddata; //A相电流
ddata=(lbt[2]<<8)+lbt[3];
m_Edit2=ddata; //B相电流
ddata=(lbt[4]<<8)+lbt[5];
m_Edit3=ddata; //C相电流
ddata=(lbt[6]<<8)+lbt[7];
m_Edit4=ddata; //A相电压
ddata=(lbt[8]<<8)+lbt[9];
m_Edit5=ddata; //B相电压
ddata=(lbt[10]<<8)+lbt[11];
m_Edit6=ddata; //C相电压
ddata=(lbt[12]<<8)+lbt[13];
m_Edit7=ddata; //AB线电压
ddata=(lbt[14]<<8)+lbt[15];
m_Edit8=ddata; //BC线电压
ddata=(lbt[16]<<8)+lbt[17];
m_Edit9=ddata; //CA线电压
ddata=(lbt[18]<<24)+(lbt[19]<<16)+(lbt[20]<<8)+lbt[21];
m_Edit10=ddata; //三相有功功率
ddata=(lbt[22]<<24)+(lbt[23]<<16)+(lbt[24]<<8)+lbt[25];
m_Edit11=ddata; //三相无功功率
ddata=(lbt[26]<<8)+lbt[27];
aa=(float)ddata/100;
m_Edit12=aa; //三相功率因数
ddata=(lbt[28]<<8)+lbt[29];
aa=(float)ddata/100;
m_Edit13=aa; //系统频率
ddata=(lbt[30]<<24)+(lbt[31]<<16)+(lbt[32]<<8)+lbt[33];
m_Edit14=ddata; //有功电度
ddata=(lbt[34]<<24)+(lbt[35]<<16)+(lbt[36]<<8)+lbt[37];
m_Edit15=ddata;//无功电度
UpdateData(FALSE);
}
else
AfxMessageBox("接受数据错误!");
}
m_Comm.SetInputMode(1);//1:表示以二进制方式检取数据
m_Comm.SetRThreshold(1);//参数1表示每当串口接收缓冲区中有多余或等于1个个字符时将引发一个接收数据的OnComm事件
m_Comm.SetInputLen(0);//设置当前接收区数据长度为0
m_Comm.GetInput();//先预读缓冲区以清除残留数据