mxx_123 2021-11-01 16:42 采纳率: 50%
浏览 106
已结题

C语言,用windows窗口怎么显示串口收到的数据

#做了一个串口读取数据的程序,对数据进行分类处理,一个建立windows窗口的程序,该怎么让这两个程序合并到一块,windows窗口显示串口变化的数据,
串口读取程序:

//#define _CRT_SECURE_NO_WARNINGS
//#include <stdio.h>
//#include <windows.h>
//#include <string.h>
//#include <conio.h>
//#include "tchar.h"
//int main()
//{
// HANDLE hCom1;
// hCom1 = CreateFile(_T("COM3"),//COM1口
//  GENERIC_READ | GENERIC_WRITE,//允许读和写
//  0,//独占方式
//  NULL,
//  OPEN_EXISTING,//打开而不是创建
//  0,//同步方式
//  NULL);
// if (hCom1 == (HANDLE)-1)
// {
//  printf("打开COM失败!\n");
//  return FALSE;
// }
// else
// {
//  printf("COM打开成功!\n");
// }
// SetupComm(hCom1, 20480, 20480);//输入缓冲区和输出缓冲区的大小都是1024
// COMMTIMEOUTS TimeOuts;
// //设定读超时
// TimeOuts.ReadIntervalTimeout = 1000;
// TimeOuts.ReadTotalTimeoutMultiplier = 500;
// TimeOuts.ReadTotalTimeoutConstant = 5000;
// //设定写超时
// TimeOuts.WriteTotalTimeoutMultiplier = 500;
// TimeOuts.WriteTotalTimeoutConstant = 2000;
// SetCommTimeouts(hCom1, &TimeOuts);//设置超时
// DCB dcb1;
// GetCommState(hCom1, &dcb1);
// dcb1.BaudRate = 19200;//波特率为19200
// dcb1.ByteSize = 8;//每个字节有8位
// dcb1.Parity = NOPARITY;//无奇偶校验位
// dcb1.StopBits = TWOSTOPBITS;//两个停止位
// dcb1.fParity = FALSE;
// dcb1.fNull = FALSE;
// SetCommState(hCom1, &dcb1);
// DWORD wCount=27;//读取的字节数
// PurgeComm(hCom1, PURGE_TXCLEAR | PURGE_RXCLEAR);//清空缓冲区
//     /*TAOFENG_01:*/
//  unsigned char str[1204]={0}/*=0x100F*/;
//
// unsigned int i = 0;
//  float a = 100.0;
//  float b = 10.0;
//  long int mbweizhi;
//  float mbweizhi1;
//  float dianliu;
//  short int sudu ;
//  float dianya;
//  long int dqweizhi;
//  float dqweizhi1;
//  short int zuli ;
//  float ADceliang;
//  short int yxzhuangtai ;
//  short int guzhang;
//  short int tiaoshizhi;
//
//
//  while (1)
//  {
//
//  if (!ReadFile(hCom1, str, wCount, &wCount, NULL))
//    {
//    printf("读串口失败!");
//    return FALSE;
//    }
//   else
//     {
//         if(str[0] == 0x5a && str[1] == 0xa5)
//         {
//            printf("读串口成功!\n读取数据为:\n");
//            printf("第一第二个字节为:%02X% 02X\n ",str[0],str[1]);
//            for(i=0;i<wCount;i++)
//            { 
//                printf("%02X ",str[i]);
//            }
//            printf("\n");
//            //目标位置
//            mbweizhi=(str[4]*16777216+str[5]*65536+str[6]*256+str[7]);
//            mbweizhi1=mbweizhi/b;
//            //当前位置
//            dqweizhi=(str[12]*16777216+str[13]*65536+str[14]*256+str[15]);
//            dqweizhi1=dqweizhi/b;
//            sudu=(str[16]*256+str[17]);//速度
//            dianya=(str[18]*256+str[19])/a;//电压
//            dianliu=(str[10]*256+str[11])/a;//电流
//            zuli=(str[20]*256+str[21]);//阻力
//            yxzhuangtai=(str[2]*256+str[3]);//运行状态
//            ADceliang=(str[22]*256+str[23]);//AD
//            guzhang=(str[8]*256+str[9]);//故障代码
//            tiaoshizhi=(str[24]*256+str[25]);//调试值
//            //if()
//            //{
//            printf("电机运行状态:%d \n",yxzhuangtai);//printf("电机运行状态:%02X %02X\n",str[2],str[3]);
//            //}
//            //if()
//            //{
//            printf("电机目标位置:%.2f 度\n",mbweizhi1);//printf("电机目标位置:%02X %02X \n",str[4],str[5],str[6],str[7]);
//            //}
//            //if()
//            //{
//            printf("电机故障:%d \n",yxzhuangtai);//printf("电机故障代码:%02X %02X\n",str[8],str[9]);
//            //}
//            printf("电机当前供电电流:%.2f A\n",dianliu+0.1);//printf("电机电流:%02X %02X\n",str[10],str[11]);
//            printf("电机当前位置:%.2f 度\n",dqweizhi1);//printf("电机当前位置:%02X %02X %02X %02X\n",str[12],str[13],str[14],str[15]);
//            printf("电机当前速度:%dr/min\n",sudu);//printf("电机当前速度:%02X %02X \n",str[16],str[17]);
//            printf("电机当前供电电压:%.2f V\n",dianya+1);//printf("电机当前速度:%02X %02X \n",str[16],str[17]);
//            printf("电机当前阻力:%d \n",zuli);//printf("电机当前遇到的阻力:%02X %02X\n",str[20],str[21]);
//            printf("电机AD测量值:%.3f V\n",ADceliang);//printf("电机AD测量值:%02X %02X\n",str[22],str[23]);
//            printf("电机调试值:%d \n",tiaoshizhi);//printf("电机调试值:%02X %02X\n",str[24],str[25]);
//
//         }
//    
//      }
//  }
//PurgeComm(hCom1, PURGE_TXCLEAR | PURGE_RXCLEAR);//清空缓冲区
//
//}

建设窗口程序:


#define _CRT_SECURE_NO_WARNINGS 1
#include <windows.h>
#include <tchar.h>


#define IDB_ONE        3301//按键1
#define IDB_TWO        3302//2
#define IDB_THREE    3303//3
#define IDB_FOUR    3303//4

LRESULT _stdcall WndProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam);


HINSTANCE hg_app;//全局实例句柄
 
int _stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
 HWND hwnd;
 WNDCLASS wndcls;//设置这个结构的不同字段
 MSG msg;
 /*注册窗口*/
 wndcls.cbClsExtra=0;
 wndcls.cbWndExtra=0;
 wndcls.hbrBackground=(HBRUSH)COLOR_WINDOW;
 wndcls.hCursor=LoadCursor(NULL,IDC_ARROW);//图标
 wndcls.hIcon=LoadIcon(NULL,IDI_APPLICATION);
 wndcls.hInstance=hInstance;
 wndcls.lpfnWndProc=WndProc;//过程函数
 wndcls.lpszClassName=_T("ClassName");//ASCIIZ形式的窗口类名称的地址,每一个应用程序必须有一个窗口类,类名
 wndcls.lpszMenuName=_T("MenuName");//ASCIIZ形式的窗口名称的地址。该名称会显示在标题条上
 wndcls.style=CS_HREDRAW | CS_VREDRAW;
 RegisterClass(&wndcls);//注册这个窗口类型,wndcls
 /**/
 
 /*创建、显示窗口*/
 hwnd=CreateWindow(_T("ClassName"),//窗口类名,
_T("采集窗口"),//窗口标题
WS_OVERLAPPEDWINDOW,//窗口样式
0,//距离屏幕左上角横坐标
0,//距离屏幕左上角横坐标
600,//窗口宽度
400,//窗口高度
NULL,//副窗口句柄
NULL,//菜单句柄
hInstance,//当前实例句柄
NULL);//指向一个值的指针,传递给窗口消息,一般为NULL
 ShowWindow(hwnd,SW_SHOWNORMAL);//显示窗口
 UpdateWindow(hwnd);//更新窗口

 /*CreateWindow创建一个模板*/

 
 /*消息循环,退出循环表示程序结束*/
 while(GetMessage(&msg,NULL,0,0))
 {
  TranslateMessage(&msg);//翻译消息
  DispatchMessage(&msg);//分发消息给过程函数
 }
 /*↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑*/ 
 
 return (int)msg.wParam;
}

//*窗口过程函数*/  
LRESULT _stdcall WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
 switch(uMsg)//循环
 {
 /*case WM_COMMAND:
  return DefWindowProc(hwnd, uMsg, wParam, lParam);*/
  break;
  case WM_CREATE:
        {
            //创建三个按钮
            CreateWindow(L"Button", L"开始", WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,
                35, 10, 160, 60, hwnd, (HMENU)IDB_ONE, hg_app, NULL);
            CreateWindow(L"Button", L"按钮二", WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,
                35, 80, 160, 60, hwnd, (HMENU)IDB_TWO, hg_app, NULL);
            CreateWindow(L"Button", L"按钮三", WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,
                35, 150, 160, 60, hwnd, (HMENU)IDB_THREE, hg_app, NULL);
        
        }
  break;
  case WM_COMMAND:
        {
            switch(LOWORD(wParam))
            {
            case IDB_ONE:
                //MessageBox(hwnd, L"您点击了第一个按钮。", L"提示", MB_OK | MB_ICONINFORMATION);
                SendMessage((HWND)lParam, WM_SETTEXT, (WPARAM)NULL, (LPARAM)L"正在进行");
                break;
            case IDB_TWO:
                //MessageBox(hwnd, L"您点击了第二个按钮。", L"提示", MB_OK | MB_ICONINFORMATION);
                SendMessage((HWND)lParam, WM_SETTEXT, (WPARAM)NULL, (LPARAM)L"已点击");
                break;
            case IDB_THREE:
                //MessageBox(hwnd, L"您点击了第三个按钮。", L"提示", MB_OK | MB_ICONINFORMATION);
                SendMessage((HWND)lParam, WM_SETTEXT, (WPARAM)NULL, (LPARAM)L"已点击");
                break;
            default:
                return DefWindowProc(hwnd, uMsg, wParam, lParam);
            }
  break;
  case WM_PAINT:
        {
            PAINTSTRUCT ps;//绘图
            BeginPaint(hwnd, &ps);
            SetTextColor(ps.hdc, RGB(20, 50, 255));//颜色
            DrawText(ps.hdc,//输入环境的句柄
                L"c",//输入的字符串
                7,//统计字符串的长度
                &(ps.rcPaint),//指向矩形结构RECT的指针    
                DT_CENTER);//指定文本水平居中显示。
            EndPaint(hwnd, &ps);
        }
  break;
 case WM_DESTROY:
  PostQuitMessage(0);//关闭窗口,如果被拦截就关不了
  break;
 default:
  return DefWindowProc(hwnd, uMsg, wParam, lParam);//调用默认过程函数,刷新窗口
 }
 return 0;
}
}
  • 写回答

3条回答 默认 最新

  • 胸毛男 2021-11-02 11:27
    关注

    一、你需要一个VSPD虚拟串口 添加一对儿短接的串口 发送端连其中一个,接收端连另一个

    img

    二、建设窗口程序, 那个有些复杂,不好操作 ,推荐用这种:
    Visual Studio 用MFC框架下的 弄两个对话框工程 可以先写死COM号。一个打开串口按钮,一个接收文字的文本框。

    img

    img

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 11月11日
  • 已采纳回答 11月3日
  • 创建了问题 11月1日

悬赏问题

  • ¥100 需要跳转番茄畅听app的adb命令
  • ¥50 寻找一位有逆向游戏盾sdk 应用程序经验的技术
  • ¥15 请问有用MZmine处理 “Waters SYNAPT G2-Si QTOF质谱仪在MSE模式下采集的非靶向数据” 的分析教程吗
  • ¥50 opencv4nodejs 如何安装
  • ¥15 adb push异常 adb: error: 1409-byte write failed: Invalid argument
  • ¥15 nginx反向代理获取ip,java获取真实ip
  • ¥15 eda:门禁系统设计
  • ¥50 如何使用js去调用vscode-js-debugger的方法去调试网页
  • ¥15 376.1电表主站通信协议下发指令全被否认问题
  • ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证