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

3人阅读 评论(0) 收藏 举报
分类:

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

直接先贴代码

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



#include <iostream>  
#include <cstdlib>  
#include <windows.h>  
#include <stdlib.h>



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
);

参数列表
这里写图片描述

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

查看评论

VS2008编写tcp客户端上位机与STM32单片机通信(结构体)

一般来讲,如果上位机需要与下位机通信,最底层物理层比较常见的就是串口通信,还有一种比较方便的物理通路就是以太网。 为了通信,制定一个通信协议是很重要的,现有的需求是通过tcp上位机配置下位机的上网方...
  • u010615629
  • u010615629
  • 2017-02-26 13:29:11
  • 1636

vs2013开发上位机软件和单片机通信

1、在VS2013中创建一个窗体项目,添加代码,和串口控件 2、书写单片机控制程序主要是串口初始化,数据读写操作 3、设置上位机软件和单片机串口通信协议,主要是波特率,其他参数默认 4、调试 在...
  • lucus001
  • lucus001
  • 2014-08-01 16:16:54
  • 2469

STM32单片机上位机程序代码(供参考)(基于C#开发)

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T...
  • Mingming_Buaa
  • Mingming_Buaa
  • 2017-12-19 22:02:34
  • 353

上位机与单片机的通信问题

上位机采用的是组态王这款监控软件,单片机采用的是STM32,系统的总框架分为4层:        服务器(组态王)——网关2——网关1——节点 通信过程中遇到的问题如下: 1. 将单片机与组态王...
  • qq_38021919
  • qq_38021919
  • 2018-01-13 11:02:33
  • 237

MFC下USBHID通信Demo

  • 2017年12月20日 15:58
  • 95.38MB
  • 下载

用qt编写上位机与stm32通信

好的文章 1、Qt5.5.1实现通用串口程序https://www.2cto.com/kf/201607/524028.html 2、QT实现串口通信 https://www.2cto.com/k...
  • mao_hui_fei
  • mao_hui_fei
  • 2018-04-12 20:38:33
  • 19

Python Serial 与STM32J进行串口通讯

Python果然是一款非常简明的语言,做东西非常流畅,今天又尝试了一下用Serial做了一个控制台的串口通讯,我用的下位机是STM32F103,搞了一个多小时就成功了,可见Python的能力之强。 ...
  • freedom098
  • freedom098
  • 2015-09-03 18:52:11
  • 2546

STM32 USB 上位机程序实现

libusb 介绍libusb是开源的C库,使用该库是的用户可以在应用程序中直接访问 USB 设备,无需为 USB 设备编写内核驱动。libusb支持多个平台 (linux, window, ios)...
  • chengwenyang
  • chengwenyang
  • 2016-04-02 12:42:02
  • 6857

基于单片机蓝牙通信的安卓上位机应用

安卓设备一般都配备了蓝牙模块,我们可以使用蓝牙模块和一些外设进行数据交换,并且在安卓设备上处理和显示出来。   蓝牙编程:主要使用到系统提供的BroadcastReceiver使得我们可以对蓝牙模...
  • DevinTT
  • DevinTT
  • 2014-10-05 00:53:24
  • 2194

c#实现的串口通讯软件(上位机与单片机进行通讯)

  • 2009年07月03日 16:05
  • 275KB
  • 下载
    个人资料
    持之以恒
    等级:
    访问量: 2万+
    积分: 1518
    排名: 3万+
    最新评论