《单片机串口通信及测控应用实战详解》——6.3 PC端程序设计-阿里云开发者社区

开发者社区> 异步社区> 正文

《单片机串口通信及测控应用实战详解》——6.3 PC端程序设计

简介:
+关注继续查看

本节书摘来自异步社区《单片机串口通信及测控应用实战详解》一书中的第6章,第6.3节,作者 李江全,聂晶,梁习卉子,刘新英,更多章节内容可以访问云栖社区“异步社区”公众号查看。

6.3 PC端程序设计

6.3.1 采用Visual Basic实现

1.程序界面设计

运行VB 6.0,创建标准的工程项目文件,设计程序窗体。

(1)添加1个MSComm控件用于实现PC与单片机串口通信。

(2)添加2个按钮控件CommandButton,用于输出指令和关闭程序。

(3)添加3个文本控件TextBox,用于输入单片机地址、继电器状态和返回数据。

(4)添加5个标签控件Label,用于显示文本框功能等。

2.属性设置

程序窗体、控件对象的主要属性设置如表6-2所示。


screenshot

设计的程序界面如图6-4所示。


screenshot

3.编写程序代码

以下是实现PC与多个单片机串口通信的Visual Basic程序。

'PC发送数据01 11,表示01号单片机板继电器1和2打开
'PC发送数据01 00,表示01号单片机板继电器1和2关闭
'PC发送数据02 01,表示02号单片机板继电器1关闭,继电器2打开
'PC发送数据02 10,表示02号单片机板继电器1打开,继电器2关闭
'初始化串口
Private Sub Form_Load()
  MSComm1.CommPort = 1
  MSComm1.Settings = "9600,n,8,1"
  MSComm1.InputMode = 1
  MSComm1.SThreshold = 1
  MSComm1.RThreshold = 1
  MSComm1.PortOpen = True
End Sub
'状态输出
Private Sub Cmdout_Click()
  Dim uout1 As Variant                                  '单片机地址号
  Dim uout2 As Variant                                     '单片机继电器状态值
  uout1 = "&H" & Val(addrText.Text)
  uout2 = "&H" & Val(dataText.Text)
  MSComm1.Output = Chr(uout1) & Chr(uout2)    '将十六进制数据值发送给单片机
End Sub
'返回数据
Private Sub MSComm1_OnComm()
  Dim Inbyte() As Byte
  Dim buffer As String
  Dim strdata(10) As String
  Dim datanum As String
  Select Case MSComm1.CommEvent
    Case comEvReceive
      Inbyte = MSComm1.Input                              '读取单片机返回的数据串
      For i = LBound(Inbyte) To UBound(Inbyte)
        buffer = buffer + Hex(Inbyte(i)) + Chr(32)     '获得单片机返回数据串
      Next i
    Case comEvSend
  End Select
    For jj = 1 To 6
      strdata(jj) = Mid(Trim(buffer), jj, 1)             '从数据串中逐个取位
    Next jj
    If Len(Trim(buffer)) = 3 Then
      datanum = "0" & strdata(1) & strdata(2) & "0" & strdata(3)
    End If
    If Len(Trim(buffer)) = 4 Then
      datanum = "0" & strdata(1) & strdata(2) & strdata(3) & strdata(4)
    End If
  receiveText.Text = datanum                '显示单片机返回的数据串
End Sub
'关闭程序
Private Sub Cmdexit_Click()
   MSComm1.PortOpen = False
   Unload Me
End Sub

4.运行程序

程序设计、调试完毕后,运行程序。

PC通过串行口将十六进制数发送给多个单片机,驱动地址吻合的单片机继电器动作,并在数码管显示接收的数。单片机接收到数据后,返回原数据给PC。

如PC发送十六进制数据“01 11”,驱动1号单片机板继电器1和2打开,单片机返回十六进制数据“01 11”。

程序运行界面如图6-5所示。


screenshot

6.3.2 采用Visual C++实现

1.程序界面设计

程序界面设计与VB多单片机通信基本相同。设计的程序界面如图6-6所示。


screenshot

2.编写程序代码

以下是实现PC与多个单片机串口通信的VC++参考程序。

#include "stdafx.h"
#include "mcu.h"
#include "mcuDlg.h"
//串口初始化设置
BOOL CMcuDlg::OnInitDialog()
{
  m_Comm.SetCommPort(1);   //选择COM1
  m_Comm.SetInputMode(1); //输入方式为二进制方式    
  m_Comm.SetRThreshold(1); //参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件
  m_Comm.SetSThreshold(1);//参数1表示当传输缓冲区完全空时将引发一个接收数据的OnComm事件
  m_Comm.SetSettings("9600,n,8,1"); 
  m_Comm.SetPortOpen(TRUE);//打开串口
  return TRUE;  
}
//发送数据
void CMcuDlg::OnOK() 
{
  CByteArray data;
  CString a,b;
  int len;
  UpdateData(TRUE);  //读编辑框内容
  len = Str2Hex(m_address+m_data,data); 
  m_Comm.SetOutput(COleVariant(data));  
}
//接受返回数据
void CMcuDlg::OnOnCommMscomm1() 
{
  VARIANT data;
  COleSafeArray data2;
  CByteArray datatemp;
  LONG k = 0;
  BYTE Inbyte[2]; //设置BYTE数组
  CString strtemp;  
  if(m_Comm.GetCommEvent() =  = 2) //事件值为2表示接收缓冲区内有字符
  {
    data = m_Comm.GetInput();  //读缓冲区
      data2 = data;  //VARIANT型变量转换为ColeSafeArray型变量
    data2.GetElement(&k,&Inbyte[0]);//获取回传数据,前两个字节
    k++;
    data2.GetElement(&k,&Inbyte[1]);

  }
  strtemp.Format("%s  %s",HexChar(Inbyte[0]),HexChar(Inbyte[1])); 
  m_receive = strtemp;
  UpdateData(false);
}
//十六进制转为字符串
char* CMcuDlg::HexChar(BYTE idata)
{
     char *temp = new char[3];
  char a,b;
  temp[2] = '\0';
  a = idata>>4;
  b = idata&0x0f;
  if(a<9)
    temp[0] = (a+48);
  else 
    temp[0] = (a+55);
  if(b<9)
    temp[1] = (b+48);
  else 
    temp[1] = (b+55);
  return temp;  
}
//将字符转换十六进制
char CMcuDlg::HexChar(char c)
{
  if((c> = '0')&&(c< = '9'))
    return c-0x30;
  else if((c> = 'A')&&(c< = 'F'))
    return c-'A'+10;
  else if((c> = 'a')&&(c< = 'f'))
    return c-'a'+10;
  else 
    return -1;
}
//把字符串转换为十六进制
int CMcuDlg::Str2Hex(CString str, CByteArray &senddata)
{
  int hexdata,lowhexdata;
   int hexdatalen = 0;
   int len = str.GetLength();
   senddata.SetSize(len/2);
   for(int i = 0;i<len;)
   {
     char lstr,hstr = str[i];
     if(hstr =  = ' ')
     {
       i++;
       continue;
     }
     i++;
     if(i> = len)
       break;
     lstr = str[i];
     hexdata = HexChar(hstr);    //高位转换
     lowhexdata = HexChar(lstr); //低位转换
     if((hexdata =  = 16)||(lowhexdata =  = 16))
       break;
     else 
       hexdata = hexdata*16+lowhexdata;
     i++;
     senddata[hexdatalen] = (char)hexdata;
     hexdatalen++;
   }
   return hexdatalen;
}
//关闭串口退出程序
void CMcuDlg::OnCancel() 
{
  m_Comm.SetPortOpen(false);//关闭串口
  CDialog::OnCancel();
}

3.运行程序

程序设计、调试完毕,运行程序。

PC通过串行口将十六进制数发送给多个单片机,驱动地址吻合的单片机继电器动作,并在数码管显示接收的数。单片机接收到数据后,返回原数据给PC。

如PC发送十六进制数据“02 11”,驱动2号单片机板继电器1和2打开,单片机返回十六进制数据“0211”。

程序运行界面如图6-7所示。


screenshot

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
提高 Web 应用程序安全性:威胁和对策
http://msdn.microsoft.com/library/ms994921.aspx
495 0
关于NOR_FLASH的大小在单片机程序中的应用
在单片机开发中,NOR_FLASH常用的有4M和8M的大小: 4M的FLASH在程序中可以这样表示:Ptr < 0x220000 8M的FLASH在程序中可以这样表示:Ptr < 0x400000(最大只能读到0x3fffff) 有了这个关系,在判断NOR_FLASH好坏的方法上我们可以采用计算checksum的方式来校验。
631 0
【终极解决方案】为应用程序池“XXX”提供服务的进程在与 Windows Process Activation Service 通信时出现严重错误。该进程 ID 为“XXXX”。数据字段包含错误号。
原文:【终极解决方案】为应用程序池“XXX”提供服务的进程在与 Windows Process Activation Service 通信时出现严重错误。该进程 ID 为“XXXX”。数据字段包含错误号。
2164 0
xcode反汇编调试iOS模拟器程序(四)自动断点应用之NSNotificationCenter
知道怎么查看后,先看看有什么实际应用,拿NSNotificationCenter来做实践吧。 首先在某个容易进入的地方加断点,并停在那,例如main函数。
890 0
Windows C++ 应用程序通用日志组件(组件及测试程序下载)
引言   众所周知,在调试、跟踪和执行应用程序的过程中,程序的日志能为这些工作提供大量有价值的运行信息。因此,程序的日志对应用程序的运行、维护至关重要。   在如何记录程序日志方面,通常有三种选择:   1、采用Log4CXX等公共开源日志组件:这类日志组件的特点是跨平台且功能比较强大,例如可以把日志发往另一台服务器或记录到数据库中等;另外,可配置性较高,可以通过配置文件或程序代码对日志进行很多个性化设置。
724 0
SpringCloud微服务实战(六)-统一配置中心
1 统一配置中心概述 为什么需要统一配置中心 2 Config Server 直接运行报错,因为会从 git拉取配置文件 在 Git 建立新仓库存放配置文件 ...
1017 0
+关注
异步社区
异步社区(www.epubit.com)是人民邮电出版社旗下IT专业图书旗舰社区,也是国内领先的IT专业图书社区,致力于优质学习内容的出版和分享,实现了纸书电子书的同步上架,于2015年8月上线运营。公众号【异步图书】,每日赠送异步新书。
11938
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载