单片机与计算机通信(上位机)——基于VS2017和stm32

发布者:MysticalEssence最新更新时间:2020-02-26 来源: eefocus关键字:单片机  计算机通信  上位机  VS2017  stm32 手机看文章 扫描二维码
随时随地手机看文章

**程序说明:**VSwin32命令控制台程序 调用串口,可以根据自己需要配置串口,完成windows与单片机的数据传输。可作为开发参考使用。


直接先贴代码


//32与单片机通信,差不多成功了


#include   

#include   

#include   

#include


using namespace std;

HANDLE hComm;

OVERLAPPED OverLapped;

COMSTAT Comstat;

DWORD dwCommEvents;


char g_UartRxBuffer[6] = { 0x0d,1,2,3,4,0x0a };


//int g_UartRxBuffer[0] = 0x0d;//

//int g_UartRxBuffer[1] = 99;

//int g_UartRxBuffer[2] = 0;

//int g_UartRxBuffer[3] = 0;

//int g_UartRxBuffer[4] = 99;

//int g_UartRxBuffer[5] = 0x0a;


bool OpenPort();  //打开串口  

bool SetupDCB(int rate_arg);  //设置DCB  

bool SetupTimeout(DWORD ReadInterval, DWORD ReadTotalMultiplier, DWORD

    ReadTotalConstant, DWORD WriteTotalMultiplier, DWORD WriteTotalConstant);   //设置超时  

void ReciveChar();   //接收字符  

bool WriteChar(char* szWriteBuffer, DWORD dwSend);  //发送字符  


bool OpenPort()

{

    hComm = CreateFile(L"COM6",//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!此处更改com口!!!!!!!!!!!!!!!

        GENERIC_READ | GENERIC_WRITE,

        0,

        0,

        OPEN_EXISTING,

        FILE_FLAG_OVERLAPPED,

        0);

    if (hComm == INVALID_HANDLE_VALUE)

        return FALSE;

    else

        return true;

}


bool SetupDCB(int rate_arg)

{

    DCB dcb;

    memset(&dcb, 0, sizeof(dcb));

    if (!GetCommState(hComm, &dcb))//获取当前DCB配置  

    {

        return FALSE;

    }

    dcb.DCBlength = sizeof(dcb);

    /* ---------- Serial Port Config ------- */

    dcb.BaudRate = rate_arg;

    dcb.Parity = NOPARITY;

    dcb.fParity = 0;

    dcb.StopBits = ONESTOPBIT;

    dcb.ByteSize = 8;

    dcb.fOutxCtsFlow = 0;

    dcb.fOutxDsrFlow = 0;

    dcb.fDtrControl = DTR_CONTROL_DISABLE;

    dcb.fDsrSensitivity = 0;

    dcb.fRtsControl = RTS_CONTROL_DISABLE;

    dcb.fOutX = 0;

    dcb.fInX = 0;

    dcb.fErrorChar = 0;

    dcb.fBinary = 1;

    dcb.fNull = 0;

    dcb.fAbortOnError = 0;

    dcb.wReserved = 0;

    dcb.XonLim = 2;

    dcb.XoffLim = 4;

    dcb.XonChar = 0x13;

    dcb.XoffChar = 0x19;

    dcb.EvtChar = 0;

    if (!SetCommState(hComm, &dcb))

    {

        return false;

    }

    else

        return true;

}


bool SetupTimeout(DWORD ReadInterval, DWORD ReadTotalMultiplier, DWORD

    ReadTotalConstant, DWORD WriteTotalMultiplier, DWORD WriteTotalConstant)

{

    COMMTIMEOUTS timeouts;

    timeouts.ReadIntervalTimeout = ReadInterval;

    timeouts.ReadTotalTimeoutConstant = ReadTotalConstant;

    timeouts.ReadTotalTimeoutMultiplier = ReadTotalMultiplier;

    timeouts.WriteTotalTimeoutConstant = WriteTotalConstant;

    timeouts.WriteTotalTimeoutMultiplier = WriteTotalMultiplier;

    if (!SetCommTimeouts(hComm, &timeouts))

    {

        return false;

    }

    else

        return true;

}


void ReciveChar()

{

    bool bRead = TRUE;

    bool bResult = TRUE;

    DWORD dwError = 0;

    DWORD BytesRead = 0;

    char RXBuff;

    for (;;)

    {

        bResult = ClearCommError(hComm, &dwError, &Comstat);

        if (Comstat.cbInQue == 0)

            continue;

        if (bRead)

        {

            bResult = ReadFile(hComm,  //通信设备(此处为串口)句柄,由CreateFile()返回值得到  

                &RXBuff,  //指向接收缓冲区  

                1,  //指明要从串口中读取的字节数  

                &BytesRead,   //  

                &OverLapped);  //OVERLAPPED结构  

            std::cout << RXBuff << std::endl;

            if (!bResult)

            {

                switch (dwError == GetLastError())

                {

                case ERROR_IO_PENDING:

                    bRead = FALSE;

                    break;

                default:

                    break;

                }

            }

        }

        else

        {

            bRead = TRUE;

        }

    }

    if (!bRead)

    {

        bRead = TRUE;

        bResult = GetOverlappedResult(hComm,

            &OverLapped,

            &BytesRead,

            TRUE);

    }

}


bool WriteChar(char* szWriteBuffer, DWORD dwSend)

{

    bool bWrite = TRUE;

    bool bResult = TRUE;

    DWORD BytesSent = 0;

    HANDLE hWriteEvent = NULL;

    ResetEvent(hWriteEvent);

    if (bWrite)

    {

        OverLapped.Offset = 0;

        OverLapped.OffsetHigh = 0;

        bResult = WriteFile(hComm,  //通信设备句柄,CreateFile()返回值得到  

            szWriteBuffer,  //指向写入数据缓冲区  

            dwSend,  //设置要写的字节数  

            &BytesSent,  //  

            &OverLapped);  //指向异步I/O数据  

        if (!bResult)

        {

            DWORD dwError = GetLastError();

            switch (dwError)

            {

            case ERROR_IO_PENDING:

                BytesSent = 0;

                bWrite = FALSE;

                break;

            default:

                break;

            }

        }

    }

    if (!bWrite)

    {

        bWrite = TRUE;

        bResult = GetOverlappedResult(hComm,

            &OverLapped,

            &BytesSent,

            TRUE);

        if (!bResult)

        {

            std::cout << "GetOverlappedResults() in WriteFile()" << std::endl;

        }

    }

    if (BytesSent != dwSend)

    {

        std::cout << "WARNING: WriteFile() error.. Bytes Sent:" << BytesSent << "; Message Length: " << strlen((char*)szWriteBuffer) << std::endl;

    }

    return TRUE;

}

int main(int argc, char** argv)

{

    if (OpenPort())

        std::cout << "Open port success" << std::endl;

    if (SetupDCB(9600))//!!!!!!!!!!!!!!!!!!!此处更改波特率!!!!!!!!!!!!!!!!!!!!!!

        std::cout << "Set DCB success" << std::endl;

    if (SetupTimeout(0, 0, 0, 0, 0))

        std::cout << "Set timeout success" << std::endl;

    PurgeComm(hComm, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT);


    while (1)

    {

        WriteChar(g_UartRxBuffer, 6);//可以自行设置分部发送




    //  ReciveChar();


        cout <<"正在发送"<< endl;

    }


分析

主要就是下面5个函数构成 

bool OpenPort(); //打开串口


bool SetupDCB(int rate_arg); //设置DCB


bool SetupTimeout(DWORD ReadInterval, DWORD ReadTotalMultiplier, DWORD 

ReadTotalConstant, DWORD WriteTotalMultiplier, DWORD WriteTotalConstant); //设置超时


void ReciveChar(); //接收字符


bool WriteChar(char* szWriteBuffer, DWORD dwSend); //发送字符


一、bool OpenPort(); //打开串口 

里面主要调用了一个CreateFile()函数 

这个函数的功能是创建或者打开一个文件或者I/O设备,通常使用的I/O形式有文件、文件流、目录、物理磁盘、卷、终端流等。如执行成功,则返回文件句柄。 INVALID_HANDLE_VALUE 表示出错,会设置 GetLastError 。 

函数的声明定义:


  HANDLE WINAPI CreateFile(

  _In_      LPCTSTR lpFileName,              

  _In_      DWORD dwDesiredAccess,

  _In_      DWORD dwShareMode,

  _In_opt_  LPSECURITY_ATTRIBUTES lpSecurityAttributes,

  _In_      DWORD dwCreationDisposition,

  _In_      DWORD dwFlagsAndAttributes,

  _In_opt_  HANDLE hTemplateFile

);


参数列表 

这里写图片描述

该函数第一个参数那里可以更改串口号

关键字:单片机  计算机通信  上位机  VS2017  stm32 引用地址:单片机与计算机通信(上位机)——基于VS2017和stm32

上一篇:stm32实时时钟——RTC
下一篇:stm32的堆和栈

推荐阅读最新更新时间:2024-11-04 10:16

TI拓展Tiva C系列MCU产品 为互联产品推出云技术网关
德州仪器 (TI) 宣布为 Tiva™C 系列微控制器 (MCU) 平台新增最新产品。这些 Tiva TM4C129x MCU 是业界首批具有以太网 MAC+PHY 的 ARM® Cortex™-M4 MCU,可帮助创建复杂、高度互联的新型产品,其不仅可用来进行云桥接,而且还可简化不断发展的物联网 (IoT)。特性丰富的 TivaTM4C129x MCU 提供前所未有的丰富同步连接选项,以及片上数据保护与 LCD 控制器,不仅可显著节省板级空间,还可实现高级互联应用,充分满足家庭/楼宇自动化网关、人机界面(HMI)、网络化传感器网关、安全接入系统以及可编程逻辑控制器等应用需求。 开发人员可使用现已上市的 Tiva DK-TM4C12
[单片机]
MathWorks专访:如何用STM32设计出超越AI的智能应用
业界应如何看待边缘人工智能?ST授权合作伙伴 MathWorks 公司的合作伙伴团队与ST 共同讨论了对边缘机器学习的看法,并与 STM32 社区分享了他们的设计经验。 MathWorks的 MATLAB® 和 Simulink® 软件闻名业界。MATLAB®软件工具可让科学家分析数据,开发算法,创建模型;Simulink®软件可以创建模型化设计,仿真测试动态系统,支持 STM32 MCU,开发、部署和优化在 STM32 MCU上运行的应用。MathWorks 为开发者提供MCU AI开发部署工具,业务范围涵盖许多领域,包括控制设计、信号处理和嵌入式系统设计,以及许多专用附加产品。公司不仅在学术界享有盛誉,在航空航天、
[单片机]
MathWorks专访:如何用<font color='red'>STM32</font>设计出超越AI的智能应用
单片机多微机系统共享RAM电路
  目前,多微机系统在许多方面得到了应用,诸如工业机器人控制、数控机床控制等。于是,多机之间的通信便成为多机系统的技术关键。特别是对数据传送有特殊要求的场合,更要解决好多机间的通信问题。如在工业机器人的控制中,对数据的传送就有如下要求:①主、从机要共享许多数据;②主、从机需要快速交换信息。在这种特殊要求下,传统的串行、并行通信就难以满足要求,而采用多机共享RAM电路,既能满足要求,又具有简单、可靠、通用性好等优点。 一、电路原理   图1- 87所示为实际电路图。图中共用的RAM为6264.它有8根数据总线(Do~D7),13根地址总线( Ao~A12),4根控制总线(WR、OE、CS、CS),2根电源线。当两微机系统共用RA
[单片机]
<font color='red'>单片机</font>多微机系统共享RAM电路
【51单片机快速入门指南】2.4:74HC595、LED点阵屏及其SPI控制
普中51-单核-A2 STC89C52 Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 硬知识 选自《普中51单片机开发攻略_V1.2》 IO 口扩展方式-串转并 使用的芯片是 74HC595。开发板板载 1 个 74HC595 芯片,仅需单片机 3 个 IO 口即可扩展 8 个,如果需要还可以将 2 个 74HC595 级联扩展出 16 个 IO,这就实现用少数 IO 资源控制多个设备。 74HC595 芯片介绍 74HC595 是一个 8 位串行输入、并行输出的位移缓存器,其中并行输出为三 态输出(即高电平、低电平和高
[单片机]
【51<font color='red'>单片机</font>快速入门指南】2.4:74HC595、LED点阵屏及其SPI控制
关于STM32的以太网问题集锦
1、STM32F107以太网接收中断进不了 问:我把操作系统去掉之后接收中断就进不去了,原来带着操作系统是可以进去的,我的PHY是DP83848,初始化完成之后,以太网的电源灯是亮的,我用pc发数据的时候数据灯也会亮,但是就是进不了中断,驱动程序应该没问题,因为我没有修改,我是在MDK下做的,求指点,谢谢。 答:你检查一下配置,有没有开启中断? 2、求助啊怎么把其他文件放到板子里呢 问:我看LwIP(轻量级IP协议)的例子,里头index.html是放到fsdata.c里的,作为一个大数组被存起来的……满觉就跟dos时代调用debug一样啊…… 请问有更方便的方法么? 比如厂家有工具软件可以读、改flash的内
[单片机]
全方位解析“久经沙场”的8051架构MCU
  有的朋友或许看到这篇文章会不屑的说:8051早就淘汰了,现在是STM32/8、MSP430的天下了,不可否认STM、MSP的实力,但8051却仍是目前用的最多的微控制器,只因为经典!   相信只要在行业中提到8051微控制器,无人不知无人不晓,无论你是资深业界领袖还是刚步入电子行业的毕业生,对8051微控制器都有着同样答案:经典,由衷的给个赞!   凭借 Atmel 各种基于 8051 指令集的功能丰富的8位微控制器,可以确保我们8051设计是优秀的。所以无论工程师们采用的是传统、现有还是全新的设计,您都能获得最新的特性和功能,同时产品提供了从2KB到64KB各种规模的闪存存储器……   NO.1: AT89LP 系列闪
[单片机]
STM32 网络通信Web Server中 SSI与CGI的应用解析
本次主要解析STM32网络通信中WebServer应用,从网页界面的编写到浏览器与STM32之间进行通信的数据来说明SSI与CGI的原理及应用,并对GET与POST指令进行应用解析。 硬件和软件环境: 1.硬件环境:STM32F407,网卡芯片LAN8720,其他部分参考正点原子的407探索者开发板。 2.软件环境:keil5,LWIP1.4.1,主要是基于正点原子STM32F407探索者的第六十章网络通信实验程序。 一、程序流程解析 为了方便查看浏览器与STM32之间的数据通信,建议程序中使用固定IP的方式,如192.168.1.101,建议使用软件Wireshark来查看网络数据。 首先是打开Wireshark,选
[单片机]
<font color='red'>STM32</font> 网络<font color='red'>通信</font>Web Server中 SSI与CGI的应用解析
stm32+GPS定位
这周是个巨大任务,GPS模块调试。听着是挺高大上的样子,不过拿到模块的时候,还是什么都不懂,于是开始我的研究之旅。首先。直接用串口接GPS模块,连上电脑。打开串口调试助手,会看到模块给PC机发很多串口信息,如下: $GPRMC,055818.00,V,,,,,,,110515,,,N*7D $GPVTG,,,,,,,,,N*30 $GPGGA,055818.00,,,,,0,05,86.72,,,,,,0000*69 $GPGSA,A,1,27,42,31,26,50,,,,,,,,99.99,86.72,99.99*3B $GPGSV,3,1,12,08,24,044,35,09,31,315,,10,00,317,,16,67
[单片机]
热门资源推荐
热门放大器推荐
  •  zip文件usb_host_device_code
  •  rar文件自动识别的垃圾清扫车
  •  pdf文件单片机C语言编程与Proteus仿真技术 (徐爱钧)
  •  pdf文件单片机C语言程序设计及仿真
  • 系统发生错误

    系统发生错误

    您可以选择 [ 重试 ] [ 返回 ] 或者 [ 回到首页 ]

    [ 错误信息 ]

    页面错误!请稍后再试~

小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved