上位机发送数据给下位机

本文详细描述了使用C++编写的上位机程序如何通过COM5与单片机进行串口通信,包括创建串口连接、设置参数、数据发送以及单片机接收和处理数据的过程,同时提及了使用HAL库中的函数操作UART接口。
摘要由CSDN通过智能技术生成

1.这里的上位机是c++语言写的

#include <iostream>
#include <Windows.h>

int main()
{
    HANDLE serialPort = CreateFile("COM5", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
    //尝试打开一个串行端口(COM5)来建立一个与该串行端口的连接
    if (serialPort == INVALID_HANDLE_VALUE) {
        std::cerr << "Error: Could not open serial port." << std::endl;
        return 1;
    }//判断是否打开了串口

    DCB dcbSerialParams = { 0 };
    dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
    dcbSerialParams.BaudRate = CBR_9600; // 设置波特率
    dcbSerialParams.ByteSize = 8;
    dcbSerialParams.StopBits = ONESTOPBIT;
    dcbSerialParams.Parity = NOPARITY;

    SetCommState(serialPort, &dcbSerialParams);

    // 发送数据给单片机
    const char dataToSend[] = "okokok\r\n";
    DWORD bytesWritten;
    WriteFile(serialPort, dataToSend, sizeof(dataToSend), &bytesWritten, NULL);

    std::cout << "Data sent to MCU: " << dataToSend << std::endl;

    // 关闭串口
    CloseHandle(serialPort);

    return 0;
}

2.单片机接收串口打印的数据

下面的代码是hal库生成的while循环里的,由于上位机发送数据给下位机时占用串口5,所以延时5s打印,在这5s里需要尽快打开串口。

while (1)
{
		uint8_t data;
    uint16_t index = 0;

    /* 接收数据 */
    while (1)
			{
        if(HAL_UART_Receive(&huart1, &data, 1, HAL_MAX_DELAY) == HAL_OK) 
					{
            if (data == '\n' || data == '\r') 
							{ // 判断是否接收到换行符或回车符
                buffer[index] = '\0'; // 在字符串末尾加上结束符
                break; // 结束接收
							}
            else 
							{
                buffer[index] = data; // 将接收到的字符存入缓冲区
                index++;
							}
					}
			}
		HAL_Delay(3000); // 每隔1秒进行一次数据接收和处理
		HAL_UART_Transmit(&huart1, (uint8_t *)buffer, strlen(buffer), HAL_MAX_DELAY);
    HAL_UART_Transmit(&huart1, (uint8_t *)"\r\n", 2, HAL_MAX_DELAY); // 打印回车换行
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值