注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

一车,一房,一个温暖家

10万左右的车,80平方的房子,这是我奋斗的暖暖的家

 
 
 

日志

 
 

引用 上位机与单片机的互动(一)   

2015-03-22 14:53:00|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

   今天是3月5号,  最近一直想自定一个通信协议,然后用VB写一个上位机与单片机通信,实现对硬件实时的监控。由于之前把费了好大功夫才把CRC算法研究出来了,所以相当于已经成功了一半。

 

今天我基本完成了协议的定义,协议如下:

 

自定协议:

一、单片机

由于数组数据校验码需放置下标为0的单元,所以协议设定如下:

数据域(N)字节、命令(1字节)、地址(1字节)、校验码(2字节)

例(MSB)0x10、0x38、0x01、0xbd(高位)、0xc0(CRC低位)(LSB)

0xdb:CRC校验码的高位

0xc0:CRC校验码的地位

0x01:设备地址,单片机假设为0x01

0x38:使设备完成某项工作的命令代码

0x10:数据域,表示要求设备根据数据标准来完成某项工作

 

二、上位机

(MSB)数据域(N)字节、命令(1字节)、地址(1字节)、校验码(2字节)(LSB)

基本与单片机相同。

例:(MSB)0x20、0x34、0x02、0xbd(高位)、0xc0(低位)(LSB)

0xbd、0xc0:CRC码

0x02:地址,PC机假设为0x02

0x34:命令

0x20:数据域

 

有了这个协议,我就可以根据这个协议来编程了,此次我用的是我之前的C51开发板,以下是C代码

 

/*
*项目名称:单片机与上位机通信
*项目实现:OYPL
*工程时间:2011/03/05
*进度记录:
1、完成CRC算法,完成单片机与VB通信,经过双方各自CRC算法后CRC码达成一致。  2011/02/28
*/
#include<reg52.h>
#include<intrins.h>
#include<CRC16.h>
#define uchar unsigned char
#define uint  unsigned int
uchar ga_ucRcvBuf[4];
uchar idata *gp_ucSavaPtr;
uchar gc_uCount;   
uchar g_uCrcLow;   //存储计算后的低位CRC
uchar g_uCrcHigh;   //存储计算后的高位CRC
uchar g_ucRcvCrcLow;  //暂储接收到的低位CRC
uchar g_ucRcvCrcHigh;  //暂储接收到的高位CRC
bit gc_bRcvCount;   //数据接收计数器,接收完毕置1。

/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
void Delay_1ms(uint i)//1ms延时
{
  uchar x,j;
  for(j=0;j<i;j++)
  for(x=0;x<=148;x++);
}

/********************************************************************
* 名称 : Com_Int()
* 功能 : 串口中断子函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Com_Int(void) interrupt 4 using 3
{
  EA = 0;
  if(RI == 1)   //当硬件接收到一个数据时,RI会置位
  {
    RI = 0;
  /***************************成功
    ga_ucRcvBuf[0] = SBUF;
    Delay_1ms(1);
  ************************/
    ga_ucRcvBuf[gc_uCount] = SBUF;
    gc_uCount ++;
    if(gc_uCount > 4)
    {
     gc_uCount = 0;
   gc_bRcvCount = 1;
    }
   }
   EA = 1;
}

/********************************************************************
* 名称 : Com_Init()
* 功能 : 串口初始化,晶振11.0592,波特率9600,使能了串口中断
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Com_Init(void)
{
     TMOD = 0x20;
     PCON = 0x00;
     SCON = 0x50;  
     TH1 = 0xFd;    //设置波特率 9600
     TL1 = 0xFd;
     TR1 = 1;  //启动定时器1
   ES = 1;  //开串口中断
   EA = 1;  //开总中断 
}

/********************数据处理校验**********************************/
bit CheckData()
{
 if(ga_ucRcvBuf[2] == 0x01)
 {
  g_ucRcvCrcLow = ga_ucRcvBuf[0];
  g_ucRcvCrcHigh = ga_ucRcvBuf[1];
  ga_ucRcvBuf[0] = 0;
  ga_ucRcvBuf[1] = 0;
  g_uCrcLow = cal_crc(ga_ucRcvBuf,5);
  g_uCrcHigh = cal_crc(ga_ucRcvBuf,5) / 256;
  if((g_ucRcvCrcLow == g_uCrcLow) && (g_ucRcvCrcHigh == g_uCrcHigh))
  {
   P0 = ga_ucRcvBuf[3];  //这里可以处理校验成功后的功能
  }
 }
}

/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main()
{
  Com_Init();
  gc_uCount = 0;
  P0 = 0;
  g_uCrcLow = 0;   //存储计算后的低位CRC
  g_uCrcHigh = 0;   //存储计算后的高位CRC
  gc_bRcvCount = 0;
  g_ucRcvCrcLow = 0;  //暂储接收到的低位CRC
  g_ucRcvCrcHigh = 0;  //暂储接收到的高位CRC
  while(1)
  {
   if(gc_bRcvCount == 1)
  {
   gc_bRcvCount = 0;
   EA = 0;
   CheckData();
  }
  EA = 1;
  Delay_1ms(1);
 }
}
此时,这个程序只是单纯单片机与上位机通信成功的案例,但未真正体现协议的存在。不过一步一步来,在以后的程序中慢慢体现。

 

以下是VB相关的

上位机与单片机的互动(一) - 静水深流 -
 
这是我做的基本模型,但是功能未完善,也是逐个逐个击破。
以下是VB主要的核心编程:
Private Sub MSComm1_OnComm()        '接收程序
       If MSComm1.CommEvent = comEvReceive Then
                    'Text1.Text = AscB(MSComm1.Input)
         End If          
        MSComm1.InBufferCount = 0
End Sub
 
这是简单的接收程序,未体现协议。
 
今天就先到这里,后面逐步完善!

 

  评论这张
 
阅读(10)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018