高分求解,关于串口通信(win32 api)的问题
为什么我的程序读串口的数据的时候,只能一次8字节的读取
我的程序:
//打开串口,串口设置,以及打开监视线程
int CVc_demoDlg::m_fnStartReceive()
{
DCB dcb;
COMMTIMEOUTS timeouts;
//打开串口
m_hCom = CreateFile( "COM2", //端口
GENERIC_READ | GENERIC_WRITE, // 允许读写
0, //share mode
NULL, //security attribute
OPEN_EXISTING, //打开方式
FILE_ATTRIBUTE_NORMAL, //准备异步通信
NULL );
m_pData.m_hComm = m_hCom;//准备把串口句柄传给线程
//设置串口参数
dcb.DCBlength = sizeof(DCB);
GetCommState(m_hCom,&dcb);
GetCommTimeouts(m_hCom,&timeouts);
timeouts.ReadIntervalTimeout = 0xFFFFFFFF;
timeouts.ReadTotalTimeoutMultiplier = 0;
timeouts.ReadTotalTimeoutConstant = 5000;
timeouts.WriteTotalTimeoutMultiplier = 0;
timeouts.WriteTotalTimeoutConstant = 5000;
SetCommTimeouts(m_hCom,&timeouts);
dcb.BaudRate = 9600;
dcb.fParity = NOPARITY;
dcb.ByteSize = 8;
dcb.StopBits = ONESTOPBIT;
SetCommState(m_hCom,&dcb);
SetupComm(m_hCom,4096,4096);
SetCommMask(m_hCom,EV_RXCHAR);
//启动线程
m_pWatchThread = AfxBeginThread(CommWatchProc,
&m_pData,
THREAD_PRIORITY_BELOW_NORMAL,
0,
CREATE_SUSPENDED,
NULL);
m_pWatchThread->m_bAutoDelete = TRUE;
m_pWatchThread->ResumeThread();
return 0;
}
//监视线程
UINT CommWatchProc( LPVOID pParam )
{
DWORD dwEvent=0;
COMSTAT ComStat;
DWORD dwBytesRead,dwError;
char * pData;
CReceiveData * p = (CReceiveData *)pParam;
pData = p->m_pData;
while (g_fReceiveFlag)//g_fReceiveFlag全局变量,决定是否监视
{
if (p->m_hComm == NULL) return -1;
WaitCommEvent(p->m_hComm,&dwEvent,NULL);
if (dwEvent & EV_RXCHAR)
{
ClearCommError(p->m_hComm,&dwError,&ComStat);
dwBytesRead = ComStat.cbInQue;
if (dwBytesRead > 0)
{
if (!ReadFile(p->m_hComm,pData,dwBytesRead,&dwBytesRead,NULL))
{
dwBytesRead = 0;
}
if (dwBytesRead > 0)
{
SendMessage(p->m_hWnd,WM_NOTIFYRECEIVE,
dwBytesRead,(LONG)(char *)p->m_pData);
}
PurgeComm(p->m_hComm,PURGE_TXABORT | PURGE_RXABORT |
PURGE_TXCLEAR | PURGE_RXCLEAR);
}
}
}
if (p->m_hComm) CloseHandle(p->m_hComm);
return 0;
}
//线程参数的类
class CReceiveData :public CObject
{
public:
HWND m_hWnd;//窗口句柄
HANDLE m_hComm;//打开的串口的句柄
char * m_pData;//接收数据的缓冲区,初始化的时候指向char * data[1000]
};
/////////
上面我的程序在下位程序通过串口一次性发送100字节的数据过来时,监视线程中的ClearCommError(p->m_hComm,&dwError,&ComStat);每次都置ComStat.cbInQue为8,在线程的循环内ReadFile要读多次才能把100字节读取完,怎么才能让监视线程在一次循环之内把我下位程序发送的100字节全部读取完?????
我的程序:
//打开串口,串口设置,以及打开监视线程
int CVc_demoDlg::m_fnStartReceive()
{
DCB dcb;
COMMTIMEOUTS timeouts;
//打开串口
m_hCom = CreateFile( "COM2", //端口
GENERIC_READ | GENERIC_WRITE, // 允许读写
0, //share mode
NULL, //security attribute
OPEN_EXISTING, //打开方式
FILE_ATTRIBUTE_NORMAL, //准备异步通信
NULL );
m_pData.m_hComm = m_hCom;//准备把串口句柄传给线程
//设置串口参数
dcb.DCBlength = sizeof(DCB);
GetCommState(m_hCom,&dcb);
GetCommTimeouts(m_hCom,&timeouts);
timeouts.ReadIntervalTimeout = 0xFFFFFFFF;
timeouts.ReadTotalTimeoutMultiplier = 0;
timeouts.ReadTotalTimeoutConstant = 5000;
timeouts.WriteTotalTimeoutMultiplier = 0;
timeouts.WriteTotalTimeoutConstant = 5000;
SetCommTimeouts(m_hCom,&timeouts);
dcb.BaudRate = 9600;
dcb.fParity = NOPARITY;
dcb.ByteSize = 8;
dcb.StopBits = ONESTOPBIT;
SetCommState(m_hCom,&dcb);
SetupComm(m_hCom,4096,4096);
SetCommMask(m_hCom,EV_RXCHAR);
//启动线程
m_pWatchThread = AfxBeginThread(CommWatchProc,
&m_pData,
THREAD_PRIORITY_BELOW_NORMAL,
0,
CREATE_SUSPENDED,
NULL);
m_pWatchThread->m_bAutoDelete = TRUE;
m_pWatchThread->ResumeThread();
return 0;
}
//监视线程
UINT CommWatchProc( LPVOID pParam )
{
DWORD dwEvent=0;
COMSTAT ComStat;
DWORD dwBytesRead,dwError;
char * pData;
CReceiveData * p = (CReceiveData *)pParam;
pData = p->m_pData;
while (g_fReceiveFlag)//g_fReceiveFlag全局变量,决定是否监视
{
if (p->m_hComm == NULL) return -1;
WaitCommEvent(p->m_hComm,&dwEvent,NULL);
if (dwEvent & EV_RXCHAR)
{
ClearCommError(p->m_hComm,&dwError,&ComStat);
dwBytesRead = ComStat.cbInQue;
if (dwBytesRead > 0)
{
if (!ReadFile(p->m_hComm,pData,dwBytesRead,&dwBytesRead,NULL))
{
dwBytesRead = 0;
}
if (dwBytesRead > 0)
{
SendMessage(p->m_hWnd,WM_NOTIFYRECEIVE,
dwBytesRead,(LONG)(char *)p->m_pData);
}
PurgeComm(p->m_hComm,PURGE_TXABORT | PURGE_RXABORT |
PURGE_TXCLEAR | PURGE_RXCLEAR);
}
}
}
if (p->m_hComm) CloseHandle(p->m_hComm);
return 0;
}
//线程参数的类
class CReceiveData :public CObject
{
public:
HWND m_hWnd;//窗口句柄
HANDLE m_hComm;//打开的串口的句柄
char * m_pData;//接收数据的缓冲区,初始化的时候指向char * data[1000]
};
/////////
上面我的程序在下位程序通过串口一次性发送100字节的数据过来时,监视线程中的ClearCommError(p->m_hComm,&dwError,&ComStat);每次都置ComStat.cbInQue为8,在线程的循环内ReadFile要读多次才能把100字节读取完,怎么才能让监视线程在一次循环之内把我下位程序发送的100字节全部读取完?????
...全文
相关推荐
串口通信关于串口找不到的问题
javacomm20-win32.zip 文件是一个Java通信API,它提供了串口通信的功能。
用VC打造自己的串口调试工具ComTest:从底层通信到协议解析
串口通信是嵌入式开发中最基础也最常用的数据交互方式,调试时离不开串口调试助手这类工具。然而通用工具在动态调整波特率、帧解析、自动应答等场景下往往不够顺手。实现一个稳定高效的串口调试工具,需要理解Windows下串口通信的基本原理,包括CreateFile设备访问、DCB参数配置、COMMTIMEOUTS超时控制以及重叠IO和接收线程的事件驱动机制。同时,数据展示与协议解析能力直接决定调试效率,通过帧拆分、时间戳标注、校验计算和DLL插件化,可以让工具适配多种设备协议。该工具适用于STM32等嵌入式板卡调试、
win32 api串口通信
Win32 API串口通信"是Windows操作系统下利用系统提供的API函数来实现串行端口的编程技术。本文将深入探讨串口通信的基本概念、Win32 API中的相关函数以及如何进行实际的串口设置。
WIN32 API实现基于对话框的串口通信呈现
在Windows编程领域,WIN32 API是开发人员用于构建应用程序的基础接口。本教程将深入讲解如何使用WIN32 API来实现一个基于对话框的串口通信应用,这为初学者提供了一个良好的学习起点。
Win32串口通信实例
这个"Win32Port"压缩包文件很可能包含了实现上述功能的源代码示例。通过分析和学习这个实例,你可以更深入地理解Win32 API在串口通信中的应用,并能应用于自己的项目中。


硬件/系统
