集电极485接口RS-485与RS-232转换模块485端相连。RS-485与RS-232转换模块232通过串行电缆末端PC的232串口。我们通过书面沟通PC通信软件来实现双方并执行收购方案。

1)上位机软件:

採用MFC,主要利用串口函数SetCommState、WriteFile和ReadFile进行串口设置、发送和接收。详细程序例如以下:

void CComplDlg::OnReseved()
{
DWORD length=0;
unsigned char Com_Recv_Buf[256]; ReadFile(hCom,Com_Recv_Buf,20,&length,NULL); //读取串口内容 m_sReseved = 150; //电量
//电表地址,十六进制
m_sAddr1.Format("0x%02x", Com_Recv_Buf[4]);
m_sAddr2.Format("0x%02x", Com_Recv_Buf[5]);
m_sAddr3.Format("0x%02x", Com_Recv_Buf[6]);
m_sAddr4.Format("0x%02x", Com_Recv_Buf[7]);
m_sAddr5.Format("0x%02x", Com_Recv_Buf[8]);
m_sAddr6.Format("0x%02x", Com_Recv_Buf[9]); UpdateData(false);
SetCommMask(hCom,EV_TXEMPTY);
UpdateData(false);
} void CComplDlg::OnSend()
{
UpdateData(true); DWORD length=0;
unsigned char Com_Send_Buf[10];
Com_Send_Buf[0]=m_sSend;
if(WriteFile(hCom,Com_Send_Buf,1,&length,NULL))
{
m_cReseved.EnableWindow(true);
}
else
{
MessageBox(TEXT("数据发送失败! 请重试!"),TEXT("提示"),MB_OK);
}
} void CComplDlg::OnSetupcom()
{
UpdateData(true); SetupComm(hCom,1024,1024);
COMMTIMEOUTS Timeouts;
//DCB dcb
GetCommState(hCom,&dcb);
dcb.BaudRate=38400;//m_nSetupbt;
dcb.ByteSize=8;
dcb.StopBits=ONESTOPBIT;
dcb.Parity=NOPARITY;
SetCommState(hCom,&dcb);
UpdateData(false);
m_cSend.EnableWindow(true);
m_cSend.SetFocus();
m_cSetupcomm.EnableWindow(false);
m_cEditsend.SetFocus();
}

2)採集器端程序:
void main(void)
{
Str711_Init(); //对主芯片STR711进行初始化 /*设置初始的与PC通信的波特率*/
Base_ParaMeter.Baud_to_Pc = BAUD_UART_PC_ORDER_38400;
/*由于更改了初始的与PC通信的波特率所以再将数据又一次写回到SPI_Flash中去*/
SPI_Write_161d(BASE_ADDR_BASE_PARA,(u8*)&Base_ParaMeter,sizeof(Base_ParaMeter));
/*配置与PC通信的UART*/
UART_Config(UART_PC, BAUD_UART_PC_38400, UART_EVEN_PARITY, UART_1_StopBits, UARTM_8D_P); //主循环
while(1)
{
WDG_CntRefresh(); //刷新看门狗的计数器值
//*****************************************************************************/
/*发送一个数据包过去。请求读电量*/
/* if(Global_Task_Flag &TASK_FLAG_BEGIN_LUNXUN)
{
Global_Task_Flag &=(~TASK_FLAG_BEGIN_LUNXUN);
if((Global_Task_Flag&TASK_FLAG_LUNXUN_ING)==0)
{
WDG_CntRefresh();//刷新看门狗的计数器值
LunXun_Start(); //開始轮询 }
}*/
//*****************************************************************************/
if(Global_Task_Flag&TASK_FLAG_RX_PC_BIT_OK)
{//串口PC的有效数据帧被收到, 运行上位机的相关命令
Global_Task_Flag &= (~TASK_FLAG_RX_PC_BIT_OK);
WDG_CntRefresh(); //刷新看门狗的计数器值 Send_Ack_Or_Data_To_Host_Uart_PC();
} if(Global_Task_Flag&TASK_FLAG_25MS_TASK)
{//25MS运行一次的任务
Global_Task_Flag &=(~TASK_FLAG_25MS_TASK);
WDG_CntRefresh(); //刷新看门狗的计数器值
Task_2();
}
WDG_CntRefresh(); //刷新看门狗的计数器值
Task_3();
}
} /*********************************************************************************************
*任务函数: Task2()
*功能: 25ms 运行一次的任务
*********************************************************************************************/
void Task_2()
{
WDG_CntRefresh(); //刷新看门狗的计数器值
Parse_Com_Data(3); //串口PC
}
/*********************************************************************************************
*任务函数: Task3()
*功能: 推断串口数据的发送是否完毕。假设完毕将状态转换为接收状态
*********************************************************************************************/
void Task_3()
{
//推断串口PC的发送是否完毕,假设完毕,则将状态转换为接收状态
if(Com_Task_Flag& TASK_FLAG_COM_PC_SEND_COMPLETE)
{
Com_Task_Flag &= (~TASK_FLAG_COM_PC_SEND_COMPLETE);
Com_PC_Send_Total_Len =0;
Com_PC_Send_Pos =0;
}
} /*********************************************************************************************
*函数名称: Send_Ack_Or_Data_To_Host_Uart_PC()
*功能描写叙述: 对收到串口PC 的上位机命令进行应答
*********************************************************************************************/
void Send_Ack_Or_Data_To_Host_Uart_PC()
{
u32 i;
u8 ch; /*自己定义返回格式与内容,參照DLT 645-1997多功能电能表通信规约的通信协议*/
for(int index=0; index<10; index++)
Com_PC_Send_Buf[index] = index; //向上位机发送应答数据帧
Com_PC_Send_Data_Len = 3;
Com_PC_Send_Check_Sum = 0; //对数据域加 0x33
for(i=0;i<Com_PC_Send_Data_Len;i++)
{
Com_PC_Send_Buf[10+i] +=0X33;
}
for(i=0;i<10+Com_PC_Send_Data_Len;i++)
{
Com_PC_Send_Check_Sum += Com_PC_Send_Buf[i];
}
Com_PC_Send_Buf[i]= Com_PC_Send_Check_Sum;
Com_PC_Send_Buf[i+1] = 0x16;
Com_PC_Send_Buf[i+2] = 0x16;
Com_PC_Send_Buf[i+3] = 0x16; Com_PC_FE_Number =0; //关闭接收中断。取得发送的总长度
Com_PC_Send_Total_Len = Com_PC_Send_Data_Len +14; //包含校验和以及0X16
Com_PC_Send_Pos =0;
ch = 0XFE;
PC_TX_ENABLE; //PC发送使能 UART_ByteSend(UART_PC,&ch );
UART_ByteSend(UART_PC,&ch );
UART_ByteSend(UART_PC,&ch );
UART_ByteSend(UART_PC,&ch ); do
{
if(Com_PC_Send_Pos<Com_PC_Send_Total_Len)
{
UART_ByteSend(UART_PC,&Com_PC_Send_Buf[Com_PC_Send_Pos]);
Com_PC_Send_Pos++;
}
else
{
break;
}
}while (!(UART_FlagStatus(UART_PC) & UART_TxFull)); Com_Task_Flag |= TASK_FLAG_COM_PC_SEND_TIME;
UART_ItConfig(UART_PC,UART_TxEmpty|UART_TxHalfEmpty,ENABLE); //发送中断使能
UART_ItConfig(UART_PC,UART_RxHalfFull|UART_TimeOutNotEmpty,DISABLE); //接收中断禁止 } /***************************************************************************************************
* FunctionName : Parse_Com_Data
* Description : 解析COM口是否有一个完整的数据帧收到
* Parameter(s) :
* Com_Number : 是哪一个COM口 2为下行的485口有;3为上行的PC口
*
* Return : void
***************************************************************************************************/
void Parse_Com_Data(u8 Com_Number)
{
u8* Com_Recv_Buf; /*指向串口接收缓冲区的指针*/
u8 Com_Data_Len; /*记录数据帧的数据域长度*/
u8* Com_Recv_Buf_Ptr_W; /*串口接收缓冲区的写指针*/
u8* Com_Recv_Buf_Ptr_R; /*串口接收缓冲区的读指针*/
u16 COM_RECV_BUF_SIZE; /*接收缓冲区的大小*/
u32 TASK_FLAG_COM_RX_OK; /*接收到一个完整的帧的标志位*/
u8* Com_Process_Buf; /*假设接收的帧完整则将这一帧数据转存到这个处理缓冲区中为后面处理做准备*/
u16 i=0; switch(Com_Number)
{
case 3:
Com_Recv_Buf = Com_PC_Recv_Buf;
Com_Recv_Buf_Ptr_W = &Com_PC_Recv_Buf_Ptr_W;
Com_Recv_Buf_Ptr_R = &Com_PC_Recv_Buf_Ptr_R;
Com_Process_Buf = Com_PC_Process_Buf;
COM_RECV_BUF_SIZE = COM_RECV_BUF_SIZE_HW_PC;
TASK_FLAG_COM_RX_OK = TASK_FLAG_RX_PC_BIT_OK;
break;
default:
return;
} /*若发过来的数据是0x99,则视为能够通信。进行应答*/
if(Com_Recv_Buf[0] == 0x99)
{
Com_Process_Buf[0]=Com_Recv_Buf[0];
//清除缓冲区中全部的数据.
memset(Com_Recv_Buf,0,COM_RECV_BUF_SIZE);
//读写指针清零也能够. 临时先不清零吧
*Com_Recv_Buf_Ptr_R = 0;
*Com_Recv_Buf_Ptr_W = 0; Global_Task_Flag |= TASK_FLAG_COM_RX_OK;
} //设置收到串口1有效数据帧标志 return; }

在採集器端25ms进行一次串口数据读取。通过推断接收到的数据是否为0x99,决定是否进行应答。

通过UART_ByteSend功能发送应答信息。

版权声明:本文博客原创文章,博客,未经同意,不得转载。

低压电力采集平台DW710C与PC沟通的更多相关文章

  1. 基于低压电力采集平台DW710C的基础开发

    实验课题 (1)自己定义通信规约,採用java或C++编写简单的PC端上位机软件,实现採集器与PC机的通信.实验可在DW710C-PCproject下进行. (2)实现LCD显示字符.数字.汉字和简单 ...

  2. TDengine在数益工联工业物联采集平台建设中的初步实践

    作者:易永耀 夏杭泰 邓炜兴 公司介绍 数益工联致力于打造基于数据流+价值流的离散制造业数字化软件:应用新一代的物联网技术与丰富的现场交互手段,融合工业工程精益思想,为离散制造业客户的数字化升级提供从 ...

  3. 【开源】基于 SpringBoot 的 web kettle 在线采集平台

    kettle-scheduler-boot 开发计划 序号 项目 状态 优先级 1 在线管理,编辑kettle脚本 紧急 2 通过源码实现集群,多线程执行任务 紧急 2 重构jpa部分,改为mybat ...

  4. 【工业串口和网络软件通讯平台(SuperIO)教程】一.通讯机制

    1.1    应用场景 通讯平台的交互对象包括两方面:第一.与硬件产品交互.第二.与软件产品交互.基本这两方面考虑,通讯平台一般会应用在两个场景: 1)通讯平台应用在PC机上 主要应用在自动站的工控机 ...

  5. S2---深入.NET平台和C#编程的完美总结

    1.NET简单解说 l 面向对象提升 OOP(Object Oriented  Programming)面向对象编程 AOP:(Aspache  Oriented Programming):面向切面编 ...

  6. 如何实现从Android第三方平台推送微信公众号

    最近心血来潮,想要尝试写写有关实现Android平台第三方应用软件去跳转到微信平台的代码.我只是先暂时写写我的思路,如后期实现,便将主要代码附上. 微信公众平台官方宣布微信沟通接口正式上线,用户可以在 ...

  7. 移植mysql到嵌入式ARM平台

    移植MySQL到嵌入式ARM平台  MySQL没有专门针对ARM的版本,移植到ARM没有官方文档可参考,因此,暂时参考这样一篇文档: http://blog.chinaunix.net/space.p ...

  8. MySql移植到嵌入式Linux平台

    最近在做考勤机系统,硬件采用的cortex-A8,哈哈,其实是有点浪费的,2410就可以的.所以就要考虑到考勤数据的存储问题,本来是打算用sqlite数据库存储的,可是后来发现,这个数据库只是一个本地 ...

  9. 6.MIL采集和实时显示

    前面讲到的都是离线的图像获取方法,实际中我们做机器视觉都是在线采集图像和处理,处理结果决定了计算机要给出的控制信号如电机运动等,这样就实现了实时视觉反馈运动.MIL中的采集需要Matrox采集板卡的支 ...

随机推荐

  1. [置顶] vs2008 编译adb 支持4.2 android 系统(增加push 命令的进度)

    QQ: 2506314894 本想晚些时候放出来的,但是按捺不住啊,所以修改了之后就立即放出来了.先说明一下,这次用的adb 的源码比较新的,用的vs2008 编译出来,只有一个exe 文件,直接就可 ...

  2. jquery.ui.accordion的修改(支持展开多个)

    原文:jquery.ui.accordion的修改(支持展开多个) 背景:原jquery.ui.accordion插件,最多只能展开一个,不能展开多个,后来在网上找到了一个基于它的一个修改版(http ...

  3. rm -vf `ls |egrep -v "info_20130826-180233.31764|QueryParser.INFO"`

    > rm -vf `ls |egrep -v "info_20130826-180233.31764|QueryParser.INFO"`

  4. Struts2 拦截器具体配置过程

    拦截器差点儿遍布每个程序中,所以贴出拦截器配置的具体过程,希望可以帮到大家. Struts2 拦截器具体配置过程 <interceptors> <!-- 先定义拦截器 --> ...

  5. poj3140(树的dfs)

    题目链接:http://poj.org/problem?id=3140 题意:给定一棵n棵节点的树,求删去某条边后两个分支的最小差异值. 分析:num[u]表示以u点为根节点的子树的总人数,那么不在该 ...

  6. 使用GraceNote Web API发展Mac发现音乐信息的应用

    好久没有写博客,最近各种忙,特别忙里忙,今晚难得清闲.写最近完成下一个博客任务的摘要:使用GraceNote的Web API开发一个查询的音乐信息的应用,事实上,并在这些功能的前GraceNote S ...

  7. OpenStack安装与配置2

    第二部分 OpenStack安装与配置 一.引言   本章内容讲解如何在3台物理机上搭建最小化云平台,这3台机器分为称为Server1.Server2和Client1,之后的各章也是如此.Server ...

  8. Java调用摄像头截图

    使用webcam-capture替换JMF调用摄像头 最近有个需要通过java调用摄像头,并截图的需求,在网上找了下资料,大部分是用一个叫jmf的库,但是jmf已经几百年没有更新,用起来各种问题.后来 ...

  9. UVA 11324 - The Largest Clique(强连通分量+缩点)

    UVA 11324 - The Largest Clique 题目链接 题意:给定一个有向图,要求找一个集合,使得集合内随意两点(u, v)要么u能到v,要么v能到u,问最大能选几个点 思路:强连通分 ...

  10. 对consistencygroup的一些研究和实践

    声明: 本博客欢迎转载,但请保留原作者信息! 作者:李人可 团队:华为杭州OpenStack团队 consistency group,直译是一致性组,是Juno版本号cinder新引进的一个概念.顾名 ...