MFC串口接收数据
使用MSComm控件串口接收数据,如何接受正确的一串数据,SetRThreshold(a)不知道怎么设置,如果是1,数据为66AB06111111的话,总是先接收66,第...
使用MSComm控件串口接收数据,如何接受正确的一串数据,SetRThreshold(a)不知道怎么设置,如果是1,数据为66 AB 06 11 11 11的话,总是先接收66,第二次接收AB 06 11 11 11,06是长度。如果把a设置大一点的话,接收数据长度又不是一定的,如a为6,这样当数据为66 AB 07 11 11 11 FF就有问题,数据头都是66 AB,怎样接收串口数据,读取缓冲区,请教,急·······
展开
展开全部
使用MSComm控件串口接收数据,一般设置成SetRThreshold(1);
//参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件
并且串口每次接收到的数据个数是不确定的,如果你自己确定需要接收到多少个数据的话,就好办了。
//全局变量
BYTE Comm_Packet_Len; //需要接收到的数据个数
BYTE Comm_DataBuffer[20]; //依次存放串口接收到的数据
long Comm_Packet_Index; //每次收到数据个数,并标志数据应放在全局数组位置的索引
//每次处理完数据后清空,为下一次接收做准备
void CEOLDlg::OnMscomm()
{
// TODO: Add your control notification handler code here
VARIANT variant_inp;
COleSafeArray safearray_inp;
long len=0, k=0; //转换为数组时使用的变量
BYTE rxdata[204]; //设置BYTE数组 An 8-bit integerthat is not signed.
CString strtemp; //字符型变量
int temp = 0; //临时变量
unsigned char ecuchecksum = 0; //ecu回传校验码
if(m_ctrlComm.GetCommEvent() == 2) //事件值为2表示接收缓冲区内有字符
{ //以下你可以根据自己的通信协议加入处理代码
variant_inp = m_ctrlComm.GetInput();//读缓冲区
safearray_inp = variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len = safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k = 0; k < len; k++) //将ColeSafeArray型变量转换为BYTE型数组
{
safearray_inp.GetElement(&k, rxdata + k);//转换为BYTE型数组
}
for(temp = 0; temp < len; temp++)
{
Comm_DataBuffer[Comm_Packet_Index + temp] = rxdata[temp];
}
Comm_Packet_Index += len;
if(Comm_Packet_Index == Comm_Packet_Len)//接收到的数据个数等于
{
//处理接收到的数据
}
}
}
//参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件
并且串口每次接收到的数据个数是不确定的,如果你自己确定需要接收到多少个数据的话,就好办了。
//全局变量
BYTE Comm_Packet_Len; //需要接收到的数据个数
BYTE Comm_DataBuffer[20]; //依次存放串口接收到的数据
long Comm_Packet_Index; //每次收到数据个数,并标志数据应放在全局数组位置的索引
//每次处理完数据后清空,为下一次接收做准备
void CEOLDlg::OnMscomm()
{
// TODO: Add your control notification handler code here
VARIANT variant_inp;
COleSafeArray safearray_inp;
long len=0, k=0; //转换为数组时使用的变量
BYTE rxdata[204]; //设置BYTE数组 An 8-bit integerthat is not signed.
CString strtemp; //字符型变量
int temp = 0; //临时变量
unsigned char ecuchecksum = 0; //ecu回传校验码
if(m_ctrlComm.GetCommEvent() == 2) //事件值为2表示接收缓冲区内有字符
{ //以下你可以根据自己的通信协议加入处理代码
variant_inp = m_ctrlComm.GetInput();//读缓冲区
safearray_inp = variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len = safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k = 0; k < len; k++) //将ColeSafeArray型变量转换为BYTE型数组
{
safearray_inp.GetElement(&k, rxdata + k);//转换为BYTE型数组
}
for(temp = 0; temp < len; temp++)
{
Comm_DataBuffer[Comm_Packet_Index + temp] = rxdata[temp];
}
Comm_Packet_Index += len;
if(Comm_Packet_Index == Comm_Packet_Len)//接收到的数据个数等于
{
//处理接收到的数据
}
}
}
展开全部
SetRThreshold(a)是用来设置触发一次OnComm事件的最小数据长度,即串口至少要接收a个字节,才会通知你有串口数据。这个相信楼主已经明白了。那就是怎样接收串口数据的问题喽。建议你用ReadFile函数,1字节1字节的读。举例如下:
int recvlen = 0;
while (recvlen < 1024)
{
ReadFile(hCommPort,&RxBuf[recvlen],1,&dwRdBk,NULL);
if(dwRdBk != 1)
break;
recvlen++;
}
int recvlen = 0;
while (recvlen < 1024)
{
ReadFile(hCommPort,&RxBuf[recvlen],1,&dwRdBk,NULL);
if(dwRdBk != 1)
break;
recvlen++;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询