Chinaunix首页 | 论坛 | 博客
  • 博客访问: 486652
  • 博文数量: 42
  • 博客积分: 2100
  • 博客等级: 大尉
  • 技术积分: 580
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-07 21:07
文章分类

全部博文(42)

文章存档

2011年(1)

2010年(18)

2009年(16)

2008年(7)

分类:

2008-08-25 21:08:17

 
   由于最近做关于IC卡方面的,不免涉及到串口与单片机的通信。上网查找了很久,又看了很久相关的书,有了初步的“形状”,怎么这么说呢?界面做出来了,电脑与电脑之间的通信也行了。但就是与单片机的通信还有点问题,不知是上位机的问题还是下位机的程序的问题,也难找到头绪。
   上位机是用VC写的,从放假到现在都在看VC的书,才略懂MFC与用API函数编程的区别,以及常用控件的用法。下面把一些代码贴出来:
   初始化串口代码:
 m_ctrMSComm.SetCommPort(3);   //这里是在程序中打开串口,COM3虚拟者也
 m_ctrMSComm.SetInBufferSize(1024); //接收缓冲区1024
 m_ctrMSComm.SetOutBufferSize(512); //发送缓冲区512
 if (!m_ctrMSComm.GetPortOpen())   //判断是否打开了串口.
 {
  m_ctrMSComm.SetPortOpen(TRUE);
 }
m_ctrMSComm.SetInputMode(1);   //二进制格式.
m_ctrMSComm.SetSettings("9600,n,8,1"); //波特率9600无检验位,8个数据位,1个停止位 m_ctrMSComm.SetRThreshold(1);  // 接收缓冲区有1个及1个以上字符时,将引发接收数据的OnComm事件m_ctrMSComm.SetInputLen(0);   //设置当前接收区数据长度为0,表示全部读取
 
   发送字符串代码:
UpdateData(TRUE);
CByteArray sendArr;
WORD wLength;
wLength = m_Send.GetLength();
sendArr.SetSize(wLength);
for(int i =0; i {
 sendArr.SetAt(i, m_Send.GetAt(i));         //此处是m_Send的内容!!
 }
m_ctrMSComm.SetOutput(COleVariant(sendArr));
   接收事件代码:
 UpdateData(TRUE);
 VARIANT variant_inp;
 COleSafeArray safearray_inp;
 LONG i = 0;
 int len;
 BYTE rxdData[2048];  //data receive;
 CString tmpData;   //temp data;
 switch (m_ctrMSComm.GetCommEvent())
 {
 case 1:
  break;
 case 2:      //这个是GetCommEvent事件的返回值 2表示接收缓冲区有字符.
   
  variant_inp = m_ctrMSComm.GetInput();   //接收
  safearray_inp = variant_inp;
  len = safearray_inp.GetOneDimSize();    //获得读取数据的CString类型的长度 有效者也
  for (i = 0; i < len; i++)
   {
/*    safearray_inp.GetElement(&i,&rxdData[i]);
    //safearray_inp.GetElement(&i,rxdData + i); //应该是接收数据  ??
    BYTE bt = *(char*)(rxdData+i);
    tmpData.Format("%c",bt);
    //--test!!----
   // MessageBox(tmpData);
   // m_Recv += tmpData;*/
    safearray_inp.GetElement(&i,rxdData + i);
    BYTE bt =* (char*)(rxdData+i);
    tmpData.Format("%c",bt);
    m_Recv += tmpData;
   }
/*  rxdData[i] = '\0';  //结束符
  
  m_Recv += rxdData; */
  m_Recv += "\r\n";   //每次接收完一串字符,换行.必须用"\r\n"!!! 
  UpdateData(FALSE);
  break;
 default:   //传输事件出错
  m_ctrMSComm.SetOutBufferCount(0);
  break;
 }
 
下面图片是写出来的程序与串口调试助手之间的通信。其中用的是虚拟串口,COM3与COM4.
 
阅读(904) | 评论(0) | 转发(0) |
0

上一篇:无题

下一篇:由安装软件想到的

给主人留下些什么吧!~~