God_me_1 2023-04-24 18:04 采纳率: 0%
浏览 27

C++ Builder 2010 怎么进行通讯

1.C++ Builder 2010 怎么编写通讯温湿度计的代码,通讯接口用USB/WiFi形式
2.怎么采集数据

  • 写回答

1条回答 默认 最新

  • 凉云生烟 全栈领域新星创作者 2023-04-24 18:44
    关注

    哈喽你好呀! 这里给出包括了USB和WiFi两种通讯接口的实现的两种示例代码,这里用到了TComPort组件实现串口通讯、Indy组件实现网络通讯等。
    1.USB通讯接口示例代码:

    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    #include <stdio.h>
    
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    
    HANDLE hComm;
    DCB dcb;
    COMMTIMEOUTS timeouts;
    
    void OpenSerialPort()
    {
        AnsiString portName = "COM1"; // 指定串口号
        hComm = CreateFile(portName.c_str(), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
        if (hComm == INVALID_HANDLE_VALUE) {
            ShowMessage("无法打开串口!");
            return;
        }
    
        if (!GetCommState(hComm, &dcb)) {
            ShowMessage("获取串口状态失败!");
            CloseHandle(hComm);
            return;
        }
    
        dcb.BaudRate = CBR_9600; // 波特率
        dcb.ByteSize = 8;        // 数据位
        dcb.Parity   = NOPARITY; // 校验位
        dcb.StopBits = ONESTOPBIT; // 停止位
    
        if (!SetCommState(hComm, &dcb)) {
            ShowMessage("设置串口状态失败!");
            CloseHandle(hComm);
            return;
        }
    
        timeouts.ReadIntervalTimeout         = MAXDWORD;
        timeouts.ReadTotalTimeoutMultiplier  = 0;
        timeouts.ReadTotalTimeoutConstant    = 0;
        timeouts.WriteTotalTimeoutMultiplier = 1000;
        timeouts.WriteTotalTimeoutConstant   = 1000;
    
        if (!SetCommTimeouts(hComm, &timeouts)) {
            ShowMessage("设置串口超时时间失败!");
            CloseHandle(hComm);
            return;
        }
    
        ShowMessage("串口打开成功!");
    }
    
    void CloseSerialPort()
    {
        CloseHandle(hComm);
        ShowMessage("串口已关闭!");
    }
    
    void ReadSerialData(char *buf, int len)
    {
        DWORD dwBytesRead;
        if (!ReadFile(hComm, buf, len, &dwBytesRead, NULL)) {
            ShowMessage("读取串口数据失败!");
            return;
        }
    }
    
    #pragma argsused
    void __fastcall TForm1::btnOpenSerialClick(TObject *Sender)
    {
        OpenSerialPort();
    }
    
    #pragma argsused
    void __fastcall TForm1::btnCloseSerialClick(TObject *Sender)
    {
        CloseSerialPort();
    }
    
    #pragma argsused
    void __fastcall TForm1::btnReadDataClick(TObject *Sender)
    {
        char buf[128];
        ReadSerialData(buf, sizeof(buf));
        Memo1->Lines->Add(AnsiString(buf));
    }
    
    

    在示例代码中,OpenSerialPort函数用于打开COM1端口,并设置波特率、数据位、校验位和停止位等参数;CloseSerialPort函数用于关闭串口;ReadSerialData函数用于从串口读取数据。具体使用时可以在按钮的单击事件中调用相应的函数。

    2.WiFi通讯接口示例代码:

    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    #include <stdio.h>
    #include <IdTCPClient.hpp>
    #include <IdTCPConnection.hpp>
    
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    
    AnsiString serverIP = "192.168.1.100"; // 指定服务器IP
    int portNumber = 1234;                 // 指定端口号
    
    void ConnectToServer()
    {
        TIdTCPClient *tcpClient = new TIdTCPClient(Form1);
        tcpClient->Host = serverIP;
        tcpClient->Port = portNumber;
        try {
            tcpClient->Connect();
        }
        catch (...) {
            ShowMessage("连接服务器失败!");
            return;
        }
    
        ShowMessage("连接服务器成功!");
    
        tcpClient->Disconnect();
        delete tcpClient;
    }
    
    #pragma argsused
    void __fastcall TForm1::btnConnectClick(TObject *Sender)
    {
        ConnectToServer();
    }
    

    在示例代码中,ConnectToServer函数用于建立TCP连接并连接到指定的服务器;同时,在按钮单击事件中调用该函数即可进行测试。需要注意的是,通讯温湿度计的实现方式因设备接口和协议不同而异。对于USB接口的设备,可以使用Windows API函数进行串口通讯;而对于WiFi接口的设备,则需要使用网络通讯协议。

    评论

报告相同问题?

问题事件

  • 创建了问题 4月24日

悬赏问题

  • ¥15 matlab数据降噪处理,提高数据的可信度,确保峰值信号的不损失?
  • ¥15 怎么看我在bios每次修改的日志
  • ¥15 python+mysql图书管理系统
  • ¥15 Questasim Error: (vcom-13)
  • ¥15 船舶旋回实验matlab
  • ¥30 SQL 数组,游标,递归覆盖原值
  • ¥15 为什么我的数据接收的那么慢呀有没有完整的 hal 库并 代码呀有的话能不能发我一份并且我用 printf 函数显示处理之后的数据,用 debug 就不能运行了呢
  • ¥20 gitlab 中文路径,无法下载
  • ¥15 用动态规划算法均分纸牌
  • ¥30 udp socket,bind 0.0.0.0 ,如何自动选取用户访问的服务器IP来回复数据