发送0x7F 读取 0x79 成功,证明stm32已经进入boot状态
0x7F是用于stm32自我校正波特率的,然后它会回复 0x79 (就是ACK) (PS:0x1F 代表 NACK)
本代码使用的COM2 偶校验
#include "stdafx.h"
int OpenCom(HANDLE *pCom){
HANDLE m_hIDComDev;//串口句柄
DCB dcb = { 0 };
m_hIDComDev = CreateFile("COM2", GENERIC_READ | GENERIC_WRITE, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); //打开串口
if (m_hIDComDev == INVALID_HANDLE_VALUE)
{
printf("打开串口失败!\n");
return 1;
}
//GetCommTimeouts(m_hIDComDev, &CommTimeOuts); //获取串口超时配置
//总超时=时间系数×要求读/写的字符数+时间常量
//读总超时=ReadTotalTimeoutMultiplier×10+ReadTotalTimeoutConstant
COMMTIMEOUTS CommTimeOuts =// 串口超时控制参数
{
50, // 读字符间隔超时时间
1, // 读操作时每字符的时间
50, // 基本的(额外的)读超时时间
2, // 写操作时每字符的时间
10 // 基本的(额外的)写超时时间
};
SetCommTimeouts(m_hIDComDev, &CommTimeOuts); //设置超时
dcb.DCBlength = sizeof(DCB);
GetCommState(m_hIDComDev, &dcb);//
dcb.BaudRate = 115200; //设置波特率
dcb.ByteSize = 8; //设置校验字节
dcb.StopBits = 0; //停止字节1位 0/1 1/1.5 2/2
dcb.Parity = EVENPARITY; //偶校验
if (!SetCommState(m_hIDComDev, &dcb))//设置串口和收发缓冲器的大小
{
DWORD dwError = GetLastError();
CloseHandle(m_hIDComDev);
return 2;
}
if (!SetupComm(m_hIDComDev, 1024, 1024))
{
DWORD dwError = GetLastError();
CloseHandle(m_hIDComDev);
return 3;
}
PurgeComm(m_hIDComDev, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_TXABORT | PURGE_RXABORT);//清收发缓冲器
*pCom = m_hIDComDev;
return 0;
}
int CloseCom(HANDLE Handle)
{
CloseHandle(Handle);
return 1;
}
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hnd;
int ret;
BOOL bReadState;
DWORD writecnt,readcnt;
BYTE test = 0x7F;
BYTE readbuf[1024];
ret = OpenCom(&hnd);
if (ret == 0)
{
BOOL bReadStatus;
printf("打开串口成功\r\n");
WriteFile(hnd, &test, 1, &writecnt, NULL);
bReadState = ReadFile(hnd, readbuf, 1, &readcnt, NULL);
if (bReadState)
{
printf("读取数据成功%X\r\n", readbuf[0]);
}
CloseCom(hnd);
}
return 0;
}