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); // 打印回车换行
}