本来开始使用boost::asio::serial的库发送数据,已发送到stm32单片机就跑飞了,最终还是选择了原生的Windows API
void WritSerialData(string data)
{
HANDLE hComm;
CString com;
CString filename;
boost::asio::io_service service;
m_serial_list.GetWindowTextW(com);
m_file_name.GetWindowText(filename);
hComm = CreateFile(com,
GENERIC_READ | GENERIC_WRITE,
0,
0,
OPEN_EXISTING,
NULL,
0);
if (hComm != INVALID_HANDLE_VALUE)
{
DCB dcb;
int rate = 115200;
memset(&dcb, 0, sizeof(dcb));//在一段内存块中填充某个给定的值,是对较大的结构//体或数组进行清零操作的一种最快方法
//if (!GetCommState(hComm, &dcb))//获取当前DCB配置
// return FALSE;
// set DCB to configure the serial port
dcb.DCBlength = sizeof(dcb);
/* ---------- Serial Port Config ------- */
dcb.BaudRate = rate;
dcb.Parity = NOPARITY;
dcb.fParity = 0;
dcb.StopBits = ONESTOPBIT;
dcb.ByteSize = 8;
dcb.fOutxCtsFlow = 0;
dcb.fOutxDsrFlow = 0;
dcb.fDtrControl = DTR_CONTROL_DISABLE;
dcb.fDsrSensitivity = 0;
dcb.fRtsControl = RTS_CONTROL_DISABLE;
dcb.fOutX = 0;
dcb.fInX = 0;
/* ----------------- misc parameters ----- */
dcb.fErrorChar = 0;
dcb.fBinary = 1;
dcb.fNull = 0;
dcb.fAbortOnError = 0;
dcb.wReserved = 0;
dcb.XonLim = 2;
dcb.XoffLim = 4;
dcb.XonChar = 0x13;
dcb.XoffChar = 0x19;
dcb.EvtChar = 0;
// set DCB
SetCommState(hComm, &dcb);
unsigned long relen = 0;
WriteFile(hComm, data.c_str(), data.size(), &relen, NULL);
DWORD err = GetLastError();
CloseHandle(hComm);
}
}