微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > MCU和DSP > 用VC++.NET实现C167CR单片机与PC的串行通信

用VC++.NET实现C167CR单片机与PC的串行通信

时间:11-05 来源:互联网 点击:
4.2.2 Visual C++.NET程序代码

在OnInitDialog()函数中进行串行口初始化

BOOL CserialDlg::OnInitDialog()
{//省略自动生成的代码
// TODO:在此添加额外的初始化代码
m_Com.put__CommPort(1); //设置串口为COM1
m_Com.put_InBufferSize(1024); //设置输入缓存区的大小,Bytes
m_Com.put_OutBufferSize(512); //设置发送缓存区的大小,Bytes
m_Com.put_PortOpen(true); // 打开串口
m_Com.put_InputMode(1); //以二进制方式接收数据
m_Com.put_Settings(“9600,n,8,1”); //设置数据传输速率等参数
m_Com.put_RThreshold(12); //表示收到12个字符引发一个OnComm事件
m_Com.put_InputLen(0); //一次读出接收缓存区的字符
m_Com.get_Input(); //清空接收缓存区
return TRUE; // 除非设置了控件的焦点,否则返回 TRUE
}

数据发送程序代码
void CserialDlg::OnSendData()
{ // TODO: 在此添加控件通知处理程序代码
if(!m_Com.get_PortOpen()) m_Com.put_PortOpen(true); //若没打开串口,则打开
UpdateData(true); //将编辑框中的数据传递给变量
m_Com.put_Output(COleVariant(m_Send)) ; //将编辑框中的字符串数据转换
VARIANT类型,并发送出去
}

数据接收程序代码
void CserialDlg::OnCommMscomm()
{ // TODO: 在此添加消息处理程序代码
VARIANT vReceive;
COleSafeArray sReceivearray;
long k , i;
BYTE bReceive[1024];
CString str;
m_Receive="";
k=m_Com.get_CommEvent();
switch(k){
case 2: //接收到Rthreshold个数据
vReceive=m_Com.get_Input(); //读取缓存区内的数据
sReceivearray=vReceive; //将数据由VARIANT型转换为SafeArray型
for(i=0;i<12;i++)
sReceivearray.GetElement(&i,bReceive+i); //将数据转换为BTYE型数组
for (i=0;i<5;i++)
{ char a=*(char*)(bReceive+i);
str.Format("%c",a);
m_Receive+=str; } //将数据转换为CString型,传递给变量m_Receive
UpdateData(false); //更新编辑框内容
break;
default: break;
}
}

程序中的put_Output()函数要求VARIANT型数据作为参数,可以调用类ColeVariant的构造函数将多种类型数据(如CString,int等)转换为VARIANT类型数据。同时数据接收函数get_Input()接收到的数据为VARIANT类型,可通过一系列转换,转换为所要求的类型予以显示。

4.3 C167CR单片机通信程序设计

C167CR单片机串行通信程序采取8位数据异步发送工作方式,接收数据使用中断方式,接收完12字节数据后再将全部数据发送出去。具体C语言程序如下。

初始化程序:
#include <reg167.h>
void init(void)
{ P3 |= 0x0400; /*设置输入、输出引脚*/
DP3 |= 0x0400;
DP3 &= 0xF7FF;
S0BG = 0x40; /*设置波特率为9600*/
S0CON = 0x8011; /*设置串行口状态:8位数据异步工作方式,1位停止位等*/
S0RIC=0x0044; /*设置中断允许位、中断优先级*/
IEN=1; } /*中断全局使能*/
主程序:
#include <reg167.h>
extern void init(void);
static unsigned int i=0;
static unsigned char c;
unsigned int n;
void serialcom (void) interrupt 0x2B using s_rbank{ /*中断接收数据*/
if(i==0) c[0]=S0RBUF; else c[ i]=S0RBUF;
if(i==11) { for(n=0;n<12;n++) S0TBUF=c[n]; } /*接收12个字节后发送*/
i=i+1; if(i==12) i=0;
}
void main (void) { init (); while (1) {S0RIR=0;} }

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top