我用MSCOMM实现电脑和设备串口通信,我在串口打开使设置定时器为1秒向设备发送一次命令,设备接收到命令返回毫伏值,我设置接收门限为将数据全部接收后出发ONCOMM,在ONCOMM中我调用getlocaltime获得时间,并向对话框发送消息,对话框显示曲线的横轴为时间轴纵轴为MV,下面部分代码和截图:
//开始串口通信方法
void CDataDisplayView::OnOpencom()
{
CByteArray Array1;
Array1.RemoveAll();
Array1.SetSize(8);
Array1.SetAt(0,0x7e);
Array1.SetAt(1,0x01);
Array1.SetAt(2,0x01);
Array1.SetAt(3,0x01);
Array1.SetAt(4,0x01);
Array1.SetAt(5,0x01);
Array1.SetAt(6,0x01);
Array1.SetAt(7,0x7F);
myComm.SetOutput(COleVariant(Array1));
m_bStopCommunication = false;
SetTimer(1,1000,NULL);
}
/////////////////////////////////
响应定时器函数
void CDataDisplayView::OnTimer(UINT nIDEvent)
{
CByteArray Array1;
Array1.RemoveAll();
Array1.SetSize(8);
Array1.SetAt(0,0x7e);
Array1.SetAt(1,0x01);
Array1.SetAt(2,0x01);
Array1.SetAt(3,0x01);
Array1.SetAt(4,0x01);
Array1.SetAt(5,0x01);
Array1.SetAt(6,0x01);
Array1.SetAt(7,0x7F);
myComm.SetOutput(COleVariant(Array1));
CView::OnTimer(nIDEvent);
}/////////////////////////////////
oncomm事件处理函数
void CDataDisplayView::OnCommMscomm()
{
VARIANT input1; //定义VARIANT类型变量
BYTE rxdata[2048]; //定义存放二进制数据的数组
long len1,k;
COleSafeArray safearray1; //定义COleSafeArray类的实例
CString strtemp,m_RcvData;
double mv,pH,cONC,tm;
DWORD InBufferCount;
SYSTEMTIME systime;
char buf[32];
GetLocalTime(&systime);//本地时间
sprintf(buf, "%d:%d:%d", systime.wHour,systime.wMinute,systime.wMinute,systime.wSecond);
switch(myComm.GetCommEvent())
{
case 2:
//收到 RThreshold 个字符
//添加接收处理代码
InBufferCount=myComm.GetInBufferCount();
input1=myComm.GetInput();
safearray1=input1; //将VARAIANT变量赋值给COleSafeArray类的实例
len1=safearray1.GetOneDimSize();//使用COleSafeArray类的成员函数获取数据长度
for(k=0;k<len1;k++)
safearray1.GetElement(&k,rxdata+k);//使用COleSafeArray类的成员函数将数据写入数组
for(int i = 5;i<(len1 - 2);i+=3) //接收的数据从5-16为信息字节
{ switch(i)
{
case 5:
m_RcvData = "mv";
mv = dataCompution.FloatTOReal(rxdata[i],rxdata[i+1],rxdata[i+2]);//得到的double类型值
if(pDlg2->m_flagShowMv)
{
pDlg2->m_dMv = mv;
::SendMessage(pDlg2->m_hWnd,WM_MvChanged,(WPARAM)buf,0);
}
strtemp.Format("%6.2f",mv);
pDlg1->m_MV = strtemp;
strtemp = "";
break;
.....
}
//开始串口通信方法
void CDataDisplayView::OnOpencom()
{
CByteArray Array1;
Array1.RemoveAll();
Array1.SetSize(8);
Array1.SetAt(0,0x7e);
Array1.SetAt(1,0x01);
Array1.SetAt(2,0x01);
Array1.SetAt(3,0x01);
Array1.SetAt(4,0x01);
Array1.SetAt(5,0x01);
Array1.SetAt(6,0x01);
Array1.SetAt(7,0x7F);
myComm.SetOutput(COleVariant(Array1));
m_bStopCommunication = false;
SetTimer(1,1000,NULL);
}
/////////////////////////////////
响应定时器函数
void CDataDisplayView::OnTimer(UINT nIDEvent)
{
CByteArray Array1;
Array1.RemoveAll();
Array1.SetSize(8);
Array1.SetAt(0,0x7e);
Array1.SetAt(1,0x01);
Array1.SetAt(2,0x01);
Array1.SetAt(3,0x01);
Array1.SetAt(4,0x01);
Array1.SetAt(5,0x01);
Array1.SetAt(6,0x01);
Array1.SetAt(7,0x7F);
myComm.SetOutput(COleVariant(Array1));
CView::OnTimer(nIDEvent);
}/////////////////////////////////
oncomm事件处理函数
void CDataDisplayView::OnCommMscomm()
{
VARIANT input1; //定义VARIANT类型变量
BYTE rxdata[2048]; //定义存放二进制数据的数组
long len1,k;
COleSafeArray safearray1; //定义COleSafeArray类的实例
CString strtemp,m_RcvData;
double mv,pH,cONC,tm;
DWORD InBufferCount;
SYSTEMTIME systime;
char buf[32];
GetLocalTime(&systime);//本地时间
sprintf(buf, "%d:%d:%d", systime.wHour,systime.wMinute,systime.wMinute,systime.wSecond);
switch(myComm.GetCommEvent())
{
case 2:
//收到 RThreshold 个字符
//添加接收处理代码
InBufferCount=myComm.GetInBufferCount();
input1=myComm.GetInput();
safearray1=input1; //将VARAIANT变量赋值给COleSafeArray类的实例
len1=safearray1.GetOneDimSize();//使用COleSafeArray类的成员函数获取数据长度
for(k=0;k<len1;k++)
safearray1.GetElement(&k,rxdata+k);//使用COleSafeArray类的成员函数将数据写入数组
for(int i = 5;i<(len1 - 2);i+=3) //接收的数据从5-16为信息字节
{ switch(i)
{
case 5:
m_RcvData = "mv";
mv = dataCompution.FloatTOReal(rxdata[i],rxdata[i+1],rxdata[i+2]);//得到的double类型值
if(pDlg2->m_flagShowMv)
{
pDlg2->m_dMv = mv;
::SendMessage(pDlg2->m_hWnd,WM_MvChanged,(WPARAM)buf,0);
}
strtemp.Format("%6.2f",mv);
pDlg1->m_MV = strtemp;
strtemp = "";
break;
.....
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货