zoukankan      html  css  js  c++  java
  • 串口通信

    串口通信

    波特率:每秒发送的比特位

    很少用串口传送文件,因为速度太慢了,主要完成控制和检测

    添加ActiveX控件Microsoft Communitions Control

    串口通信和网络通信一样,需要一直监听是否有数据来了

    程序采用一个通用的多串口多线程类CSerialPortEx来处理底层串口通信细节

    按照自定义串口通信协议SPCP建立连接,实现数据的传输功能

    串行端口的本质功能是作为CPU和串行设备间的编码转换器

    vs中删除资源应在基类的OnDestroy之前,否则可能会出错

    error LNK2001: 无法解析的外部符号 "public: virtual struct CRuntimeClass * __,查看解决方案里面是不是某个文件丢失了

    在for循环条件中定义的变量,出了for循环,就出了作用域

    VC添加串口程序:

    1.添加MSComm控件:

    Project->Add To Project->Component and Controls

    在弹出的对话框中“Component and Controls Gallery”中选Microsoft Communication Controls Version 6.0

    2.设置串口:

    if(m_Comm.GetPortOpen())

    {

    m_SetPortOpen(false);//设置串口配置信息前先关闭串口

    }

    m_Comm.SetCommPort(1); //com1串行口

    m_Comm.Settings("9600,n,8,1"); //设置波特率为9600,无奇偶校验,数据位8位,停止位1位

    m_Comm.SetInputMode(1); //设置数据通讯格式为二进制数组格式

    m_Comm.setThreashold(1); //设置每次收到一个字节数据就触发OnComm事件

    if(!m_comm.GetPortOpen())

    {

    m_Comm.SetPortOpen(TRUE);

    }

    m_CommGetInput(); //清除串口输入缓冲区中残留的数据

    3.添加发送过程:

    m_Comm.SetOutput(COleVariant(m_Array))//m_Array为字节数组CByteArray

    4.添加接收数据消息:

    int nEvent = m_Comm.GetCommEvent();

    switch(nEvent)

    {

    case 2:

    {

    len = m_Comm.GetInBufferCount();

    if(len > 0)

    {

    m_input = m_Comm.GetInput();

    char * str = (char*)(unsigned char *)m_input.parray->pvData;

    }

    *(str + len) = '';

    }

    }

    vs2005中实现串口通信:

    1.添加ActiveX控件:

    选中资源对话框,在右键菜单中选中“插入ActiveX控件”

    2.添加CMSMComm类

    选中类视图,右键菜单选择“添加类”

    在对话框中选择“ActiveX控件中的MFC类”,点击添加

    3.定义CMSComm类型变量

    4.设置CMSComm变量

    m_Comm.put_CommPort(1) //选择串口

    m_Comm.put_Setttings(_T("9600,n,8,1")) //设置波特率等参数

    m_Comm.put_RThreshold(1) //接收1个字节后产生事件

    m_Comm.put_InputMode(1) //设置输入方式为二进制

    m_Comm.put_InBufferSize(1024) //设置输入缓冲区大小

    m_Comm.put_OutBufferSize(512) //设置输出缓冲区大小

    m_Comm.get_PortOpen() //查看端口是否打开

    m_Comm.put_PortOpen(true) //打开端口

    5.添加OnCommMscomm1消息事件,当接受缓冲区有数据时,会触发此事件

    事件2是接收数据

    COleSafeArray safearray;

    char rxdata[1000];

    switch(m_Comm.get_CommEvent()) //得到事件类型

    {

    case 2:

    {

    safearray = m_Comm.get_Input(); //得到缓冲区数据

    int len;

    long i;

    len = safearray.GetOneDimSize(); //得到数组大小

    for(long i = 0;i<len;i++)

    {

    safearray.GetElement(&i,&rxdata[i]); //得到数组第i的元素

    }

    rxdata[i] = '';

    }

    }

    6.添加发送过程

    int count = strSend.GetLength();

    CByteArray Array;

    for(int i=0;i<count;i++)

    {

    Array.SetAt(i,strSend[i]);

    }

    m_Comm.put_Output(COleSafeArray(Array));

  • 相关阅读:
    Cloudera Manager安装之利用parcels方式安装3或4节点集群(包含最新稳定版本或指定版本的安装)(添加服务)(CentOS6.5)(五)
    Cloudera Manager安装之利用parcels方式安装单节点集群(包含最新稳定版本或指定版本的安装)(添加服务)(CentOS6.5)(四)
    Cloudera Manager安装之Cloudera Manager 5.3.X安装(三)(tar方式、rpm方式和yum方式)
    Cloudera Manager安装之时间服务器和时间客户端(二)
    Cloudera Manager安装之Cloudera Manager安装前准备(CentOS6.5)(一)
    Cloudera Manager架构原理
    Cloudera Manager是啥?主要是干啥的?
    HDU-1664-Different Digits(BFS)
    AdapterView&lt;?&gt; arg0, View arg1, int arg2, long arg3參数含义
    c++11 新特性之 autokeyword
  • 原文地址:https://www.cnblogs.com/xiaoxiaocaicai/p/3595343.html
Copyright © 2011-2022 走看看