**程序说明:**VSwin32命令控制台程序 调用串口,可以根据自己需要配置串口,完成windows与单片机的数据传输。可作为开发参考使用。
直接先贴代码
//32与单片机通信,差不多成功了
#include
#include
#include
#include
using namespace std;
HANDLE hComm;
OVERLAPPED OverLapped;
COMSTAT Comstat;
DWORD dwCommEvents;
char g_UartRxBuffer[6] = { 0x0d,1,2,3,4,0x0a };
//int g_UartRxBuffer[0] = 0x0d;//
//int g_UartRxBuffer[1] = 99;
//int g_UartRxBuffer[2] = 0;
//int g_UartRxBuffer[3] = 0;
//int g_UartRxBuffer[4] = 99;
//int g_UartRxBuffer[5] = 0x0a;
bool OpenPort(); //打开串口
bool SetupDCB(int rate_arg); //设置DCB
bool SetupTimeout(DWORD ReadInterval, DWORD ReadTotalMultiplier, DWORD
ReadTotalConstant, DWORD WriteTotalMultiplier, DWORD WriteTotalConstant); //设置超时
void ReciveChar(); //接收字符
bool WriteChar(char* szWriteBuffer, DWORD dwSend); //发送字符
bool OpenPort()
{
hComm = CreateFile(L"COM6",//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!此处更改com口!!!!!!!!!!!!!!!
GENERIC_READ | GENERIC_WRITE,
0,
0,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
0);
if (hComm == INVALID_HANDLE_VALUE)
return FALSE;
else
return true;
}
bool SetupDCB(int rate_arg)
{
DCB dcb;
memset(&dcb, 0, sizeof(dcb));
if (!GetCommState(hComm, &dcb))//获取当前DCB配置
{
return FALSE;
}
dcb.DCBlength = sizeof(dcb);
/* ---------- Serial Port Config ------- */
dcb.BaudRate = rate_arg;
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;
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;
if (!SetCommState(hComm, &dcb))
{
return false;
}
else
return true;
}
bool SetupTimeout(DWORD ReadInterval, DWORD ReadTotalMultiplier, DWORD
ReadTotalConstant, DWORD WriteTotalMultiplier, DWORD WriteTotalConstant)
{
COMMTIMEOUTS timeouts;
timeouts.ReadIntervalTimeout = ReadInterval;
timeouts.ReadTotalTimeoutConstant = ReadTotalConstant;
timeouts.ReadTotalTimeoutMultiplier = ReadTotalMultiplier;
timeouts.WriteTotalTimeoutConstant = WriteTotalConstant;
timeouts.WriteTotalTimeoutMultiplier = WriteTotalMultiplier;
if (!SetCommTimeouts(hComm, &timeouts))
{
return false;
}
else
return true;
}
void ReciveChar()
{
bool bRead = TRUE;
bool bResult = TRUE;
DWORD dwError = 0;
DWORD BytesRead = 0;
char RXBuff;
for (;;)
{
bResult = ClearCommError(hComm, &dwError, &Comstat);
if (Comstat.cbInQue == 0)
continue;
if (bRead)
{
bResult = ReadFile(hComm, //通信设备(此处为串口)句柄,由CreateFile()返回值得到
&RXBuff, //指向接收缓冲区
1, //指明要从串口中读取的字节数
&BytesRead, //
&OverLapped); //OVERLAPPED结构
std::cout |