有很多人遇到串口事件触发(我理解是中断)时只能接收8个字节,这是由于串行通信相对于并行通信时间比较长,所以传输时间必须要考虑在内,有的人的解决方法是把SetRThreshold()内的值设置大一点,但是这样只能用于已知要接收数据的长度,因为对你当你接收数据不到那么多,他不会触发mscomm事件,另外一种解决方法是延时,当你第一次进入事件时串口只给你提供8个字节的数据,当第二次进入mscomm事件后串口才会把8个字节以外的数据传上来!当然这必须要延时一段时间,因为你在进入第一次mscomm事件时,其实串口的数据还在传送,第一次里面的8个字节相当于一个提纲,告诉你有数据过来了!
void CMyGateDlg::OnOnCommMscommGate()
{
// TODO: Add your control notification handler code here
VARIANT input1; //定义VARIANT类型变量
BYTE rxdata[1024]; //定义存放二进制数据的数组
long len1,k;
COleSafeArray safearray1; //定义COleSafeArray类的实例
CString strDis="";
switch(myComm_Gate.GetCommEvent())
{
case 2:
{ //收到 RThreshold 个字符
//添加接收处理代码
input1=myComm_Gate.GetInput();
//将VARAIANT变量赋值给COleSafeArray类的实例
safearray1=input1; //使用COleSafeArray类的成员函数获取数据长度
len1=safearray1.GetOneDimSize();
for(k=0;k<len1;k++)
{ //使用COleSafeArray类的成员函数将数据写入数组
safearray1.GetElement(&k,rxdata+k);
}
break;
}
}
if ((rxdata[0]==42) && (rxdata[3]==69)) //删除命令
{
m_DeleteOk=true;
}
if ((rxdata[0]==42) && (rxdata[3]==67)) //添加命令
{
m_AddOk=true;
m_AddId[0]=rxdata[4];
m_AddId[1]=rxdata[5];
m_AddId[2]=rxdata[6];
m_AddId[3]=rxdata[7];
}
if(mycom_count==1) //接收大于8字节的数据
{
mycom_count=0;
unsigned char temp_time;
for(int j=0; j<4; j++)
{
m_Refresh_Time[0][j]=rxdata[j];
temp_time=m_Refresh_Time[0][j];
m_Refresh_Time[0][j]=m_Refresh_Time[0][j]>>4;//获得10位
m_Refresh_Time[0][j]=m_Refresh_Time[0][j]*10;
temp_time=temp_time&15; //个位
m_Refresh_Time[0][j]=m_Refresh_Time[0][j]+temp_time;
}
for(int i=1; i<3; i++)
{
for(int j=0; j<4; j++)
{
m_Refresh_Id[i][j]=rxdata[(i-1)*8+j+4];
m_Refresh_Time[i][j]=rxdata[(i-1)*8+j+4+4];
//将接收到的16进制的时间转换成对应的十进制时间
//如将16进制27转换成10进制的27即BCD码
temp_time=m_Refresh_Time[i][j];
m_Refresh_Time[i][j]=m_Refresh_Time[i][j]>>4;//获得十位
m_Refresh_Time[i][j]=m_Refresh_Time[i][j]*10;
temp_time=temp_time&15; //个位
m_Refresh_Time[i][j]=m_Refresh_Time[i][j]+temp_time;
}
}
}
if ((rxdata[0]==42) && (rxdata[3]==66)) //更新用户进入时间
{
m_Refresh=true;
for(int j=0; j<4; j++)
{
m_Refresh_Id[0][j]=rxdata[j+4];
}
mycom_count++;
Sleep(1000); //*用于延时很重要读第二次的数据
}
if ((rxdata[0]==42) && (rxdata[3]==70)) //通信结束命令
{
m_Refresh_End=true;
}
}