发表于:2013/4/9 15:04:09
#0楼
用VC++6.0编写串行通信程序
首先建立一个基于对话框的MFC应用程序SCommTest,支持ActiveX控件,电话形状的控件是在系统中注册过的MicrosoftCommunications Control, version 6.0,接受缺省的选项。
1.打开串口设置串口参数
在主对话框CSCommTestDlg::OnInitDialog()中打开串口,加入如下代码:
if(m_ctrlComm.GetPortOpen())
m_ctrlComm.SetPortOpen(FALSE);
m_ctrlComm.SetCommPort(1); //选择com1
if ( !m_ctrlComm.GetPortopen( ))m_ctrlComm .
SetPortOpen(TRUE);//打开串口
else
AfxMessageBox("cannot open serial port");
m_ctrlComm.SetSettings("9600,E,7,2"); //波特率9600,偶校验,7个数据位,2个停止位m_ctrlComm.SetInputModel(1); //1:表示以二进制方式检取数据m_ctrlComm.SetRThreshold(1);
//参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件
m_ctrlComm.SetInputLen(0); //设置当前接收区数据长度为0
m_ctrlComm.GetInput();//先预读缓冲区以清除残留数据
发送数据
为发送按钮添加一个单击消息BN_CLICKED处理函数,选择IDC_BUTTON_MANUALSEND,添加OnButtonManualsend()函数,并在函数中添加如下代码:
UpdateData(TRUE); //读取编辑框内容
SendData(m_strTXData1,6);
// m_strTXData1表示发送速度命令的具体数值,6表示写数据的地址DM0006
Sleep(100);
SendData(m_strTXData2,12); //m_strTXData1表示发送时间命令的具体数值,12表示写数据的地址DM0012
2.发送命令
按照命令格式,本课题主要发送两个WD命令:
(1)数据采用十进制发送,向DM0006中写入速度指令;
(2)数据采用十进制发送,向DM0012中写入时间指令。部分程序如下:
Void CSCommTestDlg::SendData(int m_TobeSend,intm_address)
{ CByteArray Array;
unsigned char auchMsg[45]={0}
auchMsg[0]=64; // 起始标志符
auchMsg[1]=0x0; //节点号
auchMsg[2]=0x0; auchMsg[3]=‘W‘; //命令符
auchMsg[4]=‘D‘;
auchMsg[5]=m_address/1000;
auchMsg[6]=(m_address%1000)/100;
auchMsg[7]=(m_address%100)/10;
auchMsg[8]=m_address%10;
auchMsg[9]=m_TobeSend/1000;
auchMsg[10]=(m_TobeSend%1000)/10;
auchMsg[11]=(m_TobeSend%100)/10;
auchMsg[12]=m_TobeSend%10;
LRC(auchMsg,13);
//auchMsg[13] ,auchMsg[14] ,保存FCS值
auchMsg[15]=‘*‘; //命令结束符
auchMsg[16]=13;
Array.RemoveAll();
for (Count=0;Count<17;Count++)
Array.Add(auchMsg[Count]);
m_ctrlComm.SetOutput(COleVariant(Array));
3.计算校验码函数
unsigned char uchLRC = 0 ; 初始值设定
while (usDataLen——)
{uchLRC ︿= *auchMsg++; }
unsigned char high=0xF0;
//high为校验码的高位
unsigned char low=0x0F;
//low为校验码的低位
high&=uchLRC;
low&=uchLRC;
high>>=4;右移四位
if(high<=9)
high=high+48;
else
high=high+55;
if(low<=9)
low=low+48;
else
low=low+55;
auchMsg++=high;
auchMsg++=low;
此程序在VC++6.0中运行通过,并成功应用于振动磨的控制中。该系统采用OMRON XA40DR-A PLC与上位机连接组成控制系统,上位机通过串行口向PLC发出写命令及数据,PLC接受数据后,通过D/A转换模块,将模拟量发给变频器,从而实现了振动磨振动速度和时间的控制。
首先建立一个基于对话框的MFC应用程序SCommTest,支持ActiveX控件,电话形状的控件是在系统中注册过的MicrosoftCommunications Control, version 6.0,接受缺省的选项。
1.打开串口设置串口参数
在主对话框CSCommTestDlg::OnInitDialog()中打开串口,加入如下代码:
if(m_ctrlComm.GetPortOpen())
m_ctrlComm.SetPortOpen(FALSE);
m_ctrlComm.SetCommPort(1); //选择com1
if ( !m_ctrlComm.GetPortopen( ))m_ctrlComm .
SetPortOpen(TRUE);//打开串口
else
AfxMessageBox("cannot open serial port");
m_ctrlComm.SetSettings("9600,E,7,2"); //波特率9600,偶校验,7个数据位,2个停止位m_ctrlComm.SetInputModel(1); //1:表示以二进制方式检取数据m_ctrlComm.SetRThreshold(1);
//参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件
m_ctrlComm.SetInputLen(0); //设置当前接收区数据长度为0
m_ctrlComm.GetInput();//先预读缓冲区以清除残留数据
发送数据
为发送按钮添加一个单击消息BN_CLICKED处理函数,选择IDC_BUTTON_MANUALSEND,添加OnButtonManualsend()函数,并在函数中添加如下代码:
UpdateData(TRUE); //读取编辑框内容
SendData(m_strTXData1,6);
// m_strTXData1表示发送速度命令的具体数值,6表示写数据的地址DM0006
Sleep(100);
SendData(m_strTXData2,12); //m_strTXData1表示发送时间命令的具体数值,12表示写数据的地址DM0012
2.发送命令
按照命令格式,本课题主要发送两个WD命令:
(1)数据采用十进制发送,向DM0006中写入速度指令;
(2)数据采用十进制发送,向DM0012中写入时间指令。部分程序如下:
Void CSCommTestDlg::SendData(int m_TobeSend,intm_address)
{ CByteArray Array;
unsigned char auchMsg[45]={0}
auchMsg[0]=64; // 起始标志符
auchMsg[1]=0x0; //节点号
auchMsg[2]=0x0; auchMsg[3]=‘W‘; //命令符
auchMsg[4]=‘D‘;
auchMsg[5]=m_address/1000;
auchMsg[6]=(m_address%1000)/100;
auchMsg[7]=(m_address%100)/10;
auchMsg[8]=m_address%10;
auchMsg[9]=m_TobeSend/1000;
auchMsg[10]=(m_TobeSend%1000)/10;
auchMsg[11]=(m_TobeSend%100)/10;
auchMsg[12]=m_TobeSend%10;
LRC(auchMsg,13);
//auchMsg[13] ,auchMsg[14] ,保存FCS值
auchMsg[15]=‘*‘; //命令结束符
auchMsg[16]=13;
Array.RemoveAll();
for (Count=0;Count<17;Count++)
Array.Add(auchMsg[Count]);
m_ctrlComm.SetOutput(COleVariant(Array));
3.计算校验码函数
unsigned char uchLRC = 0 ; 初始值设定
while (usDataLen——)
{uchLRC ︿= *auchMsg++; }
unsigned char high=0xF0;
//high为校验码的高位
unsigned char low=0x0F;
//low为校验码的低位
high&=uchLRC;
low&=uchLRC;
high>>=4;右移四位
if(high<=9)
high=high+48;
else
high=high+55;
if(low<=9)
low=low+48;
else
low=low+55;
auchMsg++=high;
auchMsg++=low;
此程序在VC++6.0中运行通过,并成功应用于振动磨的控制中。该系统采用OMRON XA40DR-A PLC与上位机连接组成控制系统,上位机通过串行口向PLC发出写命令及数据,PLC接受数据后,通过D/A转换模块,将模拟量发给变频器,从而实现了振动磨振动速度和时间的控制。
机电之家 机电行业贸易推广网站