ROBOT & AI

首页 | 新闻 | 产品 | 竞赛 | 学苑 | 读书 | 硬件 | 软件 | 智能 | 制作 | 项目 | 资源 | 论坛
 您的位置:首页 >> 软件 >> 机器人编程 >> 正文
站内搜索:   

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

来源:www.gjwtech.com  林阔 于浪 殳伟群 字体:[ ]  2007-01-08

关键词:VC


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[5];
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;} }

2页 上一页  [1] [2] 

录入:master 点击:

[发表评论] [打印文章] [关闭窗口]  

原创文章属本站所有,转载请注明来源:Robotain.com  
相关文章

 网友评论(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

发表评论 昵称:

  

  • 请遵守《互联网电子公告服务管理规定》及中华人民共和国其他各项有关法律法规。
  • 严禁发表危害国家安全、损害国家利益、破坏民族团结、破坏国家宗教政策、破坏社会稳定、侮辱、诽谤、教唆、淫秽等内容的评论 。
最新推荐
热门文章
论坛精华
网站简介设为首页 加入收藏在线留言友情链接联系我们 - 广告服务 - 版权申明

Copyright © Robotain.com  all rights reserved  浙ICP备07003355号

版权所有 机器与智能网