关于高速读取串口

hnicypb 2013-12-18 10:31:40
现有一工作要高速读取串口 大概1秒收到30-40组数据 ,每组数据大概20个字节

目前的问题是,使用WaitCommEvent经常是一次性读到 十几二组数据。

我想收到一组读一组,该怎么解决呢?

参数设置也没效果啊

谢谢
...全文
146 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
hnicypb 2013-12-18
  • 打赏
  • 举报
回复
因为串口发上的数据有一定的格式。我现在这样处理。但是如果下位机要是发送太快就可能出现还没收完,下一帧又来了 下位机数据格式 55 AA 81 01 51 00 0C 31 02 FF 01 00 07 00 04 45 1D 48 31 帧头 效验位 数据长度 数据段 有时候就读到数据变成了 55 AA 81 01 51 00 0C 31 02 55 AA 81 01 51 00 0C 31 02 FF 红色的应该是下一帧的内容

//串口读线程函数
DWORD CSeries::ReadThreadFunc(LPVOID lparam)
{
	CSeries *ceSeries = (CSeries*)lparam;

	BYTE * pBufReadData = new BYTE[1];
	ZeroMemory(pBufReadData,1);
	BYTE * pBufHeadData = new BYTE[4];
	ZeroMemory(pBufHeadData,4);

	BYTE * pBufRecv = new BYTE[MAX_CMD_SIZE];
	ZeroMemory(pBufRecv,MAX_CMD_SIZE);

	while (TRUE)
	{
		ZeroMemory(pBufReadData,1);
		ZeroMemory(pBufHeadData,4);
		ZeroMemory(pBufRecv,MAX_CMD_SIZE);

		DWORD dwActualReadLen = 0;	//每次读取到的实际长度
		DWORD dwRecvLen = 0;		//读取到的数据总长度
		DWORD dwDataLen = 0;		//数据帧长度

		//读命令帧头
		while(TRUE)
		{
			ReadFile(ceSeries->m_hComm, pBufReadData, 1, &dwActualReadLen,0);

			if (dwActualReadLen != 1)
				continue;

			pBufHeadData[0] = pBufHeadData[1];
			pBufHeadData[1] = pBufHeadData[2];
			pBufHeadData[2] = pBufHeadData[3]; 
			pBufHeadData[3] = pBufReadData[0];

			if (pBufHeadData[0] == 0x55 && pBufHeadData[1] == 0xAA &&
				pBufHeadData[2] == 0x81 && pBufHeadData[3] == 0x01)
			{
				memcpy(pBufRecv,pBufHeadData,4);
				dwRecvLen = 4;
				break;
			}						
		}

		//如果读数据帧失败,直接返回超时
		while(TRUE)
		{		
			ReadFile(ceSeries->m_hComm, pBufReadData, 1, &dwActualReadLen,0);
			if (dwActualReadLen != 1)
				continue;

			//每次读取一个字节,并保存
			memcpy(pBufRecv + dwRecvLen,pBufReadData,1);
			dwRecvLen++;

			//计算数据帧长度
			if(dwRecvLen == 7)
				dwDataLen = pBufRecv[5]*0100 + pBufRecv[6];

			//读取完成退出循环
			if (dwRecvLen == 7+dwDataLen)
				break;		
		}

		ceSeries->m_OnSeriesRead(pBufRecv,dwRecvLen);

	}

	delete pBufRecv;
	pBufRecv = NULL;

	delete pBufHeadData;
	pBufHeadData = NULL;

	delete pBufReadData;
	pBufReadData = NULL;

}

hnicypb 2013-12-18
  • 打赏
  • 举报
回复
引用 3 楼 qian_longN1 的回复:
高速……太高了 为什么不是有数据就读,读到后自己分组处理呗,数据放在那想什么时候处理就什么时候处理,怎么分组什么时候处理都可以你自己控制啊
有数据就读怎么操作
qian_longN1 2013-12-18
  • 打赏
  • 举报
回复
高速……太高了 为什么不是有数据就读,读到后自己分组处理呗,数据放在那想什么时候处理就什么时候处理,怎么分组什么时候处理都可以你自己控制啊
schlafenhamster 2013-12-18
  • 打赏
  • 举报
回复
使用 1024字节 的循环队列来 接受数据。
洗洗睡去 2013-12-18
  • 打赏
  • 举报
回复
800个字节 不算高速吧 用的什么控件?mscomm有个缓冲区大小设置成一组的大小,满了就触发消息
hnicypb 2013-12-18
  • 打赏
  • 举报
回复
呃,浪费大家时间 是我UI上刷新数据占用了时间。跟串口无关

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧